我刮json页,但有时我得到这个错误:
ERROR: Spider error processing <GET https://reqbin.com/echo/get/json/page/2>
Traceback (most recent call last):
File "/home/user/.local/lib/python3.8/site-packages/twisted/internet/defer.py", line 857, in _runCallbacks
current.result = callback( # type: ignore[misc]
File "/home/user/path/scraping.py", line 239, in parse_images
jsonresponse = json.loads(response.text)
File "/usr/lib/python3.8/json/init.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 48662 (char 48661)
所以我怀疑json页面没有时间完全加载,这就是为什么解析json内容失败的原因。如果我手动解析,我的意思是把json内容作为一个字符串,用json模块加载它,它会工作,我不会得到json.decoder.JSONDecodeError
错误。
到目前为止,我所做的是在settings.py
中设置:
DOWNLOAD_DELAY = 5
DOWNLOAD_TIMEOUT = 600
DOWNLOAD_FAIL_ON_DATALOSS = False
CONCURRENT_REQUESTS = 8
希望它能减缓刮擦速度,解决我的问题,但问题仍然发生。
如何确保json页面完全加载,使其内容的解析不会失败?
1条答案
按热度按时间ljsrvy3e1#
您可以尝试增加DOWNLOAD_TIMEOUT。这通常会有帮助。如果这还不够,您可以尝试减少CONCURRENT_REQUESTS。
如果仍然没有帮助,尝试使用重试请求。您可以编写自己的
retry_request
函数并将其命名为return self.retry_request(response)
。或者像这样做
req = response.request.copy(); req.dont_filter=True
和return req
。您还可以使用RetryMiddleware。有关更多信息,请访问文档页面https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.downloadermiddlewares.retry