1

私は、scrapy のCrawlSpiderスパイダー クラスを使用して、リストを反復処理し、start_urls各サイトの内部ページをクロールして、電子メール アドレスを取得しています。一致した電子メールのリストを含む、start_url ごとに 1 つの (一意の) アイテムを含むファイルをエクスポートしたいと考えています。そのために、make_requests_from_urlandparseメソッドをオーバーライドして、応答の meta dict (コードを参照) 内の各 start_url 項目を内部ページに渡すことができるようにする必要がありました。このコードの実行による出力は次のとおりです。

www.a.com,['webmaster@a.com']
www.a.com,['webmaster@a.com','info@a.com']
www.a.com,['webmaster@a.com','info@a.com','admin@a.com']

ただし、エクスポートファイルには上記の出力の最後のエントリのみを含めたい

(www.a.com,['admin@a.com,webmaster@a.com, info@a.com'])

それは可能ですか?

コード:

class MySpider(CrawlSpider):

    start_urls = [... urls list ...]

    def parse(self, response):
        for request_or_item in CrawlSpider.parse(self, response):
            if isinstance(request_or_item, Request):
                request_or_item.meta.update(dict(url_item=response.meta['url_item']))
            yield request_or_item

    def make_requests_from_url(self, url):
        # Create a unique item for each url. Append email to this item from internal pages
        url_item = MyItem()
        url_item["url"] = url
        url_item["emais"] = []

        return Request(url, dont_filter=True, meta = {'url_item': url_item})

    def parse_page(self, response):
        url_item = response.meta["url_item"]
        url_item["emails"].append(** some regex of emails from the response object **)
        return url_item
4

1 に答える 1

0

アイテムの処理に使用できますpipeline

Scrapy ドキュメントの重複フィルターを参照してください。

于 2013-04-04T16:50:42.210 に答える