深入剖析Python的爬虫框架Scrapy的结构与运作流程

深入剖析Python的爬虫框架Scrapy的结构与运作流程

Scrapy的结构

Scrapy是一个基于Python语言并采用了Twisted异步网络框架的开源爬虫框架,其整个架构由以下组件构成:

  • 引擎(Engine):控制各个组件之间的信号传递和流转。
  • 调度器(Scheduler):管理爬取请求的队列,并通过引擎将请求发送给爬虫。
  • 下载器(Downloader):下载网络上的数据并将其返回给引擎。
  • 爬虫(Spider):解析网页并提取数据,将提取到的数据返回给引擎。
  • 项目管道(Pipeline):对爬到的数据进行处理,包括储存、去重等操作。
  • 下载器中间件(Downloader Middleware):对请求和响应进行处理,比如设置代理、修改请求头等。
  • 爬虫中间件(Spider Middleware):对爬虫的请求和响应进行处理,比如过滤器、添加请求头等。

Scrapy的运作流程

Scrapy的具体运作流程如下:

  1. 引擎(Engine)接收到起始URL,并使用调度器(Scheduler)将其放入待爬队列中。
  2. 引擎从待爬队列中取出下一个URL,并生成对应的请求(Request),通过下载器中间件(Downloader Middleware)进行请求处理。
  3. 下载器(Downloader)将网络上的数据下载下来,并将其作为响应(Response)返回给引擎。
  4. 引擎将响应(Response)发送给爬虫(Spider)进行处理。
  5. 爬虫通过解析响应(Response)提取目标数据,并生成新的请求(Request)放入待爬队列中。
  6. 重复2~5步骤,直到待爬队列为空。

下面通过两个示例来详细说明Scrapy的整个运作流程。

示例一:爬取《三体》小说

我们首先需要在Scrapy项目根目录下通过命令 scrapy startproject sanwen 创建一个名为“sanwen”的项目。然后运行以下命令:

cd sanwen
scrapy genspider sanwen_spider sanwen.com

这个命令会在项目的spiders目录下新建一个名为“sanwen_spider”的spider。

我们进入到spiders目录,找到sanwen_spider.py进行编辑:

import scrapy

class SanwenSpiderSpider(scrapy.Spider):
    name = 'sanwen_spider'
    allowed_domains = ['sanwen.com']
    start_urls = ['https://www.sanwen.com/book/']

    def parse(self, response):
        # 获取对应小说的链接
        urls = response.css(".allbook .bt > a::attr(href)").getall()
        # 逐个解析小说目录
        for url in urls:
            yield response.follow(url, callback=self.parse_chapter)

    def parse_chapter(self, response):
        # 获取小说章节链接
        urls = response.css(".listbox2_dir a::attr(href)").getall()
        # 逐个解析小说章节内容
        for url in urls:
            yield response.follow(url, callback=self.parse_content)

    def parse_content(self, response):
        # 将小说正文全部提取并存储到文件
        title = response.css(".title > h1::text").get()
        content = response.css(".article_content").get()
        with open(f"{title}.html", "w", encoding="utf-8") as f:
            f.write(content)

我们通过产生三个级联请求的方式,将小说的每章内容提取下来并存储到本地文件中。具体流程如下:

  1. 引擎(Engine)将起始URL https://www.sanwen.com/book/ 交给调度器(Scheduler)。
  2. 调度器(Scheduler)通过下载器中间件(Downloader Middleware)将其发送给下载器(Downloader)。
  3. 下载器(Downloader)向网站 https://www.sanwen.com/book/ 发送请求(request),并下载对应的响应(response)。
  4. 引擎(Engine)将响应(response)交给sanwen_spider进行处理。
  5. sanwen_spider通过response.follow()方法访问每个小说详细页面,从页面中获取小说章节链接每章内容。
  6. 引擎会将小说章节链接和回调函数callback将两者打包成一个请求(Request)并交给调度器。
  7. 调度器将请求(Request)加入队列。
  8. 重复6~7步,直到队列为空。

这样,Scrapy的整个流程就完整地完成了。

示例二:使用CrawlSpider自动爬取网站上的电影信息

除了Spider之外,Scrapy还提供了另外一个Spark Type - CrawlSpider,该Spider是一个可以自动化爬取网站全站信息的爬虫。

下面我们以爬取IMDB网站上所有电影信息为例,演示如何使用CrawlSpider自动化爬取。首先我们需要在Scrapy项目根目录下通过命令 scrapy startproject imdbcrawl 创建一个名为“imdbcrawl”的项目。然后运行以下命令:

cd imdbcrawl
scrapy genspider -t crawl imdbcrawl_spider imdb.com

这个命令会在项目的spiders目录下新建一个名为“imdbcrawl_spider”的CrawlSpider。

我们进入到spiders目录,找到imdbcrawl_spider.py进行编辑:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from imdbcrawl.items import ImdbcrawlItem

