Scrapy是什么?

Python写的开源爬虫框架。

什么是爬虫?
就可以方便地从网上抓取你想要的内容。

  1. 优点:
    功能强大。

哪里看出功能强大?

  • 便捷地构建 request,request是异步调度和处理的
  • 强大的 selector 解析response
  • downloader是多线程的
  • 性能,也就是抓取和解析的速度很快因为request异步和downloader多线程
  • 内置的 log 日志模块
  • 内置的 exception 异常处理模块
  • 内置的 shell 模块 等模块
  1. 缺点:
    scrapy是封装起来的框架,包含了下载器,解析器,日志及异常处理,基于多线程, twisted的方式处理,对于固定单个网站的爬取开发有优势,但多网站如爬取100个网站,并发及分布式处理方面,不够灵活不便调整与括展。

如何安装和使用的问题,请参考 官方网站 https://scrapy.org/
源码地址:https://github.com/scrapy/scrapy

Scrapy 有什么作用?

数据挖掘、监测和自动化测试。
资料:https://xie.infoq.cn/article/f3505fba11fe9f9615cacc6f6

用 Scrapy 开发爬虫,只需4步

  1. 使用 scrapy startproject 命令创建一个爬虫模板,或自己按模板编写爬虫代码
  2. 定义一个爬虫类,并继承 scrapy.Spider,重写 parse 方法
  3. parse 方法里编写网页解析逻辑,以及抓取路径
  4. 使用 scrapy runspider <spider_file.py> 运行这个爬虫

使用 Scrapy 编写简单的几行代码,就能采集到一个网站页面的数据,非常方便。
image

Scrapy是如何工作的?

01-架构概览

  1. 介绍 Scrapy 的整体架构
  2. 宏观上学习 Scrapy 的运行流程

架构

Scrapy 主要包含上面5大核心模块:

  1. Engine:核心引擎,负责控制和调度各个组件,保证数据流转;
  2. Scheduler:负责管理任务、过滤任务、输出任务的调度器,存储、去重任务都在此控制;
  3. Downloader:下载器,负责在网络上下载数据,输入待下载的 URL,输出下载结果;
  4. Spiders:我们自己编写的爬虫逻辑,定义抓取意图;
  5. Item Pipeline:负责输出结构化数据,可自定义格式和输出的位置;

观察看还可以看到2个模块:

  • Downloader middlewares:介于引擎和下载器之间,可以在网页在下载前、后进行逻辑处理;
  • Spider middlewares:介于引擎和爬虫之间,在向爬虫输入下载结果前,和爬虫输出请求 / 数据后进行逻辑处理;

运行流程

Scrapy 内部采集流程是如何流转的?各个模块是如何交互协作,来完成整个抓取任务?

Scrapy 运行时的数据流转大概是这样的:

  1. 引擎从自定义爬虫中获取初始化请求(也叫种子 URL);
  2. 引擎把该请求放入调度器中,同时调度器向引擎获取待下载的请求;
  3. 调度器把待下载的请求发给引擎;
  4. 引擎发送请求给下载器,中间会经过一系列下载器中间件;
  5. 这个请求通过下载器下载完成后,生成一个响应对象,返回给引擎,这中间会再次经过一系列下载器中间件;
  6. 引擎接收到下载器返回的响应后,发送给爬虫,中间会经过一系列爬虫中间件,最后执行爬虫自定义的解析逻辑;
  7. 爬虫执行完自定义的解析逻辑后,生成结果对象或新的请求对象给引擎,再次经过一系列爬虫中间件;
  8. 引擎把爬虫返回的结果对象交由结果处理器处理,把新的请求通过引擎再交给调度器;
  9. 重复执行 1-8,直到调度器中没有新的请求处理,任务结束;

核心模块交互图:

(图中 Scrapyer 模块,也是 Scrapy 的一个核心模块,但官方的架构图没有展示出来。这个模块其实是处于 Engine、Spiders、Pipeline 之间,是连接这 3 个模块的桥梁)

核心类图

没有样式的黑色文字是类的核心属性;标有黄色样式的高亮文字是类的核心方法;

读源码的过程中,可以针对这些核心属性和方法重点关注。

Scrapy 涉及到的组件主要包括以下这些:
五大核心类: Engine、Scheduler、Downloader、Spiders、Item Pipeline;
四个中间件管理器类:DownloaderMiddlewareManager、SpiderMiddlewareManager、ItemPipelineMiddlewareManager、ExtensionManager;
其他辅助类:Request、Response、Selector;

02-Scrapy 是如何运行起来的?

https://xie.infoq.cn/article/ab683828a3bad9c931044776c

scrapy 命令从哪来?

当我们基于 Scrapy 写好一个爬虫后,想要把我们的爬虫运行起来,怎么做?非常简单,只需要执行以下命令就可以了。

scrapy crawl <spider_name>

从命令行到执行爬虫逻辑,这个过程中到底发生了什么?

装好 Scrapy 后,使用如下命令,就能找到这个命令文件:

$ which scrapy
/usr/local/bin/scrapy # 这个文件就是 Scrapy 的运行入口

打开这个文件会发现,它是一个 Python 脚本

import re
import sys
from scrapy.cmdline import execute
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(execute())

为什么入口点是这里呢?
答案在 Scrapy 的安装文件 setup.py 中:

from os.path import dirname, join
from setuptools import setup, find_packages
setup(
    name='Scrapy',
    version=version,
    url='http://scrapy.org',
    ...
    # 需要关注 ntry_points 配置,这就是调用 Scrapy 开始的地方
    entry_points={      # 运行入口在这里:scrapy.cmdline:execute
        'console_scripts': ['scrapy = scrapy.cmdline:execute']
    },
    classifiers=[
        ...
    ],
    install_requires=[
        ...
    ],
)

在安装 Scrapy 的过程中,setuptools 这个包管理工具,会把上述代码生成好并放在可执行路径下,当我们使用 scrapy 命令时,就会调用 Scrapy 模块下的 cmdline.py 的 execute 方法。

同时也提一个小技巧:如何用 Python 编写一个可执行文件?

  1. 写一个带有 main 方法的 Python 模块(首行必须注明 Python 执行路径)
  2. 去掉.py后缀名
  3. 用(chmod +x 文件名)把这个文件权限变成可执行
  4. 最后通过 ./文件名 就可以执行这个 Python 文件,而不再需要通过 python <file.py> 方式执行

总结

这篇文章的代码量较多,也是 Scrapy 最为核心的抓取流程,如果你能把这块逻辑搞清楚了,那对 Scrapy 开发新的插件,或者在它的基础上进行二次开发也非常简单了。
总结一下整个抓取流程,还是用这两张图表示再清楚不过:

Scrapy 整体给我的感觉是,虽然它只是个单机版的爬虫框架,但我们可以非常方便地编写插件,或者自定义组件替换默认的功能,从而定制化我们自己的爬虫,最终可以实现一个功能强大的爬虫框架,例如分布式、代理调度、并发控制、可视化、监控等功能,它的灵活度非常高。

posted on   大元王保保  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类



点击右上角即可分享
微信分享提示