ユーザー定義の引数をスクレイピーのクモに渡そうとしています。誰でもそれを行う方法を提案できますか?
パラメータについて読んだ-a
どこかにあるが、それをどのように使用するかわからない。
スパイダーの引数は、-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が指摘するように 、スパイダーは引数として引数にアクセスできます
以前の回答は正しかったが、コンストラクターを宣言する必要はない(__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 -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','')
-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]
#
...
それが動作します :)