scrapy爬取圖片
阿新 • • 發佈:2018-04-22
深復制 cal xtra n) containe ... line example 定義
作者:烏爾班
鏈接:https://www.zhihu.com/question/54773510/answer/146971644
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
一.遇到的問題總結
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爬取圖片