繁体   English   中英

python urllib.request - 可能有效的标头

[英]python urllib.request - headers that are likely to work

正在编写一个小脚本来从网站获取信息。 我遇到了 HTTP 错误的问题。

req = urllib.request.Request(lnk['href'],
   headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})
page = urllib.request.urlopen(req)

例如,当尝试获取http://www.guru99.com/node-js-tutorial.html我收到一系列错误,以 406 Unacceptable 结尾:

Traceback (most recent call last):
  File "get_links.py", line 45, in <module>
    page = urllib.request.urlopen(req)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 162, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 471, in open
    response = meth(req, response)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 581, in http_response
    'http', request, response, code, msg, hdrs)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 509, in error
    return self._call_chain(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 443, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 589, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 406: Not Acceptable

谷歌搜索我发现我应该修复标题(正如我上面所做的那样)和许多关于如何修复标题的教程。 除了 - 没有多少实际工作。

是否有一些好的标题可能不会对大多数网站造成问题? 是否有其他人创建的一些 python 模块已经包含常用的头文件? 有没有好的方法可以用不同的标头重试几次直到得到好的响应?

这似乎是每个使用 Python 进行网络抓取的人都会遇到的问题,而且我还没有找到合适的解决方案。

以下一组标题似乎适用于大多数测试。 如果其他人有任何建议,请提供。 如果一组不起作用,我也对尝试不同标题的好解决方案感兴趣。

req = urllib.request.Request(lnk['href'],
   headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'})
page = urllib.request.urlopen(req)

HTTP 错误 406 不可接受

超文本传输​​协议 (HTTP) 406 不可接受客户端错误响应代码表示服务器无法生成与请求的主动内容协商标头中定义的可接受值列表匹配的响应,并且服务器不愿意提供默认表示。

所以我可以看到问题出在您的User-Agent: Mozilla/5.0键和值上。 这是一堆正确的用户代理的链接,

因此,将您的代码更改为以下内容,

headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})

我知道答案为时已晚,但希望这对其他人有所帮助。

我尝试了您的代码,但得到了与预期相同的错误。

我也用我的 Chrome 浏览器提供的用户代理尝试过,这似乎有效

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

.. 并且在不传递显式标头的情况下运行测试,该标头也返回了 http 200(成功)。 这将使用库提供的默认头文件,例如

python-requests/2.10.0

希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM