向scrapy中的spider傳遞引數的幾種方法
阿新 • • 發佈:2019-02-08
有時需要根據專案的實際需求向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