python - 从python调用url时获取 ‘wrong’页面源

标签 python html url web-scraping

尝试从网站检索页面源代码时,我得到的文本与通过网络浏览器查看相同页面源代码时完全不同(且更短)。

https://stackoverflow.com/questions/24563601/python-getting-a-wrong-source-code-of-the-web-page-asp-net

这个家伙有一个相关的问题,但获得了主页源而不是请求的源 - 我得到了一些完全陌生的东西。

代码是:

from urllib import request

def get_page_source(n):
    url = 'https://www.whoscored.com/Matches/' + str(n) + '/live'
    response = request.urlopen(url)
    return str(response.read())

n = 1006233
text = get_page_source(n)

这是我在此示例中定位的页面: https://www.whoscored.com/Matches/1006233/live

有问题的 url 在页面源中包含丰富的信息,但在运行上面的代码时我最终只得到以下内容:

文字=

b'<html style="height:100%"><head><META NAME="ROBOTS" CONTENT="NOINDEX,
NOFOLLOW"><meta name="format-detection" content="telephone=no"><meta 
name="viewport" content="initial-scale=1.0"><meta http-equiv="X-
UA-Compatible" content="IE=edge,chrome=1"></head><body style="margin:0px;
height:100%"><iframe src="/_Incapsula_Resource?CWUDNSAI=24&
xinfo=0-12919260-0 0NNY RT(1462118673272 111) q(0 -1 -1 -1) r(0 -1) 
B12(4,315,0) U2&incident_id=276000100045095595-100029307305590944&edet=12&
cinfo=04000000" frameborder=0 width="100%" height="100%" marginheight="0px" 
marginwidth="0px">Request unsuccessful. Incapsula incident ID: 
276000100045095595-100029307305590944</iframe></body></html>'

这里出了什么问题?服务器是否可以检测到机器人,即使它没有发送重复请求 - 如果是,如何 - 是否有解决办法?

最佳答案

这里有几个问题。根本原因是您要抓取的网站知道您不是真人,因此阻止了您。许多网站只是通过检查 header 来查看请求是否来自浏览器(机器人)来做到这一点。然而,这个网站看起来他们使用的是 Incapsula,旨在提供更复杂的保护。您可以尝试以不同方式设置您的请求,以通过设置 header 来欺骗页面上的安全性 - 但我怀疑这是否可行。

import requests

def get_page_source(n):
    url = 'https://www.whoscored.com/Matches/' + str(n) + '/live'
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    response = requests.get(url, headers=headers)
    return response.text

n = 1006233
text = get_page_source(n)
print text

看起来该网站还使用验证码 - 旨在防止网络抓取。如果一个网站如此努力地防止抓取 - 很可能是因为他们提供的数据是专有的。我会建议寻找另一个提供此数据的网站 - 或者尝试使用官方 API。

查看此 ( https://stackoverflow.com/a/17769971/701449) 不久前的回答。看起来 whoscored.com 使用 OPTA API 来提供信息。您或许可以跳过中间人,直接找到数据源。祝你好运!

关于python - 从python调用url时获取 ‘wrong’页面源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36971604/

相关文章:

python - 尝试运行一组计算但遇到溢出错误

javascript - 尝试向 jQuery 对象添加 HTML 类属性

javascript - SlickNav 菜单,每个 li 都有特定的颜色背景?

http - URL中的 '@'是什么意思?

javascript - 以编程方式将单个事件监听器添加到多个 div 会导致所有受影响的 div 上出现相同的函数

python - LSTM 模型不会预测高于特定值的值(始终不相同的值)

python - 在 Pandas 的列上应用 lambda

python - pandas 中 resample 和 asfreq 的不同行为

javascript - 使用 JS 在单击时更改 DIV z-index 并返回原始值

jQuery 从 url 哈希中查找属性