6

Scrapy で Web サイトをスクレイピングしていますが、結果を 2 つの部分に分割したいと考えています。通常、私は次のように Scrapy を呼び出します。

$ scrapy crawl articles -o articles.json
$ scrapy crawl authors  -o  authors.json

2 つのスパイダーは完全に独立しており、まったく通信しません。このセットアップは小規模な Web サイトでは機能しますが、大規模な Web サイトでは作成者が多すぎて、このようにクロールできません。

この 2 つのファイル構造をクロールして維持するページをarticlesスパイダーに伝えるにはどうすればよいでしょうか? authors理想的には、作成者の URL をファイルに書き込んで、別のスパイダーで読み返すのは避けたいと思います。

4

2 に答える 2

2

最終的に、オーサー スクレイパーにコマンド ライン引数を使用しました。

class AuthorSpider(BaseSpider):
    ...

    def __init__(self, articles):
        self.start_urls = []

        for line in articles:
            article = json.loads(line)
            self.start_urls.append(data['author_url'])

次に、Scrapy のドキュメントに記載されている複製パイプラインを追加しました。

from scrapy import signals
from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):
    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['id'])
            return item

最後に、記事の JSON 行ファイルをコマンドに渡しました。

$ scrapy crawl authors -o authors.json -a articles=articles.json

それは素晴らしい解決策ではありませんが、うまくいきます。

于 2013-02-07T18:52:08.717 に答える
0

すべてはあなたのビジネスロジックに依存しますが、ここに私の提案があります

各記事には著者が必要だと思います。

では、なぜ記事や著者を取得するために同じページを複数回クロールしているのでしょうか。

したがって、クローラーは著者を含む必要がある記事のみをクロールする必要があると思います。1つのスクレーパーで同時にarticlと著者を抽出し、Scrapyパイプラインを使用して記事と著者を分離できる複数のjsonファイルを記述します。

もう1つのポイントは、非常に大きなデータの場合です。jsonはjsonlinesの使用は推奨されません。

于 2013-02-07T10:40:18.060 に答える