请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

1回答

Jazz_Qi 2019-02-13 15:16:07

可以的,在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 回复 有任何疑惑可以回复我~
  • bobby #1
    非常正确! 理解的也很到位,确实如果只是为了完成这个功能的话,为了尽量少动代码 最好的就是重载_build_request这个方法,而且你提到的不建议重载_build_request说明对python的理解也很到位,不过为了完成功能当然也可以重载了,这里的以下划线开始的方法只是说明源码中不希望将这个方法重载,不过直接重载也是没有任何问题的,就看自己的取舍了
    回复 有任何疑惑可以回复我~ 2019-02-13 16:34:16
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信