web-dev-qa-db-ja.com

スクレイピースパイダーでユーザー定義の引数を渡す方法

ユーザー定義の引数をスクレイピーのクモに渡そうとしています。誰でもそれを行う方法を提案できますか?

パラメータについて読んだ-aどこかにあるが、それをどのように使用するかわからない。

84
L Lawliet

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

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が指摘するように 、スパイダーは引数として引数にアクセスできます

155
Steven Almeroth

以前の回答は正しかったが、コンストラクターを宣言する必要はない(__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

そして、それだけで動作します。

21
eLRuLL

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

スクレイピークロールmyspider -a category = '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','')

9
Hassan Raza

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

スクレイピークロールmyspider -a domain = "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]
        #

...

それが動作します :)

7
Siyaram Malav