当前位置:   article > 正文

使用scrapy框架爬取网页图片——详解_scrapy.request 返回图片

scrapy.request 返回图片

前言:使用scrapy框架爬取网页图片,并做持久化存储!使用scrapy做图片存储必须先下载 Pillow 库

安装方法:pip install Pillow

目标网址https://sc.chinaz.com/tupian/huaxuetupian.html

spider爬虫对象源码:

  1. import scrapy
  2. from imgsPro.items import ImgsproItem
  3. import time
  4. class ImgsSpider(scrapy.Spider):
  5. # 爬虫文件名,运行文件的时候就是使用该名字
  6. name = 'imgs'
  7. # 允许请求的url,建议直接注释掉
  8. # allowed_domains = ['www.sc.chinaz.com.com']
  9. # 目标url
  10. start_urls = ['https://sc.chinaz.com/tupian/huaxuetupian.html']
  11. # scrapy自带的请求解析方法
  12. def parse(self, response):
  13. # 使用xpath匹配所有的图片页面url与名称
  14. tree = response.xpath('//div[@id="container"]/div')
  15. # 匹配img_page (href)
  16. img_page_url=tree.xpath('./div/a/@href').extract()
  17. # 匹配图片名称(alt)
  18. imgalt=tree.xpath('./div/a/@alt').extract()
  19. # 使用for循环遍历向每一页的图片url发送请求:
  20. for page,alt in zip(img_page_url,imgalt):
  21. # 拼接url(爬取的url很多都不是完整的!)
  22. page = 'https:' + page
  23. # print(page)
  24. # print(alt)
  25. # 实例化item对象(item就是一个空字典)
  26. item = ImgsproItem()
  27. # 将爬取到的值以字典形式存储到item中!
  28. item['alt'] =alt
  29. # print(item)
  30. # 单独向每个img_page_url发送请求:
  31. time.sleep(0.6)
  32. yield scrapy.Request(url=page, callback=self.imgs_parse,meta={'item':item})
  33. # 自定义的请求解析方法
  34. def imgs_parse(self,response):
  35. # 接收item(因为item是在parse方法中定义的所以需要在自定义方法imgs_parse接收!)
  36. item = response.meta['item']
  37. # print(item)
  38. # print(response.text)
  39. time.sleep(1.7)
  40. # 使用xpath解析图片页中的图片url(.extract_first()表示提取列表中的第一个值)
  41. img_url = response.xpath('//div[@class="imga"]/a/@href').extract_first()
  42. img_url = 'https:' + img_url # 拼接url
  43. item['img_url']=img_url # j将获取到的url存储到item中方便提交给管道!
  44. # print(img_url)
  45. yield item # 将图片名称跟图片的url通过item提交给管道做解析并存储!

item对象源码:

  1. # Define here the models for your scraped items
  2. #
  3. # See documentation in:
  4. # https://docs.scrapy.org/en/latest/topics/items.html
  5. import scrapy
  6. class ImgsproItem(scrapy.Item):
  7. # define the fields for your item here like:
  8. # name = scrapy.Field()
  9. # 定义爬虫文件中封装在item对象中的对象(atl是图片名称,img_url是图片地址)
  10. alt = scrapy.Field()
  11. img_url = scrapy.Field()
  12. pass

pilines管道对象源码:

  1. # Define your item pipelines here
  2. #
  3. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  4. # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
  5. # useful for handling different item types with a single interface
  6. #下面的语句都是需要自己定义
  7. #导入ImagesPipelin管道类(处理图片数据的!)
  8. from scrapy.pipelines.images import ImagesPipeline
  9. import time
  10. import scrapy #导入scrapy(必须)
  11. # 创建一个图片管道类
  12. class ImgsproPipeline(ImagesPipeline):
  13. print('正在初始化img管道对象')
  14. #图片url请求方法:
  15. def get_media_requests(self, item, info):
  16. # print(item)
  17. # 手动发送requsts请求
  18. time.sleep(1.26)
  19. # print(item['img_url'])
  20. # print(item['alt'])
  21. # 向item中的图片url发送请求!(item是一个dict)
  22. yield scrapy.Request(url=item['img_url'])
  23. # 定义图片名称及路径:
  24. def file_path(self, request, response=None, info=None, *, item):
  25. # 定义图片存储名称
  26. imgName=request.url.split('/')[-1]
  27. print(f'正在下载:{imgName}')
  28. # 返回图片名称,写入到指定目录文件中
  29. return imgName
  30. def item_completed(self, results, item, info):
  31. # 返回item给下一个管道对象
  32. return item
  33. # 自定义一个__del__方法(方便最后执行!)
  34. def __del__(self):
  35. print('已全部下完毕!')

seting文件中的设置:

【adi:IMAGES_STORE = '图片存储路径'  该参数需要自己手动添加!图片路径中不包含图片名称!】

 

以上就是crapy爬取图片的全部内容!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/437277
推荐阅读
相关标签
  

闽ICP备14008679号