scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
參數meta說明:
1)meta是一個字典,主要用於解析函數之間傳遞值;
2)Request對象接受一個meta參數,即一個字典對象,同時Response對象有一個meta屬性能夠取到相應request傳過來的meta;
即:一方傳遞,另外一方接收
問題:
meta傳遞值,有時候當前爬蟲解析出來的數據須要重複抓取,獲取到的值有時須要傳遞給下一個函數
可是 items= response.meta['item'] 接收的時候一直是一樣的值
解決:
在yield的時候,meta參數的值作深度拷貝就能夠了
yield scrapy.Request(detail_url,
callback=self.next_page,
meta={'item':
deepcopy(item)})
結合代碼說明爲何爬取圖書數據重複時須要deepcopy? -----這裏省略代碼,理解用法便可
- a = deepcopy(b) # 至關於強制傳值
- scrapy中的內容是異步執行的,解析函數可能同時在執行,操做的是同一個item,
- 大分類下的全部的圖書用的是一個item字典
補充:
copy與deepcopy區別:
個人理解是:copy 至關於一個替身,只是表面的假象,真主換動做了替身也要隨着變;
deepcopy 看成一對雙胞胎,雖然類似,但其實是各自獨立的特徵