Python爬虫之教你利用Scrapy爬取图片

下面我将详细讲解“Python爬虫之教你利用Scrapy爬取图片”的完整攻略。

标题

简介

在介绍爬虫之前,我们先介绍下Scrapy。Scrapy是一个Python编写的爬虫框架,它提供了一套完整的爬虫工具链,可用于从网站上提取结构化数据(例如,爬取图片、爬取文字信息等)。

安装Scrapy

要使用Scrapy,需要先将其安装,可以使用以下命令进行安装:

pip install scrapy

创建Scrapy工程

Scrapy的工程由多个组件组成,包括爬虫、中间件、下载器和管道等。我们可以使用Scrapy提供的命令行工具创建工程,命令如下:

scrapy startproject project_name

其中,project_name代表你的工程名称。

运行上述命令后,会生成一个名为project_name的文件夹,它包含了所有的Scrapy工程文件。

创建爬虫

创建爬虫是Scrapy工程开发的重点。我们需要在工程下新建一个爬虫文件,在该文件中编写爬虫的逻辑。

Scrapy提供了一个命令行工具用于创建爬虫:

scrapy genspider spider_name domain

其中,spider_name代表你的爬虫名称,domain代表你需要爬取的域名。

打开爬虫文件后,可以编写爬虫的逻辑。例如,如果我们需要爬取豆瓣电影首页的海报图像:

import scrapy

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["douban.com"]
    start_urls = ["https://www.douban.com/"]

    def parse(self, response):
        # 获取所有的海报图片
        for img in response.css("img.poster"):
            yield {
                "image_url": img.xpath("@src").get()
            }

在上述代码中,我们定义了一个名为douban的爬虫。使用allowed_domains属性指定我们需要爬取的域名。使用start_urls属性指定我们需要爬取的起始页面。在parse函数中,我们使用了CSS选择器来获取所有的海报图片,并把图片URL保存在字典中。

定义下载器中间件

定义下载器中间件可以实现在下载图片时添加代理、超时处理等功能。

import requests

class MyDownloaderMiddleware:
    def process_request(self, request, spider):
        proxies = {
            "http": "http://127.0.0.1:1087",
            "https": "http://127.0.0.1:1087"
        }
        response = requests.get(request.url, headers=request.headers, proxies=proxies, timeout=5)
        content_type = response.headers.get("content-type", "").lower()
        if "image" not in content_type:
            raise Exception("download failed")
        return scrapy.http.HtmlResponse(url=request.url, body=response.content, request=request, encoding="utf-8")

在上述代码中,我们定义了一个名为MyDownloaderMiddleware的下载器中间件。在process_request函数中,我们使用requests库发送请求,并设置了代理和超时时间。在请求返回后,我们判断响应的content-type是否为图片类型,如果是则返回一个包含图片内容的HtmlResponse对象。

我们需要将该中间件添加到Scrapy的下载器中间件中:

DOWNLOADER_MIDDLEWARES = {
    "myproject.downloadermiddlewares.MyDownloaderMiddleware": 543,
}

定义图片管道

定义管道是Scrapy工程开发的另一个重点。在管道中可以定义图片保存的路径、命名规则、文件格式等。

class MyImagesPipeline(ImagesPipeline):
    def file_path(self, request, response=None, info=None):
        return "images/" + request.url.split("/")[-1]

    def item_completed(self, results, item, info):
        if not results[0][0]:
            raise Exception("download failed")
        return item

在上述代码中,我们定义了一个名为MyImagesPipeline的管道。在file_path函数中,我们定义了图片保存的路径和命名规则。在item_completed函数中,我们判断图片是否下载成功,如果下载成功则返回原始下载项,否则抛出异常。

我们需要将该管道添加到Scrapy工程的ITEM_PIPELINES中:

ITEM_PIPELINES = {
    "myproject.pipelines.MyImagesPipeline": 1,
}

运行爬虫

在编写完爬虫、下载器中间件和管道后,我们可以使用以下命令运行爬虫:

scrapy crawl spider_name

其中,spider_name代表你的爬虫名称。Scrapy会自动进行抓取、解析、下载和保存图片等操作,并将结果输出到命令行。

示例1:爬取妹子图网站的图片

我们可以使用Scrapy爬虫爬取妹子图网站的图片。

首先,我们需要创建一个Scrapy工程:

scrapy startproject meizitu

然后,我们需要创建一个名为meizitu的爬虫:

scrapy genspider meizi www.mzitu.com

接下来,在爬虫文件中添加以下代码:

class MeiziSpider(scrapy.Spider):
    name = "meizi"
    allowed_domains = ["www.mzitu.com"]
    start_urls = ["https://www.mzitu.com/xinggan/"]

    def parse(self, response):
        for href in response.css("ul#pins>li>a::attr(href)").getall():
            yield scrapy.Request(url=href, callback=self.parse_detail)

    def parse_detail(self, response):
        title = response.css("h2.main-title::text").get()
        for img in response.css("div.main-image img"):
            yield {
                "image_url": img.xpath("@src").get(),
                "title": title
            }

上述代码中,我们定义了一个名为MeiziSpider的爬虫。在parse函数中,我们使用CSS选择器获取妹子图各个页面上的图片链接,并在获取到链接后调用parse_detail函数进行处理。在parse_detail函数中,我们获取该页面的图片标题和图片链接,然后返回一个字典。

接下来,我们需要定义下载器中间件和管道:

ITEM_PIPELINES = {
    "meizitu.pipelines.MyImagesPipeline": 1,
}

