使用一个小脚本从网站上获取信息。我遇到了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)
当这个triest要取,例如,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
谷歌搜索我发现我应该修复标题(正如我上面所做的)和许多关于如何修复标题的教程。除了 - 实际上没有多少工作。
是否有一些好的标题可能不会导致大多数网站出现问题?是否有其他人创建的python模块已经包含了常用的头文件?有没有一种很好的方法可以使用不同的标题重试几次,直到得到一个好的响应?
这似乎是一个问题,每个人都使用Python进行网络抓取处理,但我还没有找到合适的解决方案。
答案 0 :(得分:1)
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'})
我知道答案为时已晚,但希望对其他人有所帮助。
答案 1 :(得分:0)
以下一组标题似乎适用于大多数测试。如果有人有建议,请提供。如果一套不起作用,我也会对尝试不同标题的好解决方案感兴趣。
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)
答案 2 :(得分:0)
我尝试了你的代码,我得到了与预期相同的错误。
我也尝试过我的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
希望这有帮助