回答:
スパイダー引数は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 superを使用する
# previously
super(MySpider, self).__init__(**kwargs) # python2
2018年の更新:@eLRuLLが指摘するように、スパイダーは属性として引数にアクセスできます
self.domain
でも、__init__
メソッドの外部からアクセスすることはできません。Pythonは未定義のエラーをスローします。ところで、なぜあなたはsuper
呼び出しを省略したのですか?PS。私はCrawlSpiderクラスで作業しています
__init__
は、spiderクラスのメソッドです。その実装自体はスパイダーの堅牢性を低下させるものではなく、キーワード引数のデフォルトを宣言できることを示すために回答に含まれていますが、これはオプションです。昨年指摘したように、使用getattr
する必要はありません。属性として引数にアクセスすることができます。たとえばself.category
、回答にあるようにself.domain
以前の答えは正しかったが__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]
#
...
それが動作します :)
あるいは、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およびその他のパラメーターを受け入れ、上記のスクラップスケジュールAPIを使用してタスクをスケジュールできることです。
詳細については、scrapyd APIのドキュメントを参照してください