当前位置:   article > 正文

python_爬虫 20 Scrapy框架之(六)下载文件和图片_python爬虫框架scrapy 下载文件

python爬虫框架scrapy 下载文件

目录

下载文件和图片

一、为什么要选择使用 scrapy 内置的下载文件的方法:

二、下载文件的 Files Pipelines

三、下载图片的 Images Pipeline:

四、汽车之家 CRV 图片下载实战

setting.py

items.py

pipelines.py

crv_spider.py


 

下载文件和图片

    Scrapy 为下载 item 中包含的文件(比如在爬取到产品时,同时也想保存对应的图片)提供了一个可重用的 item pipelines。这写 pipeline 有些共同的地方和结构(我们称之为 media pipeline)。一般来说你会使用 Files Pipelines  或是 Images Pipelines。

 

一、为什么要选择使用 scrapy 内置的下载文件的方法:

    1、避免重新下载最近已经下载过的文件。
    2、可以方便的指定文件存储的路径。
    3、可以将下载的图片转换成通用的格式。比如 png, jpg
    4、可以方便的生成缩略图
    5、可以方便的检测图片的宽和高,确保他们满足最小的限制。
    6、异步下载,效率非常高。
    

二、下载文件的 Files Pipelines

    当使用 Files Pipeliens 下载文件的时候,按照以下步骤来完成:
    1、定义好一个 Item, 然后在这个 item 中定义两个属性,分别为 file_urls 以及 files, file_urls 是用来存储需要下载的图片的 url 链接,需要给一个列表。
    2、当文件下载完成后,会把文件下载的相关信息存储到 item 的 files 属性中。比如下载路径, 下载的url和文件的校验码等。
    3、在配置文件 setting.py 中配置 FILES_STORE ,这个配置是用来设置文件下载下来的路径。
    4、启动 pipeline: 在文件 setting.py 中的 ITEM_PIPELINES 设置 scrapy.pipeline.files.FilesPipeline:1 。

 

三、下载图片的 Images Pipeline:

    当使用 Images Pipeline 下载文件的时候,按照以下步骤来完成:
    1、定义好一个 Item, 然后在这个 item 中定义两个属性,分别为 image_urls 以及 images 。image_urls 是用来存储需要下载的图片的url链接,需要给一个列表。
    2、当文件下载完成后,会把文件下载的相关信息存储到 item 的 images 属性中。比如下载路径、下载的 url 和图片的校验等。
    3、在配置文件 setting.py 中配置 IMAGES_STORE, 这个配置是用来设置图片下载下来的路径。
    4、启动 pipeline : 在文件 setting.py 中的 ITEM_PIPELINES 设置 scrapy.pipeline.images.ImagesPipeline:1 。

 

四、汽车之家 CRV 图片下载实战

 通过 重写 ImagesPipeline 下载 CRV 这个款车的各类图片,代码如下:

setting.py

  1. import os
  2. BOT_NAME = 'crv'
  3. SPIDER_MODULES = ['crv.spiders']
  4. NEWSPIDER_MODULE = 'crv.spiders'
  5. ROBOTSTXT_OBEY = False
  6. DOWNLOAD_DELAY = 1
  7. DEFAULT_REQUEST_HEADERS = {
  8. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  9. 'Accept-Language': 'en',
  10. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
  11. }
  12. ITEM_PIPELINES = {
  13. 'crv.pipelines.CrvImagesPipeline': 1,
  14. }
  15. IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "images")

items.py

  1. import scrapy
  2. class CrvItem(scrapy.Item):
  3. title = scrapy.Field()
  4. image_urls = scrapy.Field()
  5. images = scrapy.Field()

pipelines.py

  1. import os
  2. from crv import settings
  3. from urllib import request
  4. from scrapy.pipelines.images import ImagesPipeline
  5. class CrvImagesPipeline(ImagesPipeline):
  6. def file_path(self, request, response=None, info=None, *, item=None):
  7. # 这个方法是在图片将要被存储的时候调用,来获取这个图片的存储路径。
  8. category = item["title"]
  9. category_path = os.path.join(settings.IMAGES_STORE, category)
  10. image_name = request.url.split("_")[-1]
  11. image_path = os.path.join(category_path, image_name)
  12. print("image_path ; {}".format(image_path))
  13. return image_path

crv_spider.py

  1. import scrapy
  2. from crv.items import CrvItem
  3. class CrvSpiderSpider(scrapy.Spider):
  4. name = 'crv_spider'
  5. allowed_domains = ['car.autohome.com.cn']
  6. start_urls = ['https://car.autohome.com.cn/pic/series-s46246/314.html#pvareaid=3454542']
  7. def parse(self, response):
  8. divs = response.xpath("//div[@class='column grid-16']/div")[2:] # 过滤掉1,2 行
  9. for div in divs:
  10. print(div.xpath(".//div[@class='uibox-title']"))
  11. title = div.xpath(".//div[@class='uibox-title']/a/text()").get()
  12. urls = div.xpath(".//ul/li/a/img/@src").getall()
  13. urls = list(map(response.urljoin, urls))
  14. item = CrvItem(title=title, image_urls=urls)
  15. print(item)
  16. yield item

目录

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

闽ICP备14008679号