如何将url值传递给Scrapy爬网中的所有后续项?

时间:2013-04-17 22:23:18

标签: python web-scraping scrapy

我正在创建一个CrawlSpider来抓取产品网站。从第1页开始,我提取www.domain.com/color(简化)形式的类别网址。在类别页面上,我按照产品详细信息页面的第一个链接,解析产品详细信息页面并通过下一个链接爬网到下一个页面。因此,每种颜色类别都有一个唯一的爬行路径。

难点在于颜色变量不在产品详细信息页面上。我可以通过解析链接从类别页面中提取它,如下所示:

def parse_item(self, response):
        l = XPathItemLoader(item=Greenhouse(), response=response)
        l.default_output_processor = Join()
        l.add_value('color', response.url.split("/")[-1])
        return l.load_item()

但是,我想将此颜色值添加到从特定颜色类别页面开始抓取的产品的产品详细信息页面解析的项目中。通过以下链接抓取产品网址,因此在第一个链接后丢失引用类别页面。在Scrapy文档中有关于request.meta的内容可以在解析器之间传递数据,但我不确定这是否适用于此。任何帮助将不胜感激。

我的规则是:

Rule(SgmlLinkExtractor(restrict_xpaths=('//table[@id="ctl18_ctlFacetList_dlFacetList"]/tr[2]/td',)),),
Rule(SgmlLinkExtractor(restrict_xpaths=('//table[@id="ctl18_dlProductList"]/tr[1]/td[@class="ProductListItem"][1]',)),callback='parse_item', follow=True,),
Rule(SgmlLinkExtractor(restrict_xpaths=('//a[@id="ctl18_ctl00_lbNext"]',)),callback='parse_item', follow=True, ),

2 个答案:

答案 0 :(得分:0)

您可以使用规则的process_request参数:

class MySPider(CrawlSpider):
    ...
    rules = [...
        Rule(SgmlLinkExtractor(), process_request='add_color'),
    ]

    def add_color(self, request):
        meta = dict(color=request.url.split("/")[-1])
        return request.replace(meta=meta)

答案 1 :(得分:0)

我会选择Steven’s approach,但要编辑原始请求的元数据:

class MySPider(CrawlSpider):

    rules = [Rule(SgmlLinkExtractor(), process_request='add_color')]

    def add_color(self, request):
        request.meta['color'] = request.url.split("/")[-1]
        return request