1. 程式人生 > >scrapy爬取圖片

scrapy爬取圖片

深復制 cal xtra n) containe ... line example 定義

一.遇到的問題總結

scrapy中爬取的多有數據(通過spider.py),最後必須通過items實例格式化後,傳遞到pipelines中進行進一步的處理(註意scrapy內置的pipelines文件,像下載圖pain)

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

把需要傳遞的信息賦值給這個叫meta的變量,但meta只接受字典類型的賦值,因此要把待傳遞的信息改成“字典”的形式,即:
meta={‘key1‘:value1,‘key2‘:value2}
如果想在下一個函數中取出value1,只需得到上一個函數的meta[‘key1‘]即可,因為meta是隨著Request產生時傳遞的,下一個函數得到的Response對象中就會有meta,
即response.meta,
前一個函數的meta和後一個函數的meta是相同的,取value1則是value1=response.meta[‘key1‘]

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

 1 作者:烏爾班
 2 鏈接:https://www.zhihu.com/question/54773510/answer/146971644
 3 來源:知乎
 4 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
 5 
 6 class example(scrapy.Spider):
 7     name=example
 8     allowed_domains=[example.com]
 9     start_urls=[http://www.example.com
] 10 def parse(self,response): 11 #從start_urls中分析出的一個網址賦值給url 12 url=response.xpath(.......).extract() 13 #ExamleClass是在items.py中定義的,下面會寫出。 14 """記住item本身是一個字典""" 15 item=ExampleClass() 16 item[name]=response.xpath(.......).extract()
17 item[htmlurl]=response.xpath(.......).extract() 18 """通過meta參數,把item這個字典,賦值給meta中的‘key‘鍵(記住meta本身也是一個字典)。 19 Scrapy.Request請求url後生成一個"Request對象",這個meta字典(含有鍵值‘key‘,‘key‘的值也是一個字典,即item) 20 會被“放”在"Request對象"裏一起發送給parse2()函數 """ 21 yield Request(url,meta={key:item},callback=parse2) 22 def parse2(self,response): 23 item=response.meta[key] #(準確的說是一種淺復制,見文末)實現了兩個函數之間參數的共享,相當於 item=item,操作的是同一個items.py中的item字典 24 """這個response已含有上述meta字典,此句將這個字典賦值給item, 25 完成信息傳遞。這個item已經和parse中的item一樣了""" 26 item[text]=response.xpath(.......).extract() 27 #item共三個鍵值,到這裏全部添加完畢了 28 yield item

items.py中語句如下:

1 class ExampleClass(scrapy.Item):
2     name = scrapy.Field()
3     htmlurl = scrapy.Field()
4     text=scrapy.Field()

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

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

1 def start_requests(self):
2     yield Request(url,meta={cookiejar:1},callback=self.parse)
需要說明的是,meta給‘cookiejar’賦值除了可以表明要把cookie傳遞下去,還可以對cookie做標記。一個cookie表示一個會話(session),如果需要經多個會話對某網站進行爬取,可以對cookie做標記,1,2,3,4......這樣scrapy就維持了多個會話。
 1 def parse(self,response):
 2     key=response.meta[cookiejar]    #經過此操作後,key=1【cookiejar:1---->key:cookiejar----->key=reponse.meta[‘cookiejar‘]    =1】
 3     yield Request(url2,meta={cookiejar:key},callback=parse2)
 4 def parse2(self,response):
 5     pass
 6 

上面這段和下面這段是等效的:
1 def parse(self,response):
2     yield Request(url2,meta={cookiejar:response.meta[cookiejar]},callback=parse2)
3     #這樣cookiejar的標記符還是數字1
4 def parse2(self,response):
5     pass

傳遞cookie的第二種寫法:

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

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

寫spider方法時:

1 def start_requests(self):
2     yield Request(url,callback=self.parse)#此處寫self.parse或‘parse’都可以
3 def parse(self,response):
4     cj = response.meta.setdefault(cookie_jar, CookieJar())
5     cj.extract_cookies(response, response.request)
6     container = cj._cookies
7     yield Request(url2,cookies=container,meta={key:container},callback=parse2)
8 def parse2(self,response):
9     pass

meta是淺復制,必要時需要深復制。

可以這樣引入:

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






作者:烏爾班
鏈接:https://www.zhihu.com/question/54773510/answer/146971644
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

scrapy爬取圖片