使用urllib.request.urlopen()时出现"HTTP错误409:冲突
在Python 3.1下,当我尝试运行这段代码时:
from urllib import request
def test():
request.urlopen("http://www.google.com")
test()
我遇到了一个HTTP 409错误。错误的详细信息如下:
Traceback (most recent call last):
File "C:\Users\Beau\Python\pokescrape.py", line 6, in <module>
test()
File "C:\Users\Beau\Python\pokescrape.py", line 4, in test
request.urlopen("http://www.google.com")
File "C:\Program Files\Python\lib\urllib\request.py", line 119, in urlopen
return _opener.open(url, data, timeout)
File "C:\Program Files\Python\lib\urllib\request.py", line 353, in open
response = meth(req, response)
File "C:\Program Files\Python\lib\urllib\request.py", line 465, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Program Files\Python\lib\urllib\request.py", line 385, in error
result = self._call_chain(*args)
File "C:\Program Files\Python\lib\urllib\request.py", line 325, in _call_chain
result = func(*args)
File "C:\Program Files\Python\lib\urllib\request.py", line 560, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "C:\Program Files\Python\lib\urllib\request.py", line 353, in open
response = meth(req, response)
File "C:\Program Files\Python\lib\urllib\request.py", line 465, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Program Files\Python\lib\urllib\request.py", line 391, in error
return self._call_chain(*args)
File "C:\Program Files\Python\lib\urllib\request.py", line 325, in _call_chain
result = func(*args)
File "C:\Program Files\Python\lib\urllib\request.py", line 473, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
实际的错误信息是:
urllib.error.HTTPError: HTTP Error 409: Conflict
我通过一个配置脚本设置了代理,网络连接没有问题。
我到底为什么会遇到HTTP 409错误呢?
3 个回答
0
结果我发现需要在代码里手动设置代理。我猜这是因为我使用了一个自动化的代理脚本。
对于遇到类似问题的人,这里是我用的代码:
from urllib import request
import random
PROXY_URL = "http://wwwcache-{}.lancs.ac.uk:8080/"
def setLancsProxy():
httpProxy = PROXY_URL.format(random.randrange(4))
proxy = request.ProxyHandler({"http" : httpProxy})
opener = request.build_opener(proxy)
request.install_opener(opener)
1
你看到的这个HTTP错误是远程服务器(或者代理服务器)给你的反馈。HTTP错误409的意思是“冲突”,通常表示有多个请求发生了冲突。如果你确实在使用代理服务器,我怀疑这可能是导致409错误的原因,不过还需要进一步排查。你可以使用像wireshark这样的工具来分析实际的网络流量,或者直接使用http.client.HTTPConnection
并开启调试功能。
2
我也遇到了这个问题(碰巧也是来自兰卡斯特),我发现如果我设置了环境变量 http_proxy,Python 就会使用它。在这种情况下(在 Windows 系统上),你可以这样设置:
set http_proxy=http://wwwcache.lancs.ac.uk:8080
而在 *nix 系统上,你可以这样设置:
export http_proxy=http://wwwcache.lancs.ac.uk:8080/
补充:感谢 Beau Martínez 提供的 *nix 解决方案。