如何利用scrapy 自带的imagespipeline 下载图片?
今天就来解决这个问题:
首先创建scrapy 项目

# 在 douban文件夹下创建一个 douban_movie_image项目

scrapy3 startproject douban_movie_image douban

看项目的具体文件夹:


➜  py tree douban
douban
├── douban_movie_image # 项目文件夹
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── items.cpython-36.pyc
│   │   ├── pipelines.cpython-36.pyc
│   │   └── settings.cpython-36.pyc
│   ├── items.py # 对要爬取数据的模型定义
│   ├── middlewares.py  #  
│   ├── pipelines.py # 数据处理
│   ├── settings.py # 对Scrapy的配置
│   ├── settings.pyc
│   └── spiders
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── __pycache__
│       │   ├── __init__.cpython-36.pyc
│       │   └── movie.cpython-36.pyc
│       └── movie.py # spider
└── scrapy.cfg # 爬虫配置文件

首先先运行一下 项目:

scrapy crawl movie

显示了好多东东
【Python爬虫实战】scrapy 利用自带的 imagespipeline下载图片-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客

看着心烦?设置不让他显示了:

打开settings.py,添加如下代码:

# 只输出 error日志,其他的info debug 都不让它输出
LOG_LEVEL='ERROR'

ITEM_PIPELINES = {
   'douban_movie_image.pipelines.DoubanMovieImagePipeline': 300,
    "scrapy.pipelines.images.ImagesPipeline":1, # scrapy 默认的下载中间件
}

# 下载图片的字段 在item 中设置img_url字段
IMAGES_URLS_FIELD = 'img_url' 
# 图片保存路径
IMAGES_STORE = os.path.dirname(os.path.abspath(__file__))

"""
Logging
Scrapy提供了log功能。您可以通过 logging 模块使用。

Log levels
Scrapy提供5层logging级别:
CRITICAL - 严重错误(critical)
ERROR - 一般错误(regular errors)
WARNING - 警告信息(warning messages)
INFO - 一般信息(informational messages)
DEBUG - 调试信息(debugging messages)
默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG,默认的日志格式为DEBUG级别

如何设置log级别
您可以通过终端选项(command line option) --loglevel/-L 或 LOG_LEVEL 来设置log级别。

scrapy crawl tencent_crawl -L INFO

可以修改配置文件settings.py,添加

LOG_LEVEL='INFO'

"""

再次运行一下,啥都没有返回,是不是程序出问题了啊

➜  douban scrapy3 crawl movie
➜  douban
# 再次运行一下,啥都没有返回,是不是程序出问题了啊

修改一下:movie.py 的parse函数:

    def parse(self, response):
        print(response.url)

再次运行一下

➜  douban scrapy3 crawl movie
https://movie.douban.com/top250
➜  douban

再次在si

修改items.py


import scrapy


class DoubanMovieImageItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    img_url = scrapy.Field()
    # 存储要下载的 图片url

程序没问题怎么把抓取豆瓣的top 250 的电影封面下载下来?

首先修改下movie.py 中的MovieSpider

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from douban_movie_image.items import DoubanMovieImageItem

class MovieSpider(scrapy.Spider):
    name = 'movie'
    allowed_domains = ['movie.douban.com']
    # start_urls =["https://movie.douban.com/top250"]
    def start_requests(self):
        for x in range(0, 225+25, 25):
            url = "https://movie.douban.com/top250?start={}".format(x)
            yield Request(url, dont_filter=True)
           # Request 对象时增加一个参数 dont_filter=True,从而对此请求禁用掉调度器中的过滤。


【Python爬虫实战】scrapy 利用自带的 imagespipeline下载图片-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客
根据

十行代码获取豆瓣电影数据

采集豆瓣豆瓣电影top 250 第一步:先进行分析 打开网址: https://movie.douban.com/top…


修改一下类方法parse

    def parse(self, response):
        print(response.url)

        # print(response.status)
        items = DoubanMovieImageItem()
        for item in response.css('.item'):

            items['img_url'] = item.css('.pic img::attr(src)').extract()

            print(items)
            yield items
            # yield item 传送给 pipelines


注意items['img_url'] = item.css('.pic img::attr(src)').extract()
其中为啥要用 .extract(),有人会有疑问了
因为从源码中得知:

    def get_media_requests(self, item, info):
        return [Request(x) for x in item.get(self.images_urls_field, [])]
        # 要返回一个list 才能是使用

到此项目完成的差不多了,让我们看看效果吧:

【Python爬虫实战】scrapy 利用自带的 imagespipeline下载图片-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客
【Python爬虫实战】scrapy 利用自带的 imagespipeline下载图片-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客
HTTPX 基础教程-新乡seo|网站优化,网站建设_微信公众号:zeropython—昊天博客