2012-06-20 10 views
5

ウェブサイト(2レベルしかない)をクロールしていて、両方のレベルのサイトから情報を収集したい。私が取り組んでいる問題は、両方のレベルの情報で1つの項目のフィールドに記入したいということです。これはどうすればいいですか?Scrapy CrawlSpider:さまざまなレベルの解析でアイテムにアクセスする方法

私はインスタンスの変数としてすべてのスレッド(これはスパイダーの同じインスタンスです)からアクセスできるインスタンス変数として考えていましたが、parse_1はいくつかのフィールドを記入し、parse_2は対応する値を入力する前に正しいキーを入力してください。この方法は面倒で、私はまだそれを動作させる方法がわかりません。

私が考えているのは、コールバックにアイテムを渡している方が良い方法が必要であるということです。私はどのようにRequest()メソッドでそれを行うのか分からない。アイデア?あなたは後から引数を受け取ることができるように、第2のコールバックでは、これらのコールバック関数に引数を渡すに興味があるかもしれないいくつかのケースでは

:scrapyのドキュメントから

答えて

8

。これにはRequest.meta属性を使用できます。

ここで別のページから別のフィールドを埋めるために、このメカニズムを使用してアイテムを渡す方法の例です:

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = Request("http://www.example.com/some_page.html", 
         callback=self.parse_page2) 
    request.meta['item'] = item 
    return request 

def parse_page2(self, response): 
    item = response.meta['item'] 
    item['other_url'] = response.url 
    return item 

だから、基本的にあなたが最初のページをこすりし、項目に含まれるすべての情報を格納し、全体を送信することができますその第2レベルのURLの要求を持つアイテムと、すべての情報を1つのアイテムにまとめます。

+0

私はこれを、URLに情報を貼り付けることによって行っていました。この方法は、特にURLでうまくエンコードしない項目の方が優れているようです。ありがとう! – Muhd

+1

2ページ目と3ページ目に、情報の一部も埋め込まれている場合、どのように2つの異なる治療法でそれらを順次呼び出すことができますか?リクエスト?両方に「メタ」の半分の項目を渡すことができますが、最終的な「項目」にページ1 +ページ2 +ページ3のデータが含まれていることを確認します – dowjones123

関連する問題