12

ユーザーが構成可能な Web スパイダー/クローラーを作成する必要があり、Scrapy の使用を考えています。しかし、ドメインと許可された URL regex:es をハードコードすることはできません。代わりに、これは GUI で構成できます。

ドメインと許可された URL regex:es が動的に構成可能な Scrapy でスパイダーまたはスパイダーのセットを (できるだけ簡単に) 作成するにはどうすればよいですか? たとえば、構成をファイルに書き込むと、スパイダーはそれを何らかの方法で読み取ります。

4

4 に答える 4

10

警告:この回答はScrapy v0.7に対するもので、それ以降、スパイダーマネージャーのAPIが大幅に変更されました。

デフォルトのSpiderManagerクラスをオーバーライドし、データベースまたは他の場所からカスタムルールをロードし、独自のルール/正規表現とdomain_nameを使用してカスタムスパイダーをインスタンス化します。

mybot / settings.py:

SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager'

mybot / spidermanager.py:

from mybot.spider import MyParametrizedSpider

class MySpiderManager(object):
    loaded = True

    def fromdomain(self, name):
        start_urls, extra_domain_names, regexes = self._get_spider_info(name)
        return MyParametrizedSpider(name, start_urls, extra_domain_names, regexes)

    def close_spider(self, spider):
        # Put here code you want to run before spiders is closed
        pass

    def _get_spider_info(self, name):
        # query your backend (maybe a sqldb) using `name` as primary key, 
        # and return start_urls, extra_domains and regexes
        ...
        return (start_urls, extra_domains, regexes)

そして今、mybot /spider.pyにあるカスタムスパイダークラス:

from scrapy.spider import BaseSpider

class MyParametrizedSpider(BaseSpider):

    def __init__(self, name, start_urls, extra_domain_names, regexes):
        self.domain_name = name
        self.start_urls = start_urls
        self.extra_domain_names = extra_domain_names
        self.regexes = regexes

     def parse(self, response):
         ...

ノート:

  • ルールシステムを利用したい場合は、CrawlSpiderを拡張することもできます
  • スパイダーを実行するには、次を使用します。 ./scrapy-ctl.py crawl <name>ここで、nameSpiderManager.fromdomainに渡され、バックエンドシステムからより多くのスパイダー情報を取得するためのキーです。
  • ソリューションはデフォルトのSpiderManagerをオーバーライドするため、従来のスパイダー(SPIDERごとのPythonモジュール)のコーディングは機能しませんが、これは問題ではないと思います。デフォルトのスパイダーマネージャーの詳細TwistedPluginSpiderManager
于 2010-03-07T18:19:52.610 に答える
4

必要なのは、動的にスパイダー クラスを作成し、お気に入りのジェネリック スパイダー クラスをサブクラス化しscrapy(CrawlSpiderサブクラスにrules追加された、 またはなど)、 、、および場合によっては(および/またはなど) を取得または推測するときにXmlFeedSpider追加することです。 GUI(または構成ファイルなど)から。domain_namestart_urlsextra_domain_namesstart_requests()

Python を使用すると、このようなクラス オブジェクトの動的な作成を簡単に実行できます。非常に単純な例は次のとおりです。

from scrapy import spider

def makespider(domain_name, start_urls,
               basecls=spider.BaseSpider):
  return type(domain_name + 'Spider',
              (basecls,),
              {'domain_name': domain_name,
               'start_urls': start_urls})

allspiders = []
for domain, urls in listofdomainurlpairs:
  allspiders.append(makespider(domain, urls))

これにより、非常に必要最小限のスパイダー クラスのリストが得られますparse。インスタンス化する前に、それらにメソッドを追加することをお勧めします。味の季節...;-)。

于 2010-03-07T17:17:02.750 に答える
3

どーもで恥知らずな自己PR!プロジェクトの例にあるように、クローラーをインスタンス化する必要があります。

また、クローラーを実行時に構成可能にする必要があります。これは、構成が変更されたときに構成をクローラーに渡し、実行時に設定をオーバーライドするだけです。

于 2010-03-07T16:47:14.137 に答える
0

現在、これらの目的のためにスクレイピーを構成するのは非常に簡単です:

  1. アクセスする最初の URL については、スパイダー呼び出しの属性としてそれを渡し、関数を-a使用してスパイダーの起動方法を設定できます。start_requests

  2. allowed_domainsスパイダーの変数を設定する必要はありません。そのクラス変数を含めない場合、スパイダーはすべてのドメインを許可できます。

最終的には次のようになります。

class MySpider(Spider):

    name = "myspider"

    def start_requests(self):
        yield Request(self.start_url, callback=self.parse)


    def parse(self, response):
        ...

そして、あなたはそれを呼び出す必要があります:

scrapy crawl myspider -a start_url="http://example.com"
于 2016-12-20T02:05:03.067 に答える