21

私はサッカー サイトをスクレイピングしており、スパイダー (単一のスパイダー) がサイトのページからいくつかの種類のアイテムを取得しています: チーム、試合、クラブなど。 、matches.csv、clubs.csv など。

これを行う正しい方法が何であるかわかりません。私がこれまでに考えた唯一の方法は、 http: //doc.scrapy.org/en/0.14/topics/exporters.html の例のように独自のカスタム パイプラインを作成 し、spider_opened メソッドで必要なすべての csv ファイルを開くことです。つまり、csv ファイルごとに csv エクスポーターを作成し、process_item にコードを配置して、「item」パラメーターがどの種類のアイテムであるかを特定し、それを対応するエクスポーター オブジェクトに送信します。

とにかく、scrapy で複数の csv ファイル (項目タイプごと) を処理する例が見つからないので、意図しない方法で使用しているのではないかと心配しています。(これは Scrapy での私の最初の経験です)。

ディオメデス

4

5 に答える 5

25

MultiCSVItemPipeline上記のdrcolossosの回答に基づいて、作成に使用したコードをここに投稿しています。

このパイプラインは、すべての Item クラスが規則 *Item (TeamItem、EventItem など) に従っていることを前提としており、team.csv、event.csv ファイルを作成し、すべてのレコードを適切な csv ファイルに送信します。

from scrapy.exporters import CsvItemExporter
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher


def item_type(item):
    return type(item).__name__.replace('Item','').lower()  # TeamItem => team

class MultiCSVItemPipeline(object):
    SaveTypes = ['team','club','event', 'match']
    def __init__(self):
        dispatcher.connect(self.spider_opened, signal=signals.spider_opened)
        dispatcher.connect(self.spider_closed, signal=signals.spider_closed)

    def spider_opened(self, spider):
        self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ])
        self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes])
        [e.start_exporting() for e in self.exporters.values()]

    def spider_closed(self, spider):
        [e.finish_exporting() for e in self.exporters.values()]
        [f.close() for f in self.files.values()]

    def process_item(self, item, spider):
        what = item_type(item)
        if what in set(self.SaveTypes):
            self.exporters[what].export_item(item)
        return item
于 2012-09-03T16:38:53.560 に答える
12

あなたのアプローチは私には問題ないようです。パイプラインは Scrapy の優れた機能であり、アプローチのようなもののための IMO ビルドです。

複数のアイテム (SoccerItem、MatchItem など) を作成しMultiCSVItemPipeline、アイテム クラスをチェックして各アイテムを独自の CSV クラスに委任することができます。

于 2012-09-03T07:31:26.233 に答える