特定のコードの問題はありませんが、Scrapyフレームワークで次の問題にロジスティックに対処する方法がわかりません。
スクレイピングするデータの構造は、通常、各アイテムのテーブル行です。簡単ですよね?
最終的に、各行のTitle、Due Date、およびDetailsを取得します。 TitleおよびDue Dateは、ページですぐに利用できます...
しかしDetails自体は表にありません-むしろ、詳細が含まれているページへのリンク(これが意味をなさない場合は、ここに表があります):
|-------------------------------------------------|
| Title | Due Date |
|-------------------------------------------------|
| Job Title (Clickable Link) | 1/1/2012 |
| Other Job (Link) | 3/2/2012 |
|--------------------------------|----------------|
ScrapyのCrawlSpiderセクションを読んだ後でも、コールバックとリクエストでアイテムをロジスティックに渡す方法がまだわからないドキュメンテーション。
最初に docs を読んで、私の言うことを理解してください。
答え:
他のページにある追加のフィールドをスクレイピングするには、追加情報を含むページの解析メソッド抽出URLで、その解析メソッドからそのURLを持つリクエストオブジェクトを作成して返し、抽出されたデータをmeta
パラメータを介して渡します。
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
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