使用scrapy ImagesPipeline爬取图片资源的示例代码

2023-12-16Python编程
37

使用Scrapy内置的ImagesPipeline可以非常方便地爬取网页上的图片资源。下面是完整的攻略和示例代码:

1. 在settings.py中设置ImagesPipeline

首先需要在项目的settings.py文件中进行一些配置。具体如下:

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1
}

IMAGES_STORE = '/path/to/your/images/directory'
  • ITEM_PIPELINES中添加'scrapy.pipelines.images.ImagesPipeline': 1,表示该请求需要经过ImagesPipeline处理
  • IMAGES_STORE设置图片存储的目录路径

2. 在Spider中使用item传递图片链接

在自己的Spider中,需要定义一个item,用于存储图片的链接地址和其他信息:

import scrapy

class MyItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()

image_urls字段存储的是图片的链接地址,images字段会在下载完成后自动生成,存储图片的本地路径。

3. 在Spider中yield item并指定image_urls字段

在Spider中,需要在解析网页的流程中yield item,并在item中指定image_urls字段:

import scrapy

from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = [
        'http://www.example.com',
        'http://www.example.com/page/2',
        'http://www.example.com/page/3',
    ]

    def parse(self, response):
        item = MyItem()
        item['image_urls'] = response.css('img::attr("src")').getall()
        yield item

在这个示例中,我们从响应中获取所有图片的src属性,并存入item的image_urls中。

4. 运行spider并查看运行效果

在运行Spider之前,需要确保IMAGES_STORE设置的目录存在,并有写入权限。

接下来就可以运行我们的Spider,Scrapy会自动从指定的链接下载图片资源,保存至IMAGES_STORE设置的目录中。

可以在Spider运行时添加-v INFO参数,查看下载进度。

scrapy crawl myspider -v INFO

示例1:下载豆瓣读书封面图片

下面是下载豆瓣读书封面图片的示例代码:

import scrapy

from myproject.items import MyItem

class DoubanBooksSpider(scrapy.Spider):
    name = 'doubanbooks'
    start_urls = [
        'https://book.douban.com/top250',
    ]

    def parse(self, response):
        for book in response.css('tr.item'):
            item = MyItem()
            item['title'] = book.css('div.pl2 a::text').get()
            item['image_urls'] = [book.css('img::attr(src)').get()]
            yield item

在这个示例中,我们可以获取豆瓣读书榜单的前250本图书的封面,保存在本地文件。

示例2:下载糗事百科用户头像图片

下面是下载糗事百科用户头像图片的示例代码:

import scrapy

from myproject.items import MyItem

class QSBKSpider(scrapy.Spider):
    name = 'qsbk'
    start_urls = [
        'https://www.qiushibaike.com/',
    ]

    def parse(self, response):
        for user in response.css('div.article'):
            item = MyItem()
            item['username'] = user.css('div.header a::text').get()
            item['user_url'] = user.css('div.header a::attr(href)').get()
            item['image_urls'] = [user.css('img.avatar::attr(src)').get()]
            yield item

在这个示例中,我们可以获取糗事百科上的用户头像,并保存在本地文件。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103