Scrapy 爬虫框架介绍

今天我们开始学习一门新的 Python 框架:Scrapy。Scrapy 是一个爬虫框架,能帮助我们简化网络爬虫开发,用最少的代码完成爬虫项目,同时具备完整爬虫功能。

1. 爬虫简介

网络爬虫是一段具有特殊含义的代码,其功能是模拟用户在浏览器上的操作,发送 HTTP 请求,接收数据,然后解析并保存数据,方便其他应用程序使用和分析

这个过程中间包含了许多自动化的操作,若使用得当,可以产生大量的经济价值以及帮助我们减少繁杂的工作

互联网上每天都会有无数的爬虫在网络上游走,获取相应网站的数据。这些爬虫和人一样,有好有坏,有正义的,也有邪恶的。比如百度 Spider 等搜索引擎爬虫,为我们提供了信息检索的最新数据,我们能通过搜索关键字找到相应的网站,正是得益于百度 Spider 每天孜孜不倦的工作。搬运相应网站的地址和更新相应的信息数据,这也是必要的爬虫,许多网站也乐于被百度爬虫抓取最新数据。

但是也存在许多恶意爬虫,长时间、大规模的请求特定网站数据,给网站服务器造成了巨大的压力,影响正常用户请求,这也是许多网站讨厌爬虫并积极设置反爬虫策略的原因。

对于个人开发者而言,学好爬虫技术,对于个人成长方面有着极大的好处:

  • 锻炼个人技能,及时体验技术带来的好处:使用简单的几行 Python 代码就能获取网站数据,这样的学习曲线远胜于使用 C/C++ 进行爬虫开发。这也是很多人选择 Python 开发爬虫的原因;
  • 在工作和生活上有时候能带来极大的好处:比如收集数据,完成毕业论文;比如开-发一款 12306 抢票助手,解决回家抢票困难的问题;又或者抓取股票交易数据,帮助我们分析股票走势等等。事实上,已经有很多人做了这些工作并在 Github 上进行了开源。

事实上,爬虫的应用还有很多,就不在此逐一说明了。接下来我们介绍 Python 的爬虫框架以及使用爬虫框架进行开发的好处。

2. 各种爬虫框架优缺点对比

下面我们介绍开源界中几个关注度比较高的 Python 爬虫框架。所谓关注度高包括 Github 上的点赞数以及文档的丰富程度。

2.1 Scrapy

Scrapy 框架大概是最火的 Python 爬虫框架了,这一点可以从它的 Github 点赞数看出来:38k !单纯从这个数字就可以看出这是一个超级热门的框架了。

图片描述

Scrapy 的 github 地址

在 Scrapy 的官方文档中,对该框架是这么介绍的:

Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.

简单翻译下就是:

Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。尽管如此,它也可以作为一个通用的 Web 爬虫框架来开发爬虫项目。它基于 Twisted 这个流行的异步处理框架,因此具有较高的性能。开发者只需要定制开发几个模块就可以轻松的实现一个高性能爬虫,用来抓取网页内容,非常方便。下面我总结了一下 Scrapy 框架的几个优点:

  • Scrapy 是异步的,且可以灵活调节并发量;
  • 采取可读性更强的 Xpath,解析网页速度快;
  • 有统一的 Middleware 过滤器;
  • 支持 Shell 方式,方便独立调试;
  • 通过管道的方式存入数据库,灵活方便且可保存为多种形式。

当然,Scrapy 框架也是有不少缺点的,比较明显的有如下几点:

  • 本身无法实现分布式爬虫;

  • 自身去重效果差,消耗内存,且不能持久化;

  • 无法获取需要执行 js 才能获取数据的网页;

  • 基于 twisted 框架,如果执行出错是不会停掉其他任务的,这回导致 Scrapy 在爬取数据出错后难以察觉。

