2017-03-31 45 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