欢迎访问宙启技术站
智能推送

Python爬虫框架Scrapy教程:使用选择器提取网页中的图片

发布时间:2023-12-12 07:22:40

Scrapy是一个流行的Python爬虫框架,它可以帮助开发者高效地抓取和提取网页数据。在Scrapy中,使用选择器可以方便地提取网页中的各种数据,包括文字、链接和图片等。

在本教程中,我们将使用Scrapy框架以及它的选择器功能来提取网页中的图片。我们将会实现一个简单的爬虫,用于抓取一个网页中的图片,并将这些图片保存到本地。

首先,我们需要安装Scrapy。可以通过在终端中运行以下命令来安装Scrapy:

pip install scrapy

安装完成后,我们可以创建一个新的Scrapy项目。在终端中,切换到你希望创建项目的目录,并运行以下命令:

scrapy startproject image_spider

这将创建一个名为image_spider的新项目,并在当前目录下生成相应的文件。

接下来,我们需要创建一个用于爬取图片的Spider(爬虫)。在终端中进入image_spider目录,并运行以下命令:

scrapy genspider image_spider example.com

这将创建一个名为image_spider的Spider,并且其起始网址为example.com。

在image_spider目录中,我们可以找到一个名为image_spider.py的文件。这个文件是我们刚刚生成的Spider的主要代码文件。

打开image_spider.py,我们可以看到一些默认的代码。我们需要将其修改为以下内容:

import scrapy

class ImageSpider(scrapy.Spider):
    name = 'image_spider'
    start_urls = ['http://example.com']

    def parse(self, response):
        # 使用选择器提取图片的URL
        image_urls = response.css('img::attr(src)').extract()
        
        # 打印提取到的图片URL
        for url in image_urls:
            print(url)

在这段代码中,我们定义了一个名为ImageSpider的Spider类。其中,name属性用于指定Spider的名字,start_urls属性用于设置起始网址。

在parse方法中,我们使用选择器来提取网页中的图片URL。具体来说,我们使用了response.css方法,其参数为一个CSS选择器,用于选择网页中的图片元素。我们使用'img::attr(src)'来选择img标签的src属性,从而提取出所有的图片URL。

在最后的循环中,我们将提取到的图片URL打印出来。当然,这只是一个简单的例子,你可以根据自己的需求对提取到的图片URL进行其他操作。

为了运行我们的Spider,我们需要在终端中进入image_spider目录,并运行以下命令:

scrapy crawl image_spider

这将运行我们的Spider,并开始爬取起始网址中的图片。在终端中,你将看到爬取到的图片URL被打印出来。

接下来,我们可以对Spider进行进一步的修改,以实现将爬取到的图片保存到本地。我们首先需要在Spider类的头部添加一个属性:

# 保存图片的文件夹路径
IMAGES_STORE = '/path/to/save/images'

其中,/path/to/save/images为你希望保存图片的文件夹路径。请确保该文件夹路径存在,并具有写入权限。

然后,在parse方法中,我们对提取到的图片URL进行处理,并进行保存:

import os
import scrapy
from scrapy.pipelines.images import ImagesPipeline

class ImageSpider(scrapy.Spider):
    name = 'image_spider'
    start_urls = ['http://example.com']
    IMAGES_STORE = '/path/to/save/images'

    def parse(self, response):
        # 使用选择器提取图片的URL
        image_urls = response.css('img::attr(src)').extract()
        
        # 进行图片保存
        for url in image_urls:
            yield {'image_urls': [url]}

    def item_completed(self, results, item, info):
        # 处理保存后的图片文件名
        image_path = [x['path'] for ok, x in results if ok]
        new_image_path = os.path.join(self.IMAGES_STORE, image_path[0])
        os.rename(os.path.join(self.IMAGES_STORE, image_path[0]), new_image_path)
        
        item['image_path'] = new_image_path
        return item

在这段代码中,我们使用了Scrapy内置的ImagesPipeline,来处理图片的保存。首先,我们使用yield关键字来将图片URL传递给ImagesPipeline。ImagesPipeline会自动下载并保存这些图片。

接着,在item_completed方法中,我们对保存后的图片文件进行了重命名操作,并且将新的文件路径保存到item中。这样,在后续的处理中,我们可以方便地获取保存的图片的本地路径。

为了使用ImagesPipeline,我们还需要在settings.py文件中添加一些配置。打开settings.py文件,找到以下部分,并进行修改:

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

# 设置图片保存的文件夹路径
IMAGES_STORE = '/path/to/save/images'

/path/to/save/images替换为你希望保存图片的文件夹路径。

最后,再次运行以下命令来启动我们的Spider:

scrapy crawl image_spider

这次,除了在终端中看到打印的图片URL外,你还将在指定的文件夹路径中看到保存的图片文件。

通过这个例子,你可以学习到如何使用Scrapy框架和选择器来提取网页中的图片,并将这些图片保存到本地。当然,Scrapy还提供了很多其他功能和工具,可以帮助你更加高效地进行复杂的爬虫开发。如果你对此感兴趣,可以进一步学习Scrapy的官方文档和其他相关资源。