0

我刚开始使用该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

我也尝试按照此答案的建议修改用户代理,但结果仍然相同

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

4

1 回答 1

1

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

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

于 2019-02-17T02:05:00.503 回答