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

到此這篇關於如何向scrapy中的spider傳遞引數的幾種方法的文章就介紹到這了,更多相關scrapy spider傳遞引數內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!