Python网络爬虫框架Scrapy从入门到精通
作者简介
张颖,“清颖设计”微信公众号创始人,现任上海懂得网络科技有限公司技术部主管,从事编程开发十余年,熟悉Python的方方面面,尤其擅长Python爬虫和数据分析。
内容简介
第1章 Scrapy框架简介 欢迎来到Scrapy的世界,Scrapy是用Python语言编写的开源网络爬虫框架。如果想在网络上合法地采集想要的数据,或者想要测试网站的性能,那么本书会介绍如何使用Scrapy实现这些功能。不管是经验很少的初学者还是基本没接触过Scrapy的读者,都可通过本书的各种实例、实战项目掌握Scrapy。 1.1 Scrapy简介 从头开发一个爬虫程序是一项很烦琐吃力的工作。为了避免重复地造轮子消耗大量的时间,降低开发成本,提高程序的质量,我们会选择一些优秀的爬虫框架,Scrapy就是其中之一。Scrapy是现在非常流行的开源爬虫框架,而且还是一个成熟的框架;是Python开发的一个快速、高层次的Web数据抓取框架,用于抓取Web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据采集、数据挖掘、网络异常用户检测、存储数据、监测和自动化测试等方面。 Scrapy使用了Twisted异步网络框架来处理网络通信,可以加快下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活地完成各种需求。它也提供了多种类型爬虫的基类,如BaseSpider、Sitemap爬虫等,最新版本又提供了Web 2.0爬虫的支持。 Scrapy是基于事件的架构,使数据清洗、格式化、数据存储级联起来。当打开上千万链接时,可以同时合理地拆分吞吐量,只要合理设计,性能的降低就会比较小。例如,假如想从某网站获取商品销量的信息,假设每页包含100个商品的销量。Scrapy可以非常轻松地在该网站并行(同时)执行16个请求。如果一个请求需要1秒,那么每秒就会爬取16页,把16页乘每页的商品数量,最后得出每秒爬取1600个商品销量的信息。这样,速度和性能大大增加,比单线程每秒爬取100个商品,足足快了16倍。 1.2 关于本书:目标和用途 本书的目标:通过基础知识的梳理,重点示例和实战项目的演示,来教读者如何使用Scrapy。 第2~4章,梳理运用Scrapy所需要的基础必备知识,以及Scrapy在不同操作系统中是如何搭建的。第5章是Scrapy的进阶知识介绍,让读者更好地掌握Scrapy并且能更好地运用它。第6~10章是实战项目,分别通过静态网页、动态网页、App的数据抓取及分布式的部署与爬取,让读者更深入地了解和掌握Scrapy的框架精华。第11章是通过爬虫测试网站性能的介绍和实例,让读者掌握Scrapy的另一个功能——自动化测试。第12章是利用Python进行数据分析,并对三大模块——NumPy、Matplotlib和Pandas进行了详细介绍,通过实例来演示Scrapy爬取网站,并对爬取到的数据进行分析及视图展示。 由浅入深地阅读本书,并且通过本书的实战项目去练习所学知识,举一反三地磨炼,这样就能成为很优秀的Scrapy开发者。 1.3 进行自动化数据爬取的重要性 2011年5月,麦肯锡全球研究院发布报告——Big data: The next frontier for innovation, competition, and productivity,第一次给大数据做出相对清晰的定义:“大数据是指其大小超出了常规数据库工具获取、储存、管理和分析能力的数据集。”而数据爬取始终与大数据联系在一起,为所有预测提供了基础。“大数据赋予我们预测未来的能力”,这就是数据挖掘的力量。 如今我们的生活已经被数字化:每笔互联网上的、银行卡的交易都是数字化的,每次互联网上浏览的行为都有可能被保存下来进行数字化。随着可穿戴设备的兴起,每一次心跳和呼吸也会被数字化并保存为可用的数据。所以,一台计算机或手机比以往任何时候都能更好地“理解”我们的世界。如果计算机或手机能预测人们的生活方式,它就能准确地告知企业什么时候是进行促销的最佳时机,例如,如果这个人倾向于每周六去餐厅聚会,那么企业可以给他推送餐厅的优惠信息。如果这个人倾向于每年春节出去度假,那么企业可以给他推送一张酒店住宿优惠券或旅游优惠券。互联网金融、医疗病例分析、数据建模、信息聚类、数据分析服务等,这些系统所需要的数据几乎都是要通过爬虫进行获取,并且通过规范化提取完成。它们通过提取到的数据进行分析,进行销售预测,指定商业策略,使营业利润最大化。从海量病例信息中挖掘有价值的信息,提高患者诊断的准确度、治疗的精确度,为医院决策管理提供有力的支持。所以,一旦未来变得可预测,我们总是可以提前计划,并为之做最好的行动准备。 1.4 掌握自动化测试的重要性 是否需要进行软件测试主要取决于以下几点。 (1)客户需求度逐渐提高,相应的对软件系统的要求和期望越来越高。 (2)软件系统复杂度提高,需要多人进行合作。 (3)软件开发是程序员的智力活动,无法用固定的生产标准来管理。 由于以上原因,导致软件质量降低,进度和成本无法控制。所以,我们要尽早测试,尽早发现问题。而且运行一套测试方法能够保证代码按照规定的功能和目标运行,不仅节约时间,而且减少产生BUG的可能性。 手工测试通常是工程师先执行预定义的测试用例,将执行结果与预期的行为进行手工比较并记录结果。每次源代码更改时都会重复这些手动测试,由于都是人为参与,因此这个过程很容易出错。古语有云:“工欲善其事,必先利其器。” 自动化测试则是将自动化工具和技术应用于软件测试,让程序代替人去验证程序功能的过程,旨在减少测试工作,更快、更经济地验证软件质量,有助于以更少的工作量构建质量更好的软件。 自动化测试分为三个层级:单元测试、接口测试和UI测试,这三层呈一个金字塔形状分布。最底层是单元测试,接口测试在中间,UI测试在最上层。 自动化测试还可以解决以下问题。 (1)软件在发布新版本以后对之前的功能进行验证。 (2)软件的压力测试,即多用户同时操作软件,软件服务器处理多用户请求的能力。 (3)软件的兼容性测试,即在不同浏览器(IE、Chrome、Firefox等)中的展现能力,或者在不同操作系统(Windows、Linux等)中的兼容能力。 目前大多数编程语言(包括Python)都有一些测试框架。将Python的Unittest库与网络爬虫组合起来,就可以实现简单的网站前端测试功能。Python的Selenium是一个可以解决网站中各种复杂问题的优秀测试框架,用它可以写出一些符合测试流程的测试脚本进行网站测试。 1.5 合理规划,开发高质量的应用 为了合理规划,开发高质量的应用,需要通过网络数据采集,对其关键共性技术进行研发,提升数据存储、理论算法、模型分析等核心竞争力,做出面向大数据的分析软件。 通过爬虫的细心抓取,可以为企业提供大量的真实数据,帮助企业构建覆盖全流程、全环节、全生命周期的数据链,使企业提升数据分析处理和知识创造能力的同时,还可以帮助企业及早发现和修复错误,并做出明智的决策。 1.6 网络数据的采集法律与道德约束 当我们开发爬虫进行网络采集时,需要关注网络上数据的版权。如果采集别人的文章放在自己的网站上展示,则侵犯了别人对这篇文章的版权。一般爬虫采集的大多数数据都是统计数据,但是如果采集的数据源被对方申请了版权,那么在未取得授权的情况下是不能进行采集的。 以下行为表示违反了采集法律。 (1)超出Robots协议的许可。Robots协议是国际互联网界通行的道德规范,也是一种存放于网站根目录下的文本文件,它通常告诉爬虫,此网站中的哪些内容是不可以爬取的,哪些内容是可以爬取的。打个比方:网站就像酒店里的房间,房间的门口会挂着“请勿打扰”或“欢迎光临”的提示牌。那么,服务生就知道哪些房间能够进入,哪些房间不能进入。如果强行进入“请勿打扰”的房间,就算违法了。Scrapy提供了这些功能的设置。 (2)对爬取的网站造成了实际的伤害。网络服务器是很昂贵的,如果由于无限量大批地从目标网站爬取数据,使目标网站崩溃,就会导致网站无法为其他用户正常地提供服务。这些都算是对目标网站造成的伤害。 (3)故意而为之。虽然采集有时需要很长的时间,但最好让爬虫在午夜进行,这样可以减少目标网站的压力。这样的行为可以不影响网站高峰期的运行。 1.7 本章小结 本章介绍了Scrapy,介绍了它能够帮助用户做什么,并且阐述了自动化数据爬取和自动化测试的重要性。此外,告诉读者合理规划,开发高质量的应用及网络数据需要合法采集。 (1)系统:全流程讲解Scrapy的原理和实战,依次击破编程难点。 (2)经典:凝聚笔者十多年的Scrapy使用经验,无私奉献设计秘籍。 (3)深入:浅入深出地介绍爬虫原理、数据爬取、数据保存、数据分析和测试等技术。并且,所有案例都配有对应的代码,拿来就用。