Python中使用“User-Agent”进行Requests.get请求时,不会模拟浏览器请求。

9
我需要使用Python从Linux终端收集网页信息,这个方法非常有效,但是有些页面(并非全部)在我使用requests.get时会返回无效的URL,因为它们有代理检测器,并且不知道如何响应我的请求(我不是来自Linux终端的浏览器或移动应用程序)。
即使使用“User-Agent”头也无法解决问题,我尝试了几种不同的方法来发送它以模拟成Mozilla浏览器:
user_agent = {'User-Agent': 'Mozilla/5.0'}

或者
user_agent = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; hu-HU; rv:1.7.8) Gecko/20050511 Firefox/1.0.4'}

还有许多其他的组合方式。

在某些服务器上,当我尝试使用这行代码时:

page = requests.get(url, headers=user_agent)

我收到了一个错误请求,因为这些服务器试图向我发送适用于桌面或移动浏览器的网页,但它们未能正确识别。我这样发送 User-Agent 是否有问题?我在 Python Notebook 中尝试了我的代码,由于我当前正在从浏览器发送请求,所以它完美地工作。

也许他们正在尝试运行一些 JavaScript 代码来检测浏览器。请查看页面源代码。 - poolie
1
@MaximilianoRios,你的Python笔记本不太可能影响到requests请求的头部。提示:尝试添加一些Referer头部(今天我发现印度的一个页面,在缺少Referer的情况下会回复404)。 - Jan Vlcinsky
但很容易识别问题,我从终端发送请求时得到一个不确定的来源,我从Python笔记本发送请求时它可以工作。我将尝试添加一个引用来看看是否有效。 - Maximiliano Rios
3
您可以随时使用 http://httpbin.org/get 来让头部信息回显;很可能您需要的不仅仅是一个 User-Agent 头部,requests 库并没有对其进行篡改。也许加上一个 Referrer 头部会更好? - Martijn Pieters
3
我建议您使用诸如wireshark之类的工具,精确地查看服务器和实际浏览器之间的对话。这将让您了解对话是否涉及到cookies、JavaScript、自定义标头等内容。 - Serge Ballesta
显示剩余7条评论
2个回答

12

你正在使用一个非常老的用户代理程序,因此一些网站可能会阻止您访问。

>>> import requests
>>> header = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0',}
>>> url = 'http://www.w3.org/'
>>> r = requests.get(url, headers=header)
>>> r.headers
CaseInsensitiveDict({'content-length': '40737', 'content-location': 'Home.html', 'accept-ranges': 'bytes', 'expires': 'Tue, 24 Jun 2014 04:44:36 GMT', 'vary': 'negotiate,accept', 'server': 'Apache/2', 'tcn': 'choice', 'last-modified': 'Mon, 23 Jun 2014 11:15:15 GMT', 'etag': '"9f21-4fc7ef51956c0;89-3f26bd17a2f00"', 'cache-control': 'max-age=600', 'date': 'Tue, 24 Jun 2014 04:34:36 GMT', 'p3p': 'policyref="http://www.w3.org/2001/05/P3P/p3p.xml"', 'content-type': 'text/html; charset=utf-8'})
>>> r.request.headers
CaseInsensitiveDict({'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0'})
>>> 

7

我使用了伪造的用户代理

使用方法:

from fake_useragent import UserAgent
import requests


ua = UserAgent()
print(ua.chrome)
header = {'User-Agent':str(ua.chrome)}
print(header)
url = "https://www.hybrid-analysis.com/recent-submissions?filter=file&sort=^timestamp"
htmlContent = requests.get(url, headers=header)
print(htmlContent)

输出:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17
{'User-Agent': 'Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}
<Response [200]>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接