obs*_*kyr 15 python browser python-requests
我正在使用Python请求抓取一个Wikia页面.但是有一个问题:请求请求并没有给我相同的HTML,因为我的浏览器使用相同的页面.
为了比较,这里是Firefox给我的页面,这里是页面请求提取(下载它们以查看 - 抱歉,没有简单的方法可以从另一个站点直观地托管一些HTML).
你会注意到一些差异(超级不友好的差异).有一些小东西,比如beinig以不同的顺序排序等等,但也有一些非常非常大的东西.最重要的是缺少最后六个<img>,以及整个导航和页脚部分.即使在原始HTML中,它看起来像页面突然切断.
为什么会发生这种情况,有没有办法解决它?我已经想到了很多东西,其中没有一个是富有成效的:
User-Agent到请求请求中,并且1:1,但没有任何改变.如果你知道这可能发生的方式并找到解决方法,那就太棒了.谢谢!
我建议您不要在请求中发送正确的标头(或发送错误的标头)。这就是为什么你会得到不同的内容。以下是带有标头的 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
我有一个类似的问题:
为了解决这个问题,我最终换掉了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)
然后它奏效了.
也许其中一个图书馆在幕后做了一些奇怪的事情?不确定这是否是你的选择.
我看到的许多差异表明内容仍然存在,只是以不同的顺序呈现,有时具有不同的间距。
您可能会根据多种不同的事物收到不同的内容:
如果您可以将所有标头包含在该 Diff 的顶部,那么我们也许能够更理解它。
我怀疑应用程序选择不渲染某些图像,因为它们没有针对它认为的某种机器人/移动设备进行优化(Python 请求)
仔细观察差异,似乎所有内容都已加载到两个请求中,只是格式不同。
| 归档时间: |
|
| 查看次数: |
14053 次 |
| 最近记录: |