拥有属于自己的Python爬虫框架--练习编写多线程、协程爬虫框架!

2020-06-19 00:00:00 框架 爬虫 定义 模块 抓取

大概两个月前,我把自己维护的一个“极为简洁”的Python爬虫框架PSpider放在了Github,并在专栏中做了简单介绍:一个极为简洁的Python爬虫框架。没想到两个月的时间,“竟然”收到了超过300的star,让我很意外,所以我也一直在尽量改进这个框架:xianhu/PSpider。

写这个框架的初衷,主要有以下几点:

  1. 熟悉Python爬虫框架原理和逻辑,而不是只会用别人的框架。
  2. 练习Python的各种语法,包括多线程、多进程、协程、装饰器、元类、多继承等。
  3. 尝试自己去维护一个开源框架,熟悉Git用法等。虽然框架不牛,但还是挺锻炼自己的。

关于开源作品,有兴趣的可以看一下这个回答:如何在 Github 上做一个规范的开源项目?

如果大家有兴趣可以Fork代码之后仔细读一遍,结合我的一些说明,应该不难理解框架其中的逻辑。当然也很欢迎大家star?。对于协程部分,如果没有协程基础,建议转到:理解Python中的异步IO和协程(Coroutine),并应用在爬虫中



PSpider框架的特性和功能

首先说一下PSpider框架的特性和功能:

  1. 支持两种爬虫框架模型:多线程爬虫框架 和 协程爬虫框架(利用aiohttp库)。写两个模型的目的,也是为了练习Python的特性,以及爬虫的用法。
  2. 定义了爬虫工作中通用的函数、类等,比如URLFilter,make_random_useragent等。
  3. 尽量考虑爬虫工作的各个场景,尽量使得使用者只专注业务(解析、反爬等),而不用考虑其他事情,比如如何线程同步、如何设计数据流等。
  4. 爬虫框架虽然有两种模型,但是代码量较少(6、7百行左右),容易阅读、理解和扩展。
  5. 下一步计划再加一种爬虫框架模型:分布式爬虫。


PSpider框架的基本结构和原理

这里再一次简单说一下框架的原理和逻辑,有什么不明白的,可以自己去读一下源码,应该很容易理解。PSpider框架主要有这么几个模块:
  1. utilities模块:主要定义了一些工具函数、工具类等,即抽象出爬虫工作中的具体流程、通用流程等做成函数或者类,目的是为了节省爬虫工程师的时间。比如定义UrlFilter类用于过滤Url,定义make_random_useragent随机获取UA值。
  2. instances模块:主要定义了多线程爬虫模型中用到的Fetcher、Parser、Saver三个工作类,即爬虫在工作过程中真正干活的流程。使用框架时,一般都需要继承并改写上边的三个类,特别是Parser类。即三者都需要定制化,框架在这一步还做不到完全通用。
  3. concurrent模块:定义多线程爬虫框架(concur_threads.py)和协程爬虫框架(concur_async.py),用于爬虫过程中线程和协程的合理调度、数据共享、状态监控等。该模块是框架的核心模块。

如果把爬虫框架比作一个工厂,则对于多线程爬虫框架,concurrent模块定义多个车间并做相应的调度、信息同步等,instances模块定义每个车间中工人的工作流程,utilities模块定义一些生产过程需要的工具、机器等。Fetcher类根据url进行简单的抓取,并返回抓取内容。Parser类根据抓取内容进行解析,生成待保存的Item及待抓取的Url列表。Saver类进行Item的保存。(具体可查看上文中的流程图)。

具体的用法,大家可以参考Github上的说明文档。有什么问题,可以随时和我沟通,非常非常欢迎大家根据自己的业务提出需求,甚至提出代码合并请求等。

另外,代码部分有一些demos_*的文件夹,是一些框架使用的demo,包括当当图书信息抓取、豆瓣电影抓取、NBA球员信息抓取等。由于PSpider框架的不断变化,这里不保证每个Demo都还能直接调用,但是应该稍微修改就能使用。如果你希望分享你自己的Demo,也欢迎大家提交Pull Request。

再一次放上爬虫框架代码地址:xianhu/PSpider

=============================================================

作者主页:笑虎(Python爱好者,关注爬虫、数据分析、数据挖掘、数据可视化等)

作者专栏主页:撸代码,学知识 - 知乎专栏

作者GitHub主页:撸代码,学知识 - GitHub

欢迎大家拍砖、提意见。相互交流,共同进步!


==============================================================

相关文章