scrapy在不同的Request之间传递数据的办法
有一次,我在采集淘宝数据的时候,发现我需要在列表页抓一些数据,也需要在详情页抓一些数据,有时候我也需要在详情的js代码源码中再抓取一些数据。
这就涉及到不同的request之间传递数据的方法了。
一个用户完整的信息要在多个Request中获取,需要在请求之间传递参数。
直到该用户所有页面数据汇总完成,提交item。
Scrapy采用的是回调(callback)的方式,把请求处理交给下一次请求,在请求时用meta传递参数。
Request(url=item_details_url, meta={‘item’: item},callback=self.parse_details),可传递简单类型参数或对象类型参数。
如果meta={‘item’: item}中如果有多个参数,则每个参数间用英文逗号隔开,例如:meta={‘item’: item,’item2′: item2}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class MySpider(BaseSpider): name = 'myspider' start_urls = ( 'http://example.com/page1', 'http://example.com/page2', ) def parse(self, response): # collect `item_urls` for item_url in item_urls: yield Request(url=item_url, callback=self.parse_item) def parse_item(self, response): item = MyItem() # populate `item` fields 收集处理一部分数据 yield Request(url=item_details_url, meta={'item': item}, callback=self.parse_details) def parse_details(self, response): item = response.meta['item'] # populate more `item` fields 再收集处理另外的数据 return item |
注意,第三级的处理不能用item = MyItem()声明了,而是需要用item = response.meta[‘item’]来声明。
scrapy爬虫数据保存为txt,json,mysql的方法 清除scrapy爬虫满屏的打印信息的问题
c05090f7798f06ddb2a32b3d85da2439gf5hd6f5gfsd5v6v5好玩好玩