ユーザー定義の引数をスクラピーズのスパイダーに渡そうとしています。誰かがそれを行う方法について提案できますか?
どこかでパラメータについて読んだのですが、-a
使い方がわかりません。
ユーザー定義の引数をスクラピーズのスパイダーに渡そうとしています。誰かがそれを行う方法について提案できますか?
どこかでパラメータについて読んだのですが、-a
使い方がわかりません。
スパイダー引数は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が指摘しているように、スパイダーは属性として引数にアクセスできます
以前の回答は正しかったが__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
そしてそれはうまくいきます。
クロールコマンドで引数を渡すには
スクレイプクロール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','')
-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]
#
..。
それが動作します :)
または、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のドキュメントを参照してください