1

現在、scrapy の CrawlSpider を使用して、複数の start_url のリストで特定の情報を探しています。私がやりたいことは、探していた情報が見つかったら、特定の start_url のドメインのスクレイピングを停止することです。そのため、ドメインにヒットし続けることはなく、代わりに他の start_url にヒットするだけです。

これを行う方法はありますか?次のように deny_domains に追加しようとしました。

deniedDomains = []
...
rules = [Rule(SgmlLinkExtractor(..., deny_domains=(etc), ...)]
...
def parseURL(self, response):
    ...
    self.deniedDomains.append(specificDomain)

追加してもクロールは停止しないようですが、意図した特定のドメインでスパイダーを開始すると、要求どおりに停止します。では、スパイダーの起動後に deny_domains リストを変更できないと思いますか?

4

2 に答える 2

1

これを行う最善の方法はdynamic_deny_domain、Spider クラスで独自のリストを維持することです。

  • シンプルなDownloader Middlewareを書き、
  • これは、1 つのメソッド実装を持つ単純なクラスです。process_request(request, spider):
  • リクエストがリストにある場合はIgnoreRequestを返し、そうでない場合は返します。spider.dynamic_deny_domainNone

次に、最初の位置で 、スクレイピー設定のミドルウェアリストにダウンローダーミドルウェアを追加します'myproject.downloadermiddleware.IgnoreDomainMiddleware': 50,

トリックを行う必要があります。

于 2012-10-18T23:37:02.413 に答える
0

何かアラ?

from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

class MySpider(CrawlSpider):
    name = "foo"
    allowed_domains = ["example.org"]
    start_urls = ["http://www.example.org/foo/",]

    rules = (
        Rule(SgmlLinkExtractor(
            allow=('/foo/[^/+]',),
            deny_domains=('example.com',)),
        callback='parseURL'),
        )

    def parseURL(self, response):

        # here the rest of your code
于 2012-07-04T17:41:20.827 に答える