【问题标题】:Why is urllib.request.urlopen giving me 404 on Wall Street Journal's website?为什么 urllib.request.urlopen 在华尔街日报的网站上给我 404?
【发布时间】:2020-07-29 23:14:14
【问题描述】:

问题

我在华尔街日报上使用urllib.request.urlopen,它给了我一个 404。

详情

其他网站运行良好。如果我使用https://,也会出现同样的错误。我在 REPL 中做了这个例子,但同样的错误发生在我的 Django 服务器调用中:

>>> from urllib.request import urlopen
>>> urlopen('http://www.wsj.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

它应该是这样工作的:

>>> urlopen('http://www.cbc.ca')
<http.client.HTTPResponse object at 0x10b0f8c88>

我不确定如何调试它。有谁知道发生了什么,我该如何解决?

【问题讨论】:

  • 如果您指的是加拿大广播公司网站(另一家新闻机构),那就是 cbc.ca,而不是 cbc.com。
  • @KarlKnechtel 好的,我对其进行了测试并使用 cbc.ca 对其进行了更新。
  • 我不知道为什么我因为“需要更多调试细节”而被否决。我不知道还有什么其他信息。很明显fetch应该可以正常工作了,错误是404,而且复现错误的两行字面意思都显示出来了。
  • 对于我来说,这个问题确实重现了。我假设 WSJ 正在使用某种反机器人保护,尽管在这种情况下用 404 响应似乎有点……被动攻击?至少不是我所期望的。无论如何,尝试设置用户代理?
  • @KarlKnechtel 成功了,谢谢!你想发布你的答案吗?否则我会写出解决方案。

标签: python python-3.x http-status-code-404 urllib


【解决方案1】:

第一个导入请求是这样的:

from urllib.request import **Request**, urlopen

然后将您的 url 和标头传递给 Request,如下所示:

url = 'https://www.wsj.com/'
response_obj = urlopen(Request(url, headers={'User-Agent': 'Mozilla/5.0'}))
print(response_obj)

我测试了它现在可以正常工作了

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 2020-09-04
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2021-12-09
    • 2013-09-09
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多