5

Web サイト (深さ 2 レベルのみ) をクロールしており、両方のレベルのサイトから情報をスクレイピングしたいと考えています。私が直面している問題は、1 つの項目のフィールドに両方のレベルの情報を入力したいということです。どうすればいいですか?

すべてのスレッドがアクセスできるインスタンス変数として項目のリストを持ち (スパイダーの同じインスタンスであるため)、parse_1 はいくつかのフィールドに入力し、parse_2 は入力する前に正しいキーをチェックする必要があると考えていました。対応する値を出力します。この方法は面倒に思えますが、どうすればうまくいくかはまだわかりません。

私が考えているのは、より良い方法があるに違いないということです。おそらく何らかの形で項目をコールバックに渡すことです。ただし、 Request() メソッドでそれを行う方法がわかりません。アイデア?

4

1 に答える 1

9

スクレイピーのドキュメントから:

場合によっては、これらのコールバック関数に引数を渡して、後で 2 番目のコールバックで引数を受け取ることができます。そのために 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 つのアイテムに含めることができます。

于 2012-06-21T10:36:53.340 に答える