现在有个需求:
希望在爬取汽车之家的数据时,能把当前(具体车型信息)页面爬取数据,传递给下一级。
且希望,对于下一级页面爬取失败时(本身不存在对应的页面,比如不存在该车型的报价,比如时停售了或未上市时有的没有报价),希望也能执行对应callback函数,否则我传递进入下一级的数据就丢失了。
找了半天,貌似这些可以实现对应需求:
self.crawl – pyspider中文文档 – pyspider中文网
中的save,用于传递参数到下一级
pyspider 检测url是否能打开
@catch_status_code_error – pyspider中文文档 – pyspider中文网
用于:
及时爬取出现错误时,也可以通过前面的save拿到传递过来的数据,去保存,而不会丢失。
去试试
【总结】
最后是:
可以用save去向下级传递参数了
但是对于catch_status_code_error没看出来有什么效果
至少是debug时,函数加不加catch_status_code_error,都是会被执行到的
最后相关代码是:
<code> @config(priority=2) def picSeriesPage(self, response): ... allSerieDictList = [] for curIdx, eachModelDetailDict in enumerate(modelDetailDictList): curSerieDict = { "品牌": mainBrandDict["text"], "子品牌": subBrandDict["text"], "车系": brandSerieDict["text"], "车系ID": eachModelDetailDict["车系ID"], "车型": eachModelDetailDict["车型"], "车型ID": eachModelDetailDict["车型ID"], "状态": eachModelDetailDict["状态"], "url": eachModelDetailDict["url"] } allSerieDictList.append(curSerieDict) # print("before send_message: [%d] curSerieDict=%s" % (curIdx, curSerieDict)) # self.send_message(self.project_name, curSerieDict, url=eachModelDetailDict["url"]) print("[%d] curSerieDict=%s" % (curIdx, curSerieDict)) self.crawl(curSerieDict["url"], callback=self.carModelSpecPage, save=curSerieDict) ... @catch_status_code_error def carModelSpecPage(self, response): # https://www.autohome.com.cn/spec/32708/#pvareaid=2042128 curSerieDict = response.save print("curSerieDict=%s", curSerieDict) ... return curSerieDict </code>