2

3日間、それぞれのstart_ursをmeta属性に保存して、後続のリクエストにアイテムとしてスクレイプで渡そうとしているので、start_urlを使用して辞書を呼び出し、出力に追加のデータを入力できます。ドキュメントで説明されているので、実際には簡単なはずです...

グーグルスクレイピーグループで議論があり、ここにも質問がありましたが、実行できません:(

私はscrapyを初めて使用し、それは素晴らしいフレームワークだと思いますが、私のプロジェクトでは、すべてのリクエストのstart_urlsを知っている必要があり、見た目は非常に複雑です。

助けていただければ幸いです。

現時点では、私のコードは次のようになっています。

class example(CrawlSpider):

    name = 'example'
    start_urls = ['http://www.example.com']

    rules = (
    Rule(SgmlLinkExtractor(allow=('/blablabla/', )), callback='parse_item'),
    )

    def parse(self, response):
        for request_or_item in super(example, self).parse(response):
            if isinstance(request_or_item, Request):
                request_or_item = request_or_item.replace(meta = {'start_url':   response.meta['start_url']})
            yield request_or_item

    def make_requests_from_url(self, url):
         return Request(url, dont_filter=True, meta = {'start_url': url})


    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        item = testItem()
        print response.request.meta, response.url
4

1 に答える 1

2

OPの問題を解決しないため、この回答を削除したかったのですが、スクレイピーな例として残しておくことにしました。


警告:

クロール スパイダー ルールを作成するときは、メソッド自体を使用してそのロジックを実装するparseため、コールバックとして使用しないでください。したがって、メソッドをオーバーライドすると、クロール スパイダーは機能しなくなります。CrawlSpiderparseparse

代わりにBaseSpiderを使用します。

class Spider(BaseSpider):

    name = "domain_spider"


    def start_requests(self):

        last_domain_id = 0
        chunk_size = 10
        cursor = settings.db.cursor()

        while True:
            cursor.execute("""
                    SELECT domain_id, domain_url  
                    FROM domains  
                    WHERE domain_id > %s AND scraping_started IS NULL  
                    LIMIT %s
                """, (last_domain_id, chunk_size))
            self.log('Requesting %s domains after %s' % (chunk_size, last_domain_id))
            rows = cursor.fetchall()
            if not rows:
                self.log('No more domains to scrape.')
                break

            for domain_id, domain_url in rows:
                last_domain_id = domain_id
                request = self.make_requests_from_url(domain_url)
                item = items.Item()
                item['start_url'] = domain_url
                item['domain_id'] = domain_id
                item['domain'] = urlparse.urlparse(domain_url).hostname
                request.meta['item'] = item

                cursor.execute("""
                        UPDATE domains  
                        SET scraping_started = %s
                        WHERE domain_id = %s  
                    """, (datetime.now(), domain_id))

                yield request

    ...
于 2012-08-03T05:00:38.853 に答える