web-dev-qa-db-ja.com

スクレイピー:追加のアイテムデータを取得するには、リンクをたどりますか?

特定のコードの問題はありませんが、Scrapyフレームワークで次の問題にロジスティックに対処する方法がわかりません。

スクレイピングするデータの構造は、通常、各アイテムのテーブル行です。簡単ですよね?

最終的に、各行のTitleDue Date、およびDetailsを取得します。 TitleおよびDue Dateは、ページですぐに利用できます...

しかしDetails自体は表にありません-むしろ、詳細が含まれているページへのリンク(これが意味をなさない場合は、ここに表があります):

|-------------------------------------------------|
|             Title              |    Due Date    |
|-------------------------------------------------|
| Job Title (Clickable Link)     |    1/1/2012    |
| Other Job (Link)               |    3/2/2012    |
|--------------------------------|----------------|

ScrapyのCrawlSpiderセクションを読んだ後でも、コールバックとリクエストでアイテムをロジスティックに渡す方法がまだわからないドキュメンテーション。

33
dru

最初に docs を読んで、私の言うことを理解してください。

答え:

他のページにある追加のフィールドをスクレイピングするには、追加情報を含むページの解析メソッド抽出URLで、その解析メソッドからそのURLを持つリクエストオブジェクトを作成して返し、抽出されたデータをmetaパラメータを介して渡します。

ターゲットページの結果をスクレイピーで現在のページにマージするにはどうすればよいですか?

27
warvariuc

scrapy documentation の例:

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

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

Python functools.partialは、追加の引数を介してitemまたはその他のシリアル化可能なデータを次のScrapyコールバックに渡します。

何かのようなもの:

import functools

# Inside your Spider class:

def parse(self, response):
  # ...
  # Process the first response here, populate item and next_url.
  # ...
  callback = functools.partial(self.parse_next, item, someotherarg)
  return Request(next_url, callback=callback)

def parse_next(self, item, someotherarg, response):
  # ...
  # Process the second response here.
  # ...
  return item
3
Jan Wrobel