DOWNLOADER_MIDDLEWARES = {
    "meizitu.downloadermiddlewares.MyDownloaderMiddleware": 543,
}

然后,我们可以运行爬虫进行图片抓取:

scrapy crawl meizi

图片将会保存在meizi文件夹下。

示例2:爬取Google图片搜索结果

我们可以使用Scrapy爬虫爬取Google图片搜索结果的图片。

首先,我们需要创建一个Scrapy工程:

scrapy startproject googleimage

然后,我们需要创建一个名为googleimage的爬虫:

scrapy genspider google www.google.com

接下来,在爬虫文件中添加以下代码:

class GoogleSpider(scrapy.Spider):
    name = "google"
    allowed_domains = ["www.google.com"]
    start_urls = ["https://www.google.com/search?q=cats&tbm=isch"]

    def start_requests(self):
        headers = {
            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
        }
        for url in self.start_urls:
            yield scrapy.Request(url=url, headers=headers)

    def parse(self, response):
        data = response.css("[data-ved]")
        for img in data.css("img"):
            src = img.xpath("@src")
            if src:
                yield {
                    "image_url": src.get()
                }

上述代码中,我们定义了一个名为GoogleSpider的爬虫。在start_requests函数中,我们设置user-agent请求头。在parse函数中,我们使用CSS选择器获取Google图片搜索结果的图片链接,并将链接保存在字典中返回。

接下来,我们需要定义下载器中间件和管道:

ITEM_PIPELINES = {
    "googleimage.pipelines.MyImagesPipeline": 1,
}

DOWNLOADER_MIDDLEWARES = {
    "googleimage.downloadermiddlewares.MyDownloaderMiddleware": 543,
}

然后,我们可以运行爬虫进行图片抓取:

scrapy crawl google

图片将会保存在googleimage文件夹下。

这就是利用Scrapy爬取图片的攻略了,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫之教你利用Scrapy爬取图片 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python socket C/S结构的聊天室应用实现

    Python socket C/S结构的聊天室应用实现,可以分为以下几个步骤: 导入socket模块。 在Python编写socket网络程序时,需要使用socket库,因此需要在代码文件顶部导入socket模块。 import socket 创建服务器端。 服务器端需要调用socket()方法创建一个socket对象,并指定地址和端口号,接着使用bind(…

    python 2023年5月19日
    00
  • 详解python中的json和字典dict

    当我们在Python中处理数据时,通常会使用字典(dict)来存储和操作数据。然而,有时还需要将Python中的数据转换为其他格式,比如JSON。在本文中,我们将详细说明Python中的JSON和字典,且将阐述如何在两者之间进行转换。 什么是JSON? JSON是一种轻量级的数据交换格式,以文本形式进行存储和传输。JSON的全称为 JavaScript Ob…

    python 2023年5月13日
    00
  • python爬虫之bs4数据解析

    Python爬虫之bs4数据解析 本攻略将介绍如何使用Python爬虫中的bs4库进行数据解析。我们将使用bs4库解析HTML和XML响应,并提取所需的数据。 安装bs4库 在开始前,我们需要安装bs4库。我们可以使用以下命令在命令行中安装bs4库: pip install beautifulsoup4 解析HTML响应 我们将使用bs4库解析HTML响应。…

    python 2023年5月15日
    00
  • 如何在windows下安装配置python工具Ulipad

    好的。下面是在Windows下安装和配置Ulipad的步骤: 安装Python 首先,你需要下载并安装Python。官方网站为:https://www.python.org/downloads/ 下载完成后,双击安装程序进行安装,选择默认设置即可。 注意:在安装过程中需要选择将Python添加到系统的环境变量中,否则后续步骤可能会出现错误。 安装Ulipad…

    python 2023年5月18日
    00
  • 如何利用Python批量处理行、列和单元格详解

    下面是如何利用Python批量处理Excel中的行、列和单元格的详细实例教程。 一、前置条件 在开始本教程前,需要确保以下条件满足: 安装了Python环境及相关的扩展库,如pandas、openpyxl和xlwings等; 已经安装了Microsoft Excel软件。 二、批量处理行、列和单元格的方法 1.处理行和列 1.1 在Excel中插入行或列 在…

    python 2023年5月13日
    00
  • Python hashlib模块与subprocess模块使用详细介绍

    Python hashlib模块与subprocess模块使用详细介绍 简介 hashlib是Python的哈希(散列)加密模块,可以进行 SHA1、SHA224、SHA256、SHA384、SHA512 等多种哈希算法进行加密,也可以使用 MD5、SHA1 等算法进行加密。而subprocess模块可以启动一个新进程,并与该进程的标准输入、输出和错误句柄进…

    python 2023年6月2日
    00
  • django 中使用DateTime常用的时间查询方式

    下面是关于 Django 中使用 DateTime 常用的时间查询方式的完整攻略。 1. DateTime 常用查询方式 Django 中使用 DateTimeField 存储时间信息,而对于该类型的字段,我们经常需要进行基于时间的查询。以下是常用的时间查询方式: 1.1. 精确匹配查询 # 查询某个特定时间 from django.utils import…

    python 2023年6月2日
    00
  • Python深度优先算法生成迷宫

    Python深度优先算法生成迷宫的完整攻略 深度优先算法是一种常用的图遍历算法,它可以用于生成迷宫。在本文中,我们将介绍如何使用Python实现深度优先算法生成迷宫。我们将分为以下几个步骤: 导入必要的库 定义迷宫类 实现深度优先算法 示例说明 步骤1:导入必要的库 在实现深度优先算法之前,我们需要导入必要的库。在这个例子中,我们将使用numpy和rando…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部