我目前正在开发一个刮刀项目,这对于确保每个请求得到妥善处理非常重要,即记录错误或保存成功结果.我已经实现了基本的蜘蛛,我现在可以成功处理99%的请求,但是我可能会遇到像captcha,50x,30x,甚至结果中没有足够字段的错误(然后我会尝试另一个网站到找到缺少的字段).
起初,我认为在解析回调中引发异常并在errback中处理所有异常更"合乎逻辑",这可以使代码更具可读性.但我试图发现errback只能捕获下载器模块中的错误,例如非200响应状态.如果我在回调中引发一个自我实现的ParseError,那么蜘蛛只会提升它并停止.
即使我必须直接在回调中处理解析请求,我也不知道如何在回调中立即以干净的方式重试请求.你知道,我可能必须包含一个不同的代理来发送另一个请求,或修改一些请求标头.
我承认我对scrapy相对较新,但我已经来回试了好几天但仍然无法让它工作......我已经检查过每一个问题而没有人匹配,提前感谢你的帮助.
更新:我意识到这可能是一个非常复杂的问题所以我试着在下面的伪代码中说明这个场景,希望这会有所帮助:
from scraper.myexceptions import *
def parseRound1(self, response):
.... some parsing routines ...
if something wrong happened:
# this causes the spider raises a SpiderException and stops
raise CaptchaError
...
if no enough fields scraped:
raise ParseError(task, "no enough fields")
else:
return items
def parseRound2(self, response):
...some other parsing routines...
def errHandler(self, failure):
# how to trap all the exceptions?
r = failure.trap()
# cannot trap ParseError here
if r == CaptchaError:
# how to enqueue …Run Code Online (Sandbox Code Playgroud)