• scrapy框架使用-下载图片,使用urllib,使用requests,使用imagepipeline,


    ###

    这是使用的urllib,

     ####

    使用requests下载图片

    import requests
    
    # 这是一个图片的url
    url = 'http://yun.itheima.com/Upload/Images/20170614/594106ee6ace5.jpg'
    response = requests.get(url)
    # 获取的文本实际上是图片的二进制文本
    img = response.content
    # 将他拷贝到本地文件 w 写  b 二进制  wb代表写入二进制文本
    with open( './a.jpg','wb' ) as f:
        f.write(img)

    ####

    可见urllib,下载图片是更加的方便的,

    ####

    使用scrapy自带的imagepipeline爬取图片

    spider:

    # -*- coding: utf-8 -*-
    import scrapy
    import json
    import re
    from urllib import parse
    from ..items import BaiduimageItem
     
     
    class ImagesSpider(scrapy.Spider):
        name = 'images'
        allowed_domains = ['image.baidu.com']
        word_origin = input("请输入搜索关键字:")
        word = parse.quote(word_origin)
        url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&is=&fp=result&queryWord=" + word + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=" + word + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn={}&rn=30&gsm=1e&1586660816262="
     
        def start_requests(self):
            #页数可调整,开始页30,每次递增30
            for pn in range(30,151,30):
                url=self.url.format(pn)
                yield scrapy.Request(url=url,callback=self.parse)
     
        def parse(self, response):
            #正则匹配符合条件的thumbURL
            regex = '"thumbURL":"(.*?)"'
            pattern = re.compile(regex, re.S)
            links = pattern.findall(response.text)
            item=BaiduimageItem()
            #将搜索内容赋值给item,创建文件夹会用到
            item["word"]=self.word_origin
            for i in links:
                item["link"]=i
     
                yield item

    ###

    这一步要注意的,

    1,url的编码问题,

    2,正则匹配到所有的图片url,

    pipelines.py

    from scrapy.pipelines.images import ImagesPipeline
    import scrapy
    import hashlib
    from scrapy.utils.python import to_bytes
     
    class BaiduimagePipeline(ImagesPipeline):
     
        word=""
        
        # 重写ImagesPipeline里的get_media_requests函数
        # 原函数的请求不适应与本程序
        def get_media_requests(self, item, info):
            self.word=item['word']
            yield scrapy.Request(url=item['link'])
        
        # 重写ImagesPipeline里的file_path函数
        # 原函数return 'full/%s.jpg' % (image_guid) 
        # 我们将其改为自己想存放的路径地址
        def file_path(self, request, response=None, info=None):
            image_guid = hashlib.sha1(to_bytes(request.url)).hexdigest()

    ####

    需要重写两个函数,

    此处class BaiduimagePipeline继承了scrapy给我们提供的ImagesPipeline图片处理管道,为了让这个模块适应我们的程序,需要重写两个函数。

    这里我将item中的word参数复制给了一个全局变量,目的是传递给file_path。也可以使用scrapy.Request(meta={})去传递

    settings.py

    ITEM_PIPELINES = {
       'baiduimage.pipelines.BaiduimagePipeline': 300,
    }
     
     
    IMAGES_STORE= 'D:\图片\'

    在settings.py里IMAGES_STORE是图片存储的路径

    ImagesPipeline中的from_setting会调用 IMAGES_STORE,store_uri=settings['IMAGES_STORE']

    #####

    item

    import scrapy
     
     
    class BaiduimageItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        link=scrapy.Field()
        word=scrapy.Field()
        pass

    ####

    #####

    ####

  • 相关阅读:
    JVM描述符标识字符含义
    finally代码块的执行
    职业发展心之某日与领导的聊天
    springboot由于bean加载顺序导致的问题
    springboot自动配置国际化失效分析
    springboot 2.1.3.RELEASE添加filter,servlet源码学习
    jquery 数组添加不重复数据
    Oracle执行存储过程报错——ora-01031:权限不足
    oracle 存储过程使用动态sql
    将jsp页面的<s:iterator>的数据返回到action
  • 原文地址:https://www.cnblogs.com/andy0816/p/15257005.html
Copyright © 2020-2023  润新知