使用urllib.request.urlopen()时出现"HTTP错误409:冲突

2 投票
3 回答
11227 浏览
提问于 2025-04-15 19:10

在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 解决方案。

撰写回答