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

python urllib.request-可能有效的标头,python,web-scraping,http-headers,urllib,Python,Web Scraping,Http Headers,Urllib,正在编写一个从网站获取信息的小脚本。我遇到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.g

正在编写一个从网站获取信息的小脚本。我遇到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个不可接受的错误结束:

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
回溯(最近一次呼叫最后一次):
文件“get_links.py”,第45行,在
page=urllib.request.urlopen(请求)
urlopen中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py”,第162行
返回opener.open(url、数据、超时)
打开文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py”,第471行
响应=方法(请求,响应)
http_响应中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py”,第581行
“http”、请求、响应、代码、消息、hdrs)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py”,第509行出错
返回自我。调用链(*args)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py”,第443行,在调用链中
结果=func(*args)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py”,第589行,默认为http\u error\u
raise HTTPError(请求完整的url、代码、消息、hdrs、fp)
urllib.error.HTTPError:HTTP错误406:不可接受
通过谷歌搜索,我发现我应该修复标题(正如我在上面所做的那样),还有很多关于如何修复标题的教程。除此之外,实际上没有多少效果

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


这似乎是每个使用Python进行web抓取的人都会遇到的问题,我还没有找到一个像样的解决方案。

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

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)

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

我还用Chrome浏览器提供的用户代理进行了尝试,似乎效果不错

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
。。并在不传递显式头的情况下运行测试,该头也返回HTTP200(成功)。这将使用库提供的默认标题,例如

python-requests/2.10.0

希望这有帮助

HTTP错误406不可接受

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

因此,我可以看出问题在于您的
用户代理: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'})

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

在不久的将来,我还有一些工作要做,今天我的收件箱中会显示这一点。谢谢你在四滴眼泪后抽出时间。(哇,多么奇怪的四年啊!)