scrapy的request的meta參數是什麼意思?

scrapy


Request中meta參數的作用是傳遞信息給下一個函數,使用過程可以理解成:

把需要傳遞的信息賦值給這個叫meta的變數,
但meta只接受字典類型的賦值,因此
要把待傳遞的信息改成「字典」的形式,即:
meta={"key1":value1,"key2":value2}

如果想在下一個函數中取出value1,
只需得到上一個函數的meta["key1"]即可,
因為meta是隨著Request產生時傳遞的,
下一個函數得到的Response對象中就會有meta,
即response.meta,
取value1則是value1=response.meta["key1"]

這些信息可以是任意類型的,比如值、字元串、列表、字典......方法是把要傳遞的信息賦值給字典的鍵,分析見如下語句(爬蟲文件):

class example(scrapy.Spider):
name="example"
allowed_domains=["example.com"]
start_urls=["http://www.example.com"]
def parse(self,response):
#從start_urls中分析出的一個網址賦值給url
url=response.xpath(".......").extract()
#ExamleClass是在items.py中定義的,下面會寫出。
"""記住item本身是一個字典"""
item=ExampleClass()
item["name"]=response.xpath(".......").extract()
item["htmlurl"]=response.xpath(".......").extract()
"""通過meta參數,把item這個字典,賦值給meta中的"key"鍵(記住meta本身也是一個字典)。
Scrapy.Request請求url後生成一個"Request對象",這個meta字典(含有鍵值"key","key"的值也是一個字典,即item)
會被「放」在"Request對象"里一起發送給parse2()函數 """
yield Request(url,meta={"key":item},callback="parse2")
def parse2(self,response):
item=response.meta["key"]
"""這個response已含有上述meta字典,此句將這個字典賦值給item,
完成信息傳遞。這個item已經和parse中的item一樣了"""
item["text"]=response.xpath(".......").extract()
#item共三個鍵值,到這裡全部添加完畢了
yield item

items.py中語句如下:

class ExampleClass(scrapy.Item):
name = scrapy.Field()
htmlurl = scrapy.Field()
text=scrapy.Field()

meta當然是可以傳遞cookie的(第一種):

下面start_requests中鍵『cookiejar』是一個特殊的鍵,scrapy在meta中見到此鍵後,會自動將cookie傳遞到要callback的函數中。既然是鍵(key),就需要有值(value)與之對應,例子中給了數字1,也可以是其他值,比如任意一個字元串。

def start_requests(self):
yield Request(url,meta={"cookiejar":1},callback=self.parse)

需要說明的是,meta給『cookiejar』賦值除了可以表明要把cookie傳遞下去,還可以對cookie做標記。一個cookie表示一個會話(session),如果需要經多個會話對某網站進行爬取,可以對cookie做標記,1,2,3,4......這樣scrapy就維持了多個會話。

def parse(self,response):
key=response.meta["cookiejar"] #經過此操作後,key=1
yield Request(url2,meta={"cookiejar":key},callback="parse2")
def parse2(self,response):
pass

上面這段和下面這段是等效的:

def parse(self,response):
yield Request(url2,meta={"cookiejar":response.meta["cookiejar"]},callback="parse2")
#這樣cookiejar的標記符還是數字1
def parse2(self,response):
pass

傳遞cookie的第二種寫法:

如果不加標記,可以用下面的寫法:

#先引入CookieJar()方法
from scrapy.http.cookies import CookieJar

寫spider方法時:

def start_requests(self):
yield Request(url,callback=self.parse)#此處寫self.parse或『parse』都可以
def parse(self,response):
cj = response.meta.setdefault("cookie_jar", CookieJar())
cj.extract_cookies(response, response.request)
container = cj._cookies
yield Request(url2,cookies=container,meta={"key":container},callback="parse2")
def parse2(self,response):
pass

meta是淺複製,必要時需要深複製。

可以這樣引入:

import copy
meta={"key":copy.deepcopy("value")}

以上


meta是一個dict,主要是用解析函數之間傳遞值,一種常見的情況:在parse中給item某些欄位提取了值,但是另外一些值需要在parse_item中提取,這時候需要將parse中的item傳到parse_item方法中處理,顯然無法直接給parse_item設置而外參數。 Request對象接受一個meta參數,一個字典對象,同時Response對象有一個meta屬性可以取到相應request傳過來的meta。所以解決上述問題可以這樣做:

def parse(self, response):
# item = ItemClass()
yield Request(url, meta={"item": item}, callback=self.parse_item)
def parse(self, response):
item = response.meta["item"]
item["field"] = value
yield item


推薦閱讀:

用python寫爬蟲時用自帶的urllib好還是用request庫好,還是兩個都要學?
C#多線程發送http請求效率是否比python慢?
一個爬蟲框架需要具備哪些功能?
爬蟲數據礦工的命運?
標準化的互聯網採集工具的前景在哪裡?

TAG:爬蟲計算機網路 | scrapy |