2017-03-31 52 views
1

我使用scrapy抓取網站 我這是怎麼保持登錄後的餅乾罐如何使用Scrapy下載圖像,需要餅乾

def start_requests(self): 
    return [scrapy.Request("https://www.address.com", meta = {'cookiejar' : 1}, callback = self.post_login)] 


def post_login(self, response): 
    print('Preparing login') 
    return [FormRequest.from_response(response, #"http://www.zhihu.com/login", 
          meta = {'cookiejar' : response.meta['cookiejar']}, 
          headers = self.headers, 
          formdata = { 
           'username': 'user', 
           'password': 'pass123' 
          }, 
          callback = self.after_login, 
         )] 

然後,每個請求我將需要

yield scrapy.Request(curr, meta={'cookiejar':response.meta['cookiejar']}, callback=self.parse_detail) 

一切順利,直到我需要從網站上抓取圖像。 我需要使用scrapy的urllib.request.urlretrive(),imagePipeline或類似工具來打開image_url。

但我怎樣才能通過我的餅乾罐呢?否則,它將被重定向到登錄頁面。

或者有沒有辦法直接用scrapy請求下載圖片?

謝謝eLRuLL,爲解決這個問題對我來說 但需要的代碼從IO進口BytesIO而不是從StringIO的進口StringIO的 少許修改在python3

,然後使用BytesIO在以下碼。

+0

安裝PIL爲什麼你需要'urllib',使圖像的要求嗎?如果你做了scrapy請求,它會自動加載cookie – eLRuLL

+0

我想下載圖像,有沒有辦法讓圖像內容與scrapy請求? –

+0

是你的問題嗎?如何將scrapy響應解析爲圖像對象? – eLRuLL

回答

1

response.body有你需要的信息,你可以稍後解析它是什麼。

我不能完全肯定這會爲每個圖像文件類型的工作,但你可以在response.headers['content-type']更多的信息,這樣你就可以知道哪些文件類型,它實際上是並使用相應的Python模塊來處理該文件類型:

from PIL import Image 
from StringIO import StringIO 

... 

    def parse_image(self, response): 
     i = Image.open(StringIO(response.body)) 
     i.save("imagefile.png") 
     ... 

與你做了scrapy請求並保存了圖像(這是保存在與你的項目相同的目錄中)。

pip install Pillow

+0

感謝您的幫助,您拯救我的一天,讓我試試這個方法 –

+0

謝謝,它運作良好,但在我的情況下,我需要使用BytesIO來代替。 –

+0

不錯,它可以幫助! – eLRuLL