基于 Scrapy 的这些缺点产生了许多框架的插件来解决。比如 scrapy-redis 解决了 Scrapy 框架的分布式爬取问题; scrapy-splash 插件可以抓取 js 动态渲染内容等等。后面我们也会基于这些插件开发一个完整的分布式爬虫项目来帮助我们体验爬虫的魅力。

2.2 Pyspider

pyspider 是一款国人编写的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优先级等。总的来说,它的特点如下:

  • 具有强大的 webui 界面,并且支持脚本编辑,任务监控,项目管理和结果查看;

  • 数据后台支持 MySQL、MongoDB、Reids、SQLite、Elasticsearch 和 PostgreSQL 等主流关系型和非关系型数据库;

  • 消息队列支持 RabbitMQ、Redis 等;

  • 支持任务优先级,定时,失败重试等调度方案;

  • 支持分布式架构,抓取 js 页面。

Pyspider 也存在一些明显的问题:丰富的文档、成熟的社区,这些都是 pyspider 欠缺的,也造成了 Pyspider 不如 Scrapy 流行的重要原因之一。但 Pyspider 在简洁易用性上却是胜过 Scrapy 的,很多初学者也会非常喜欢它提供的 webui 页面,这也是该框架得以流行的原因之一。

2.3 Cola

Cola 是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。

但是从 Github 上的用户的关注度来看,相比上面两个框架而言,差了不少。整个项目的主要贡献者只有2个人,且上次一发布 release 版本还是2015年的上古时代。这些都已经充分说明了 Cola 框架正在逐渐走向衰退,不建议在生产环境中使用,其潜在的 Bug 和相关安全风险无法得到及时的更新和修复,但是作为学习爬虫框架的参考资料还是不错的,深入研究这样一个框架的源码能收获不少知识。

3. 为什么要学习 Scrapy?

Scrapy 是一款性能强大爬虫框架,基于 Scrapy 我们可以快速开发出高性能的爬虫。此外,由于 Scrapy 框架的高度可扩展性,我们可以在该框架简单改造就能实现自己的业务需求。例如 Scrapy-Redis 插件,短短几千行代码就实现 Scrapy 框架的分布式功能。

如果能熟练掌握 Scrapy 框架,我们会具备如下的优势:

  • 基于 Scrapy 框架快速开发出高性能爬虫,不用担心爬虫性能问题;
  • 丰富的 Scrapy 文档、良好的社区以及庞大的用户群体。这些都是我们选择 Scrapy 框架的理由;
  • 熟练掌握 Scrapy 框架后,可以深入学习 Scrapy 框架源码,了解一个完整爬虫框架的组成;在架构设计和代码风格上,Scrapy 都是极为优秀的。作为初学者的我们可以从中收获不少,特别是关于 Twisted 框架的运用;
  • 高度可定制化。这是 Scrapy 框架的一个极大优势,通过简单改造 Scrapy,我们就能实现特点功能的爬虫。如 Scrapy-Redis 插件,不过数千行代码,就将 Scrapy 框架扩展成分布式,而且是即插即用型,不用改动 Scrapy 源码。

看到这些特点后,你还有什么理由不学习 Scrapy 框架呢?

4. 学习基础

为了学好该框架以及熟练使用 Scrapy 开发爬虫项目,我们需要具备以下基础:

  • 简单的网页基础,HTML/CSS等;
  • Python 基础
  • 简单的计算机网络基础,比如了解 HTTP 协议、TCP/IP 协议等

本课程会假定你已经了解或者熟悉上述基础知识,并在后面不会对一些简单的问题作出解释,重点放到剖析这个框架并熟练掌握。

5. 小结

本小节简单介绍了爬虫知识以及在 Python 中比较流行的爬虫框架,重点介绍了 Python 中大火的 Scrapy 框架,这也是我们接下来学习的重点。紧接着描述了学习 Scrapy 框架必备的一些基础知识 。从下一节起,将开始我们正式的剖析 Scrapy 框架之旅,祝大家旅途愉快。