最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】PySpider中传递参数给下一级且当下一级失败时也可以执行

pyspider crifan 3238浏览 0评论

现在有个需求:

希望在爬取汽车之家的数据时,能把当前(具体车型信息)页面爬取数据,传递给下一级。

且希望,对于下一级页面爬取失败时(本身不存在对应的页面,比如不存在该车型的报价,比如时停售了或未上市时有的没有报价),希望也能执行对应callback函数,否则我传递进入下一级的数据就丢失了。

找了半天,貌似这些可以实现对应需求:

self.crawl – pyspider中文文档 – pyspider中文网

self.crawl – 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>

转载请注明:在路上 » 【已解决】PySpider中传递参数给下一级且当下一级失败时也可以执行

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.160 seconds, using 22.11MB memory