【问题标题】:urllib: Opening a url always gets 429: Too many requestsurllib: 打开一个 url 总是得到 429: Too many requests
【发布时间】:2019-07-10 17:42:03
【问题描述】:

我刚开始使用urllib 模块。我正在尝试从超市抓取产品,并且有一个网站似乎总是回复 HTTP Error 429: Too many requests。我已经对 Stack Overflow 做了一些研究,似乎没有人遇到同样的问题。我的代码尽可能简单:

>>> import urllib.request
>>> resp = urllib.request.urlopen("https://shop.coles.com.au/a/a-national/product/head-shoulders-shampoo-conditioner-2in1-deep-clean")
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    resp = urllib.request.urlopen("https://shop.coles.com.au/a/a-national/product/head-shoulders-shampoo-conditioner-2in1-deep-clean")
  File "C:\Users\thank\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 222, in urlopen
return opener.open(url, data, timeout)
  File "C:\Users\thank\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 531, in open
response = meth(req, response)
  File "C:\Users\thank\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 640, in http_response
'http', request, response, code, msg, hdrs)
  File "C:\Users\thank\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 568, in error
return self._call_chain(*args)
  File "C:\Users\thank\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain
result = func(*args)
  File "C:\Users\thank\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 648, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests

我也尝试按照this answer 的建议修改用户代理,但结果还是一样

谁能解释一下 urllib 模块中的哪些默认设置可能会导致问题?还是因为网站阻止了机器人?该网站的其他产品页面也不起作用。

【问题讨论】:

  • 429 意味着您向他们的端点发送垃圾邮件的次数超出了他们的意愿。有时在请求的正文中,他们会告诉你要等多长时间才能再次尝试,所以我会从那里开始。
  • 如果您刚刚开始学习如何抓取网站,您不应该访问公共网站。您应该通过抓取您自己的 Web 服务器进行实验和学习。然后花一些时间了解robots.txt 文件和抓取最佳实践等机制。

标签: python urllib http-status-code-429


【解决方案1】:

429 是服务器要求您停止。基本上,Web 服务器认为您正在尝试发送垃圾邮件或抓取,并且它不喜欢它。一般来说,您应该尊重服务器,如果一段时间后尝试使用 429 响应,您应该遵循它。

如果您觉得服务器错误地询问您,您可以确保您的用户请求与用户从浏览器生成的用户请求“**相似”,其中将包括 user-agent 和所有常规浏览器会随请求发送的其他信息。如果服务器向您发送 429,尽管很可能它暂时或永久地阻止了您的 ip。在这方面,您应该了解如何通过多个 ip 进行抓取。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多