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

yizhihongxing

下面我将详细讲解“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 自由定制表格的实现示例

    Python 自由定制表格的实现示例 Python 作为一门非常强大的编程语言,有着丰富的库和工具包。其中,pandas 库提供了一种十分灵活和强大的方式来构建和操作表格。本文将介绍如何使用 pandas 库创建自由定制的表格。本文使用的环境如下: Python 3.8.5 pandas 1.1.3 1. 创建表格 在 pandas 库中,我们可以使用 Da…

    python 2023年6月3日
    00
  • Python使用tkinter加载png、jpg等图片

    加载png、jpg等图片可以让Python的GUI界面更加活泼和美观。在Python中使用tkinter加载图片的方法有多种,下面将详细讲解其中两种常用的方法。 1. 使用PIL模块加载图片 PIL(Python Imaging Library)是Python的一个图像处理库,可以用来打开、保存、创建、修改各种格式的图片。下面演示如何使用PIL来加载图片。 …

    python 2023年5月19日
    00
  • Python(PyS60)实现简单语音整点报时

    让我们来详细讲解如何使用Python PyS60库实现简单语音整点报时。 1. 准备工作 在开始之前,我们需要确保以下环境和软件都已经安装好: 安装Python,并配置好环境变量 安装S60 SDK(根据自己的手机类型选择对应的版本),并配置好环境变量 安装PyS60库 2. 实现过程 以下是实现简单语音整点报时的步骤: 2.1 导入需要的库 首先,我们需要…

    python 2023年5月19日
    00
  • 利用python对月饼数据进行可视化(看看哪家最划算)

    首先,我们需要准备好一份月饼的数据。假设我们在月饼购买APP上面抓取了某些品牌的价格信息,并且将数据保存在了一个csv文件中。我们可以使用Python中的pandas库来载入、处理和分析这个数据集。 import pandas as pd # 载入数据并读取csv文件 data = pd.read_csv(‘mooncakes.csv’, encoding=…

    python 2023年5月18日
    00
  • python嵌套函数使用外部函数变量的方法(Python2和Python3)

    Python中的嵌套函数指的是在一个函数内部定义的另一个函数。而嵌套函数的一个常见需求就是能够访问外部函数的变量。本文将详细讲解Python2和Python3中嵌套函数使用外部函数变量的方法,包括LEGB规则、闭包和nonlocal关键字的使用。 LEGB规则 在Python中,嵌套函数可以访问外部函数的变量是基于LEGB规则的。LEGB规则是一个查找变量的…

    python 2023年5月13日
    00
  • 使用spyder3调试python程序的实现步骤

    使用Spyder3调试Python程序的实现步骤包括: 1. 安装Spyder3 Spyder3是一款基于Python的开发环境,它包含了编辑器、调试器、变量查看器等各种功能。Spyder3可以在Windows、MacOS和Linux系统上运行。可以从官方网站下载并安装: Spyder官方网站 2. 配置Spyder3的调试器 Spyder3内置了Pytho…

    python 2023年5月30日
    00
  • python实现的重启关机程序实例

    下面我将为您详细讲解如何实现“python实现的重启关机程序实例”。 1. 实现重启功能 首先,我们可以使用os.system函数来实现机器重启功能。具体步骤如下: 导入os模块 import os 调用os.system函数,执行restart命令 os.system("shutdown -r") 上述代码将会执行机器的重启操作。可以将…

    python 2023年5月23日
    00
  • python 自动提交和抓取网页

    Python 是一种功能强大的编程语言,可以编写自动化脚本来实现很多自动化操作,其中包括自动提交和抓取网页。在本文中,我们将为您详细介绍如何使用 Python 自动提交和抓取网页的完整攻略。 环境搭建 在开始之前,我们需要确保环境已经准备好。我们需要安装 Python 和一些必要的包,比如 requests 和 beautifulsoup4,在执行下面的命令…

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