Python请求并没有给我与浏览器相同的HTML

obs*_*kyr 15 python browser python-requests

我正在使用Python请求抓取一个Wikia页面.但是有一个问题:请求请求并没有给我相同的HTML,因为我的浏览器使用相同的页面.

为了比较,这里是Firefox给我的页面,这里是页面请求提取(下载它们以查看 - 抱歉,没有简单的方法可以从另一个站点直观地托管一些HTML).

你会注意到一些差异(超级不友好的差异).有一些小东西,比如beinig以不同的顺序排序等等,但也有一些非常非常大的东西.最重要的是缺少最后六个<img>,以及整个导航和页脚部分.即使在原始HTML中,它看起来像页面突然切断.

为什么会发生这种情况,有没有办法解决它?我已经想到了很多东西,其中没有一个是富有成效的:

  • 请求标头干扰?不,我尝试将我的浏览器发送的标题复制User-Agent到请求请求中,并且1:1,但没有任何改变.
  • 加载HTML后JavaScript加载内容?罗.即使禁用了JS,Firefox也给了我"好"的页面.
  • 呃......好吧......还有什么呢?

如果你知道这可能发生的方式并找到解决方法,那就太棒了.谢谢!

Alo*_*man 5

我建议您不要在请求中发送正确的标头(或发送错误的标头)。这就是为什么你会得到不同的内容。以下是带有标头的 HTTP 请求的示例:

url = 'https://www.google.co.il/search?q=eminem+twitter'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'

# header variable
headers = { 'User-Agent' : user_agent }

# creating request
req = urllib2.Request(url, None, headers)

# getting html
html = urllib2.urlopen(req).read()
Run Code Online (Sandbox Code Playgroud)

如果您确定发送了正确的标头,但仍然收到不同的 html。您可以尝试使用。它将允许您直接使用浏览器(如果您的计算机没有 GUI,则可以使用phantomjs )。使用selenium,您将能够直接从浏览器获取html。


小智 5

我有一个类似的问题:

  • 与Python和浏览器相同的标头
  • JavaScript绝对排除了原因

为了解决这个问题,我最终换掉了urllib.request请求库.

基本上,我换了:

import requests

session = requests.Session()
r = session.get(URL)
Run Code Online (Sandbox Code Playgroud)

有:

import urllib.request

r = urllib.request.urlopen(URL)
Run Code Online (Sandbox Code Playgroud)

然后它奏效了.

也许其中一个图书馆在幕后做了一些奇怪的事情?不确定这是否是你的选择.


Vas*_*kis 0

我看到的许多差异表明内容仍然存在,只是以不同的顺序呈现,有时具有不同的间距。

您可能会根据多种不同的事物收到不同的内容:

  • 你的标题
  • 您的用户代理
  • 时间!
  • Web 应用程序决定在页面上呈现元素的顺序,受随机属性顺序的影响,因为元素可能是从未排序的数据源中提取的。

如果您可以将所有标头包含在该 Diff 的顶部,那么我们也许能够更理解它。

我怀疑应用程序选择不渲染某些图像,因为它们没有针对它认为的某种机器人/移动设备进行优化(Python 请求)

仔细观察差异,似乎所有内容都已加载到两个请求中,只是格式不同。