我正在尝试抓取一个网站,其中item_id和一些数据在一页上,而该项目的其他信息在另一页上。
我面临的问题是,如何将附加信息分配给第1页上找到的同一数据集?
项目:
class GetIt(scrapy.Item):
ID = scrapy.Field()
name = scrapy.Field()
我的抓取工具的相关部分:
rules = (
Rule( # first page
LinkExtractor(allow=['regex']),
callback='parse_1'
),
Rule( # second page
LinkExtractor(allow=['regex']),
callback='parse_2'
),
Rule( # index pages
LinkExtractor(allow=['regex']),
follow=True
),
)
def parse_1(self, response):
GetIt = GetIt()
GetIt['ID'] = response.xpath('regex').re_first('regex=(\d+)')
return item
def parse_2(self, response):
GetIt = GetIt()
GetIt['name'] = response.xpath('regex').extract()
因此,想法是,如果规则被触发,他将提取新项目,如果规则2被触发,他将找到一个包含项目更多信息的页面。规则3从索引站点获取所有页面。
所以信息在页面类型1上:
/maininfo.html
类型2上项目的辅助信息:
/search.php?itemid=303
在页面类型1上,有指向页面类型2的链接,因此我可以提取链接和ID。
从理论上讲,我也可以直接在解析器函数中调用页面:
url2 = response.xpath('code').extract_first() # get the link
scrapy.Request(url2, callback=self.parse_unitpage) # get the name from 2nd page
... somehow like this
这可能吗?如果不是,如果ID属于同一数据集,如何合并页面type1,2的数据?
我不确定我是否完全了解您想要什么,但是据我了解,第一页您会得到ID
,第二页您会得到name
。这就是我要做的:
def parse_1(self, response):
item = GetIt()
item['ID'] = response.xpath('regex').re_first('regex=(\d+)')
url_to_get_name = ...
yield Request(url_to_get_name, self.parse_2, meta={'item': item})
def parse_2(self, response):
item = response.meta['item']
item['name'] = response.xpath('regex').extract()
yield item
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句