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中的List 2

    详解Python中的List 2 List方法 Python中的List提供了很多的方法,下面我们来一一讲解。 append方法 append方法可以在List末尾追加一个元素。 fruits = ["apple", "banana"] fruits.append("orange") print(f…

    python 2023年6月3日
    00
  • python获取响应某个字段值的3种实现方法

    Python获取响应某个字段值的3种实现方法 在Python中,我们经常需要从HTTP响应中获取某个字段的值。本文将介绍三种Python获取响应某个字段值的实现方法,并提供两个示例代码。 方法1:使用json库解析JSON响应 如果HTTP响应是JSON格式的,我们可以使用json库解析响应,并获取某个字段的值。以下是示例代码的步骤: 导入必要的库 impo…

    python 2023年5月15日
    00
  • Python实现扫码工具的示例代码

    下面我详细讲解一下 Python 实现扫码工具的示例代码的完整攻略。 1. 需要的 Python 库 在 Python 中实现扫码工具,我们需要使用一些第三方库。 opencv-python: 实现图像处理,可以用来打开摄像头和捕获图像。 pyzbar: 解码二维码,读取二维码的信息。 pillow: 显示图片或编码图片。 可以使用 pip 命令来安装以上三…

    python 2023年5月19日
    00
  • Python通过websocket与js客户端通信示例分析

    Python通过websocket与js客户端通信是一种常用的实现方式,本文将详细介绍这一过程及示例说明。 简介 WebSocket是W3C标准化的一种通信协议,使得客户端和服务端之间的双向通信变得更加实用。websocket通信是基于HTTP/1.1协议的,与HTTP协议类似,但通信过程更为灵活。Python提供了一系列的库,如flask-socketio…

    python 2023年6月3日
    00
  • python爬虫请求库httpx和parsel解析库的使用测评

    在Python中,我们可以使用httpx库进行网络请求,使用parsel库进行HTML解析。本文将介绍如何使用httpx和parsel库,并提供两个示例。 1. 使用httpx库进行网络请求 httpx是一个Python的HTTP客户端库,它提供了简单易用的API,支持异步请求和HTTP/2。以下是一个示例,演示如何使用httpx库进行网络请求: impor…

    python 2023年5月15日
    00
  • python实现下载文件的三种方法

    当我们需要从互联网上下载文件时,Python是一个非常方便且有用的编程语言。在这里,我将为大家详细讲解Python实现下载文件的三种方法。首先,我们需要导入Python的内置库-urllib来下载文件。这个库提供了很多简单但是强大的功能来帮助我们完成下载任务。 方法一:使用urllib库下载文件 我们可以使用库提供的urlretrieve函数来下载文件,这个…

    python 2023年6月3日
    00
  • np.random.seed() 的使用详解

    下面是“np.random.seed() 的使用详解”的完整攻略: 1. 什么是 np.random.seed()? np.random.seed() 是 NumPy 库中的一个函数,它用来确定随机数生成器的种子,从而控制随机数生成的顺序和输出。通过使用 np.random.seed(),我们可以使得随机操作变得可重复,即对于相同的种子,每次得到的随机数序列…

    python 2023年6月3日
    00
  • python使用rpc框架gRPC的方法

    使用Python编写gRPC服务可以快速构建高效、可扩展的分布式应用程序。本文将详细介绍如何使用Python实现gRPC服务。 1. 安装gRPC gRPC依赖于protobuf3,先安装protobuf3: pip install protobuf 然后安装gRPC: pip install grpcio grpcio-tools 2. 定义protobu…

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