请问CrawlSpider中可以使用request的meta来传递参数么

来源:7-4 Rule和LinkExtractor使用

vimor

2019-02-11

写回答

1回答

Jazz_Qi

2019-02-13

可以的,在Crawl.py中类CrawlSpider的_requests_to_follow方法里会根据你自定义的spider.py中的rules(规则集)中的每个规则rule提取url,然后对每个url建立Request。建立Request的代码在67行的self._build_request方法,创建后的r(Request)又经过第68行yield rule.process_request(r)返回给scrapy的引擎,那么意味rule.process_request方法可以对创建后的r(Request,里面就有meta)进行调整。


总的来说你自定义的spider.py中的rules(规则集)中的每个规则rule的参数process_request传入的应该是一个处理函数,他会对设定follow=True时每个后续url产生的Request在yield给引擎之前进行修改,你可以在这里获取meta数据。

而且在使用self._build_request方法创建Request时也可以调整meta,代码53行r.meta.update(rule=rule, link_text=link.text)就刷新了meta数据,你可以在你自定义的spider.py中重写_build_request函数,但不建议对下划线开头的函数重写。


以上是个人理解,不知道是否有误,具体还请老师答案。


0
1
bobby
非常正确! 理解的也很到位,确实如果只是为了完成这个功能的话,为了尽量少动代码 最好的就是重载_build_request这个方法,而且你提到的不建议重载_build_request说明对python的理解也很到位,不过为了完成功能当然也可以重载了,这里的以下划线开始的方法只是说明源码中不希望将这个方法重载,不过直接重载也是没有任何问题的,就看自己的取舍了
2019-02-13
共1条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5808 学习 · 6290 问题

查看课程