5

製品の Web サイトをスクレイピングする CrawlSpider を作成しています。1 ページ目から、www.domain.com/color (簡体字) の形式のカテゴリ URL を抽出します。カテゴリ ページでは、最初のリンクから製品詳細ページに移動し、製品詳細ページを解析して、次のリンクから次のページに移動します。したがって、各色カテゴリには固有のクロール パスがあります。

難点は、カラー変数が商品詳細ページにないことです。次のようにリンクを解析して、カテゴリ ページから抽出できます。

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()

ただし、この色の値を、特定のカラー カテゴリ ページからクロールされた製品の製品詳細ページから解析されたアイテムに追加したいと考えています。製品の URL は次のリンクをたどることによってクロールされるため、最初のリンクの後に参照カテゴリ ページが失われます。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, ),
4

2 に答える 2

1

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)
于 2013-04-17T23:10:59.257 に答える