121

ユーザー定義の引数をスクラピーズのスパイダーに渡そうとしています。誰かがそれを行う方法について提案できますか?

どこかでパラメータについて読んだのですが、-a使い方がわかりません。

4

5 に答える 5

224

スパイダー引数はcrawl、オプションを使用してコマンドで渡され-aます。例えば:

scrapy crawl myspider -a category=electronics -a domain=system

スパイダーは属性として引数にアクセスできます。

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, category='', **kwargs):
        self.start_urls = [f'http://www.example.com/{category}']  # py36
        super().__init__(**kwargs)  # python3

    def parse(self, response)
        self.log(self.domain)  # system

Scrapyドキュメントからの抜粋:http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

2013年の更新:2番目の引数を追加

2015年の更新:文言を調整する

2016年の更新:新しい基本クラスを使用し、スーパーを追加してください。@Birlaに感謝します。

2017年の更新:Python3スーパーを使用

# previously
super(MySpider, self).__init__(**kwargs)  # python2

2018年の更新@eLRuLLが指摘しているように、スパイダーは属性として引数にアクセスできます

于 2013-03-25T15:21:52.877 に答える
49

以前の回答は正しかったが__init__、スクラピーズのスパイダーをコーディングするたびにコンストラクター()を宣言する必要はなく、以前のようにパラメーターを指定するだけで済みます。

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2

スパイダーコードでは、それらをスパイダー引数として使用できます。

class MySpider(Spider):
    name = 'myspider'
    ...
    def parse(self, response):
        ...
        if self.parameter1 == value1:
            # this is True

        # or also
        if getattr(self, parameter2) == value2:
            # this is also True

そしてそれはうまくいきます。

于 2016-12-13T14:07:27.923 に答える
20

クロールコマンドで引数を渡すには

スクレイプクロールmyspider-acategory ='mycategory' -a domain ='example.com'

引数を渡してscrapydで実行するには、-a-dに置き換えます

curl http://your.ip.address.here:port/schedule.json -d spider = myspider -d category ='mycategory' -d domain ='example.com'

スパイダーはコンストラクターで引数を受け取ります。


class MySpider(Spider):
    name="myspider"
    def __init__(self,category='',domain='', *args,**kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.category = category
        self.domain = domain

Scrapyはすべての引数をスパイダー属性として配置し、initメソッドを完全にスキップできます。コードが壊れないように、これらの属性を取得するためにgetattrメソッドを使用することに注意してください。


class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')

于 2015-09-08T11:33:51.443 に答える
10

-aオプションを使用してクロールコマンドを実行しているときに、スパイダー引数が渡されます。たとえば、ドメイン名を引数としてスパイダーに渡したい場合は、これを行います-

スクレイプクロールmyspider-adomain = "http://www.example.com"

そして、スパイダーのコンストラクターで引数を受け取ります。

class MySpider(BaseSpider):
    name = 'myspider'
    def __init__(self, domain='', *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [domain]
        #

..。

それが動作します :)

于 2015-09-12T16:48:19.697 に答える
0

または、start_urlとスパイダー名を渡すことができるAPIを公開するScrapyDを使用することもできます。ScrapyDには、スパイダーを停止/開始/ステータス/一覧表示するためのAPIがあります。

pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default

scrapyd-deployスパイダーを卵の形でデーモンにデプロイし、スパイダーのバージョンを維持します。スパイダーを起動するときに、使用するスパイダーのバージョンを指定できます。

class MySpider(CrawlSpider):

    def __init__(self, start_urls, *args, **kwargs):
        self.start_urls = start_urls.split('|')
        super().__init__(*args, **kwargs)
    name = testspider

curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"

追加の利点は、独自のUIを構築して、ユーザーからのURLおよびその他のパラメーターを受け入れ、上記のscrapydscheduleAPIを使用してタスクをスケジュールできることです。

詳細については、 scrapydAPIのドキュメントを参照してください

于 2020-01-28T13:56:12.207 に答える