1. 程式人生 > >向scrapy中的spider傳遞引數的幾種方法

向scrapy中的spider傳遞引數的幾種方法

有時需要根據專案的實際需求向spider傳遞引數以控制spider的行為,比如說,根據使用者提交的url來控制spider爬取的網站。在這種情況下,可以使用兩種方法向spider傳遞引數。

第一種方法,在命令列用crawl控制spider爬取的時候,加上-a選項,例如:

scrapy crawl myspider -a category=electronics

然後在spider裡這樣寫:

import scrapy

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

    def __init__(self, category=None
, *args, **kwargs
): super(MySpider, self).__init__(*args, **kwargs) self.start_urls = ['http://www.example.com/categories/%s' % category] # ...
也就是在spider的建構函式里加上帶入的引數即可。

第二種方法,在用scrapyd控制spider的時候,可以向schedule.json傳送-d選項加入引數,同樣的,也需要在spider的建構函式裡如上寫法。例如:

$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

另外,如果需要在scrapy發出的request上加入引數,可以使用request的meta引數,然後就可以相應的在返回的respose物件中獲得傳入的引數。這在某些情況下相當有用,比如說需要確定這個url是哪個使用者請求爬取的,可以先用上面兩種方法之一將資訊傳遞給spider,spider就可以把這個資訊加入到request中,然後在相應的reponse中就可以將這個資訊與從url的頁面中獲得的資訊一起存入資料庫。例如:

def parse_page1(self, response):
    item = MyItem()
    item['main_url'] = response
.url request = scrapy.Request("http://www.example.com/some_page.html", callback=self.parse_page2) request.meta['item'] = item return request def parse_page2(self, response): item = response.meta['item'] item['other_url'] = response.url return item