5

この質問には Python と Scrapy を使用しています。

Web ページB1、B2、B3、...へのリンクのリストを含むWeb ページAをクロールしようとしています。各Bページには、画像を含む別のページC1、C2、C3、...へのリンクが含まれています。

したがって、Scrapy を使用すると、疑似コードのアイデアは次のようになります。

links = getlinks(A)
for link in links:
    B = getpage(link)
    C = getpage(B)
    image = getimage(C)

ただし、Scrapy で複数のページを解析しようとすると、問題が発生します。これが私のコードです:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    links = hxs.select('...')

    items = []
    for link in links:
        item = CustomItem()
        item['name'] = link.select('...')
        # TODO: Somehow I need to go two pages deep and extract an image.
        item['image'] = ....

どうすればこれを行うことができますか?

(注: 私の質問は、Scrapy のプロジェクトで複数のスパイダーを使用することに似ていますが、Scrapy の Request オブジェクトから値を「返す」方法がわかりません。)

4

1 に答える 1

6

スクレイピーでは、より多くのリクエストを発行する必要がある場合、解析メソッドは新しいリクエストを返す必要があります (yieldスクレイピーはジェネレーターでうまく機能します)。このリクエスト内で、目的の関数へのコールバックを設定できます (再帰的にするには、parseもう一度渡すだけです)。それがページにクロールする方法です。

例として、この再帰クローラーを確認できます

あなたの例に従うと、変更は次のようになります。

def parse(self, response):
    b_pages_links = getlinks(A)
    for link in b_pages_links:
        yield Request(link, callback = self.visit_b_page)

def visit_b_page(self, response):
    url_of_c_page = ...
    yield Request(url_of_c_page, callback = self.visit_c_page)

def visit_c_page(self, response):
    url_of_image = ...
    yield Request(url_of_image, callback = self.get_image)

def get_image(self, response):
    item = CustomItem()
    item['name'] = ... # get image name
    item['image'] = ... # get image data
    yield item

スクレイピーのドキュメントこれらのランダム コード スニペットも確認​​してください。彼らは多くを助けることができます:)

于 2013-06-10T01:43:41.783 に答える