我的parse
方法中的第一个操作是从HTML中包含的JSON字符串中提取字典。我注意到,我有时会得到一个错误,因为网页不能正确显示,因此不包含JSON字符串。如果我删除spider,那么同一个页面显示正常,并继续运行,直到另一个随机的JSON错误。
我想检查一下错误处理是否正确:
def parse(self, response):
json_str = response.xpath("<xpath_to_json>").get()
try:
items = json.loads(json_str)["items"]
except JSONDecodeError:
return response.follow(url=response.url, callback=self.parse)
for i in items:
# do stuff
我很确定这将工作OK,但想检查检查几件事:
1.如果这命中了一个没有JSON的“真正糟糕”的页面,蜘蛛会陷入循环,还是在尝试了一定次数的给定URL后给予?
1.我使用了return
而不是yield
,因为我不想继续运行该方法。这样行吗?
任何其他意见也欢迎!!
1条答案
按热度按时间njthzxwz1#
我认为
return
在你的情况下得到解码错误应该是可以的,因为刮刀没有迭代刮取的结果。我认为通常response.follow
和Request
会过滤掉重复的请求,所以在调用它们时需要包含dont_filter=True
来允许重复的url请求。要配置n
重试次数,这不是最干净的方法,但你可以保留一个字典来跟踪某些url的重试次数作为self
属性(下面代码中的self.retry_count
),每次解析url请求时增加它,并在达到限制数量时停止。