class ImdbcrawlSpiderSpider(CrawlSpider):
    name = 'imdbcrawl_spider'
    allowed_domains = ['imdb.com']
    start_urls = ['https://www.imdb.com/chart/top']

    rules = (
        Rule(LinkExtractor(restrict_xpaths="//td[@class='titleColumn']/a"), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        item = ImdbcrawlItem()
        # 获取电影信息
        item['title'] = response.css("div.title_wrapper h1::text").get().strip()
        item['release_year'] = response.css("#titleYear a::text").get()
        item['rating'] = response.css("span.ratingValue span::text").get()
        yield item

我们通过定义rules及其回调函数parse_item(),CrawlSpider会自动抓取所有电影的网页并执行parse_item()函数,将相关的信息提取出来。

这个项目的Item定义及其管道实现有点麻烦,但有点偏离Scrapy框架本身的范畴,在这里我们就不展开说明了,这里只是向大家演示CrawlSpider是如何运作的。

  1. 引擎(Engine)将起始URL https://www.imdb.com/chart/top 交给调度器(Scheduler)。
  2. 调度器(Scheduler)通过下载器中间件(Downloader Middleware)将其发送给下载器(Downloader)。
  3. 下载器(Downloader)向网站 https://www.imdb.com/chart/top 发送请求(request),并下载对应的响应(response)。
  4. 引擎(Engine)将响应(response)交给imdbcrawl_spider进行处理。
  5. imdbcrawl_spider分析响应(response),并通过规则(Rules)提取电影信息,生成新的请求(Requests),并加入Request的队列,并交给调度器(Scheduler)进行调度。
  6. 调度器(Scheduler)分析从imdbcrawl_spider回调函数中产生的requests,并将其加入Request队列,等待下一次下载器(Downloader)执行。
  7. 重复2~6步,直到队列为空。

这样,我们使用CrawlSpider完全自动化地完成了对IMDB电影网站的爬取。

以上就是Scrapy框架的整体结构和运行流程,通过以上两个示例我们了解了如何使用Scrapy爬取数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入剖析Python的爬虫框架Scrapy的结构与运作流程 - Python技术站

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

相关文章

  • python批量识别图片指定区域文字内容

    针对“python批量识别图片指定区域文字内容”,一般步骤为以下几步: 安装必要的库 编写代码,使用OCR技术对指定区域的图片进行文字识别 将识别结果输出到文件或数据库中 以下是详细的攻略: 1. 安装必要的库 为了实现python批量识别图片中指定区域的文字内容,我们需要安装以下库: pytesseract:实现OCR技术的库,可以将图片中的文字转换成字符…

    python 2023年5月18日
    00
  • python读写配置文件操作示例

    下面是关于”Python读写配置文件操作示例”的完整攻略: 一、前置知识 在讲解读写配置文件操作之前,我们需要先了解两个相关的知识点:INI文件和configparser模块。 1. INI文件 INI文件是一种配置文件的格式,常见于Windows操作系统中,用于存储软件程序中的配置信息。INI文件通常是以文本形式存储的,后缀名为”.ini”。 .INI文件…

    python 2023年6月3日
    00
  • python整小时 整天时间戳获取算法示例

    下面是关于Python获取整小时和整天时间戳的攻略说明。 一、获取整小时时间戳 获取整小时的时间戳,可以使用Python中time模块的函数time(),通过先获取当前时间戳,然后再将其除以3600(即1小时的秒数),得到整小时的时间戳(秒数),最后将秒数乘以1000即可得到毫秒级别的整小时时间戳。 示例代码如下: import time # 获取当前时间戳…

    python 2023年6月3日
    00
  • 用Python每天自动给女友免费发短信

    下面是用Python每天自动给女友免费发短信的完整攻略。 简介 这个攻略使用Python语言来实现自动给女友免费发短信的功能。其主要原理是通过调用短信接口,将文本内容发送给女友的手机号。本攻略使用的短信接口是基于腾讯云SMS服务。此外,需要注册一个腾讯云账号,并开通短信服务。 步骤 1. 安装依赖库 本次攻略需要安装的依赖库如下: pip install q…

    python 2023年5月19日
    00
  • 无法在 Django 中导入视图(2.1.4、Python 3.7.0、Win 7)

    【问题标题】:Cannot import views in Django (2.1.4, Python 3.7.0, Win 7)无法在 Django 中导入视图(2.1.4、Python 3.7.0、Win 7) 【发布时间】:2023-04-03 18:35:01 【问题描述】: 我正在使用 django 构建一个站点,但无法将视图导入我的 URL 文件…

    Python开发 2023年4月8日
    00
  • Python 两个列表的差集、并集和交集实现代码

    差集、并集和交集是Python中常用的操作,可以使用set()函数实现。下面是Python两个列表的差集、并集和交集实现代码的完整攻略。 差集 两个列表的差集是指在第一个列表中出现但在第二个列表中没有出现的元素。可以使用set()函数现两个列表的差集。以下是一个示例,演示如何使用set()函数实现两个列表的差集: # 定义两个列表 list1 = [1, 2…

    python 2023年5月13日
    00
  • Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】

    下面是关于“Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】”的完整攻略。 1. DBSCAN算法的基本原理 DBSCAN(Density-Basedustering of Applications with Noise)是一种基于密度的聚类算法,它将数据点分为核心点、界点和噪声点三类。DBSCAN算法的基本流程如下: 初始化:选择一个未…

    python 2023年5月13日
    00
  • Python中用post、get方式提交数据的方法示例

    下面是详细的Python用POST和GET方式提交数据的方法示例攻略。 1. GET方式提交数据的方法示例 使用GET方式提交数据适用于向服务器请求数据。 1.1 准备工作 在Python中,可以使用requests库轻松实现GET方式提交数据。打开命令行窗口(Windows用户需要先打开CMD),输入以下命令进行安装: pip install reques…

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