收藏 分享(赏)

精通Python爬虫框架Scrapy_-_2018.pdf

上传人:jintaihu 文档编号:5712528 上传时间:2022-06-16 格式:PDF 页数:364 大小:12.44MB
下载 相关 举报
精通Python爬虫框架Scrapy_-_2018.pdf_第1页
第1页 / 共364页
亲,该文档总共364页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、目录版权信息版权声明内容提要关于作者关于审稿人前言第1章 Scrapy简介1.1 初识Scrapy1.2 喜欢Scrapy的更多理由1.3 关于本书:目标和用途1.4 掌握自动化数据爬取的重要性1.4.1 开发健壮且高质量的应用,并提供合理规划1.4.2 快速开发高质量最小可行产品1.4.3 Google不会使用表单,爬取才能扩大规模1.4.4 发现并融入你的生态系统1.5 在充满爬虫的世界里做一个好公民1.6 Scrapy不是什么1.7 本章小结第2章 理解HTML和XPath2.1 HTML、DOM树表示以及XPath2.1.1 URL2.1.2 HTML文档2.1.3 树表示法2.1.4

2、 你会在屏幕上看到什么2.2 使用XPath选择HTML元素2.2.1 有用的XPath表达式2.2.2 使用Chrome获取XPath表达式2.2.3 常见任务示例2.2.4 预见变化2.3 本章小结第3章 爬虫基础3.1 安装Scrapy3.1.1 MacOS3.1.2 Windows3.1.3 Linux3.1.4 最新源码安装3.1.5 升级Scrapy3.1.6 Vagrant:本书中运行示例的官方方式3.2 UR2IM基本抓取流程3.2.1 URL3.2.2 请求和响应3.2.3 Item3.3 一个Scrapy项目3.3.1 声明item3.3.2 编写爬虫3.3.3 填充ite

3、m3.3.4 保存文件3.3.5 清理item装载器与管理字段3.3.6 创建contract3.4 抽取更多的URL3.4.1 使用爬虫实现双向爬取3.4.2 使用CrawlSpider实现双向爬取3.5 本章小结第4章 从Scrapy到移动应用4.1 选择手机应用框架4.2 创建数据库和集合4.3 使用Scrapy填充数据库4.4 创建手机应用4.4.1 创建数据库访问服务4.4.2 创建用户界面4.4.3 将数据映射到用户界面4.4.4 数据库字段与用户界面控件间映射4.4.5 测试、分享及导出你的手机应用4.5 本章小结第5章 迅速的爬虫技巧5.1 需要登录的爬虫5.2 使用JSON

4、API和AJAX页面的爬虫5.2.1 在响应间传参5.3 30倍速的房产爬虫5.4 基于Excel文件爬取的爬虫5.5 本章小结第6章 部署到Scrapinghub6.1 注册、登录及创建项目6.2 部署爬虫与计划运行6.3 访问item6.4 计划定时爬取6.5 本章小结第7章 配置与管理7.1 使用Scrapy设置7.2 基本设置7.2.1 分析7.2.2 性能7.2.3 提前终止爬取7.2.4 HTTP缓存和离线运行7.2.5 爬取风格7.2.6 feed7.2.7 媒体下载7.2.8 Amazon Web服务7.2.9 使用代理和爬虫7.3 进阶设置7.3.1 项目相关设置7.3.2

5、Scrapy扩展设置7.3.3 下载调优7.3.4 自动限速扩展设置7.3.5 内存使用扩展设置7.3.6 日志和调试7.4 本章小结第8章 Scrapy编程8.1 Scrapy是一个Twisted应用8.1.1 延迟和延迟链8.1.2 理解Twisted和非阻塞I/O一个Python故事8.2 Scrapy架构概述8.3 示例1:非常简单的管道8.4 信号8.5 示例2:测量吞吐量和延时的扩展8.6 中间件延伸8.7 本章小结第9章 管道秘诀9.1 使用REST API9.1.1 使用treq9.1.2 用于写入Elasticsearch的管道9.1.3 使用Google Geocoding

6、 API实现地理编码的管道9.1.4 在Elasticsearch中启用地理编码索引9.2 与标准Python客户端建立数据库接口9.2.1 用于写入MySQL的管道9.3 使用Twisted专用客户端建立服务接口9.3.1 用于读写Redis的管道9.4 为CPU密集型、阻塞或遗留功能建立接口9.4.1 处理CPU密集型或阻塞操作的管道9.4.2 使用二进制或脚本的管道9.5 本章小结第10章 理解Scrapy性能10.1 Scrapy引擎一种直观方式10.1.1 级联队列系统10.1.2 定义瓶颈10.1.3 Scrapy性能模型10.2 使用telnet获得组件利用率10.3 基准系统欢

7、迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!10.4 标准性能模型10.5 解决性能问题10.5.1 案例 #1:CPU饱和10.5.2 案例 #2:代码阻塞10.5.3 案例 #3:下载器中的“垃圾”10.5.4 案例 #4:大量响应或超长响应造成的溢出10.5.5 案例 #5:有限/过度item并发造成的溢出10.5.6 案例 #6:下载器未充分利用10.6 故障排除流程10.7 本章小结第11章 使用Scrapyd与实时分析进行分布式爬取11.1 房产的标题是如何影响价格的11.2 Scrapyd11.3 分布式系统

8、概述11.4 爬虫和中间件的变化11.4.1 索引页分片爬取11.4.2 分批爬取URL11.4.3 从设置中获取初始URL11.4.4 在Scrapyd服务器中部署项目11.5 创建自定义监控命令11.6 使用Apache Spark流计算偏移量11.7 运行分布式爬取11.8 系统性能11.9 关键要点11.10 本章小结附录A 必备软件的安装与故障排除欢迎来到异步社区!欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!版权信息书名:精通Python爬虫框架ScrapyISBN:978-7-115-47420-9本书由人民

9、邮电出版社发行数字版。版权所有,侵权必究。您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。著美迪米特里奥斯 考奇斯-劳卡斯 (Dimitrios Kouzis-Loukas) 译李斌 责任编辑傅道坤人民邮电出版社出版发行北京市丰台区成寿寺路11号欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! 邮编100164 电子邮件 网址ht

10、tp:/读者服务热线:(010)81055410 反盗版热线:(010)81055315欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!版权声明Copyright Packt Publishing 2016. First published in the Englishlanguage under the title Learning Scrapy.All Rights Reserved.本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传

11、播。版权所有,侵权必究。欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!内容提要Scrapy是使用Python开发的一个快速、高层次的屏幕抓取和Web抓取框架,用于抓Web站点并从页面中提取结构化的数据。本书以Scrapy1.0版本为基础,讲解了Scrapy的基础知识,以及如何使用Python和三方API提取、整理数据,以满足自己的需求。本书共11章,其内容涵盖了Scrapy基础知识,理解HTML和XPath,安装Scrapy并爬取一个网站,使用爬虫填充数据库并输出到移动应用中,爬虫的强大功能,将爬虫部署到Scrapingh

12、ub云服务器,Scrapy的配置与管理,Scrapy编程,管道秘诀,理解Scrapy性能,使用Scrapyd与实时分析进行分布式爬取。本书附录还提供了各种必备软件的安装与故障排除等内容。本书适合软件开发人员、数据科学家,以及对自然语言处理和机器学习感兴趣的人阅读。欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!关于作者Dimitrios Kouzis-Loukas 作为一位顶级的软件开发人员,已经拥有超过15年的经验。同时,他还使用自己掌握的知识和技能,向广大读者讲授如何编写优秀的软件。他学习并掌握了多门学科,包括数学、物理

13、学以及微电子学。他对这些学科的透彻理解,提高了自身的标准,而不只是“实用的解决方案”。他知道真正的解决方案应当是像物理学规律一样确定,像ECC内存一样健壮,像数学一样通用。Dimitrios目前正在使用最新的数据中心技术开发低延迟、高可用的分布式系统。他是语言无关论者,不过对Python、C+和Java略有偏好。他对开源软硬件有着坚定的信念,他希望他的贡献能够造福于各个社区和全人类。欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!关于审稿人Lazar Telebak 是一位自由的Web开发人员,专注于使用Python库/框架

14、进行网络爬取和对网页进行索引。他主要从事于处理自动化和网站爬取以及导出数据到不同格式(包括CSV、JSON、XML和TXT)和数据库(如MongoDB、SQLAlchemy和Postgres)的项目。他还拥有前端技术和语言的经验,包括HTML、CSS、JS和jQuery。欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!前言让我来做一个大胆的猜测。下面的两个故事之一会和你的经历有些相似。你与Scrapy的第一次相遇是在网上搜索类似“Web scrapingPython”的内容时。你快速对其进行了浏览,然后想“这太复杂了吧我只需

15、要一些简单的东西。”接下来,你使用Requests库开发了一个Python脚本,并且挣扎于Beautiful Soup中,但最终还是完成了很酷的工作。它有些慢,所以你让它整夜运行。你重新启动了几次,忽略了一些不完整的链接和非英文字符,到早上的时候,大部分网站已经“骄傲地”存在你的硬盘中了。然而难过的是,不知什么原因,你不想再看到自己写的代码。当你下一次再想抓取某些东西时,则会直接前往scrapy.org,而这一次文档给了你很好的印象。现在你可以感受到Scrapy能够以优雅且轻松的方式解决了你面临的所有问题,甚至还考虑到了你没有想到的问题。你不会再回头了。另一种情况是,你与Scrapy的第一次相

16、遇是在进行网络爬取项目的研究时。你需要的是健壮、快速的企业级应用,而大部分花哨的一键式网络爬取工具无法满足需求。你希望它简单,但又有足够的灵活性,能够让你为不同源定制不同的行为,提供不同的输出类型,并且能够以自动化的形式保证24/7可靠运行。提供爬取服务的公司似乎太贵了,你觉得使用开源解决方案比固定供应商更加舒服。从一开始,Scrapy就像一欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!个确定的赢家。无论你是出于何种目的选择了本书,我都很高兴能够在这本专注于Scrapy的图书中遇到你。Scrapy是全世界爬虫专家的秘密。他

17、们知道如何使用它以节省工作时间,提供出色的性能,并且使他们的主机费用达到最低限度。如果你没有太多经验,但是还想实现同样的结果,那么很不幸的是,Google并没有能够帮到你。网络上大多数Scrapy信息要么太简单低效,要么太复杂。对于那些想要了解如何充分利用Scrapy找到准确、易理解且组织良好的信息的人们来说,本书是非常有必要的。我希望本书能够帮助Scrapy社区进一步发展,并使其得以广泛应用。欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!本书内容第1章,Scrapy简介,介绍本书和Scrapy,可以让你对该框架及本书剩余

18、部分有一个明确的期望。第2章,理解HTML和XPath,旨在使爬虫初学者能够快速了解Web相关技术以及我们后续将会使用的技巧。第3章,爬虫基础,介绍了如何安装Scrapy,并爬取一个网站。我们通过向你展示每一个行动背后的方法和思路,逐步开发该示例。学习完本章之后,你将能够爬取大部分简单的网站。第4章,从Scrapy到移动应用,展示了如何使用我们的爬虫填充数据库并输出给移动应用。本章过后,你将清晰地认识到爬虫在市场方面所带来的好处。第5章,迅速的爬虫技巧,展示了更强大的爬虫功能,包括登录、更快速地抓取、消费API以及爬取URL列表。第6章,部署到Scrapinghub,展示了如何将爬虫部署到Sc

19、rapinghub的云服务器中,并享受其带来的可用性、易部署以及可控性等特性。第7章,配置与管理,以组织良好的表现形式介绍了大量的Scrapy功能,这些功能可以通过Scrapy配置启用或调整。第8章,Scrapy编程,通过展示如何使用底层的Twisted引擎和Scrapy架构对其功能的各个方面进行扩展,将我们的知识带入一个全新欢迎加入Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍!的水平。第9章,管道秘诀,提供了许多示例,在这里我们修改了Scrapy的一些功能,在不会造成性能退化的情况下,将数据插入到数据库(比如MySQL、Elas

20、ticsearch及Redis)、接口API,以及遗留应用中。第10章,理解Scrapy性能,将帮助我们理解Scrapy的时间是如何花费的,以及我们需要怎么做来提升其性能。第11章,使用Scrapyd与实时分析进行分布式爬取,这是本书最后一章,展示了如何在多台服务器中使用Scrapyd实现横向扩展,以及如何将爬取得到的数据提供给Apache Spark服务器以执行数据流分析。阅读本书的前提为了使本书代码和内容的受众尽可能广泛,我们付出了大量的努力。我们希望提供涉及多服务器和数据库的有趣示例,不过我们并不希望你必须完全了解如何创建它们。我们使用了一个称为Vagrant的伟大技术,用于在你的计算机

21、中自动下载和创建一次性的多服务器环境。我们的Vagrant配置在Mac OS X和Windows上时使用了虚拟机,而在Linux上则是原生运行。对于Windows和Mac OS X,你需要一个支持Intel或AMD虚拟化技术(VT-x或AMD-v)的64位计算机。大多数现代计算机都没有问题。对于大部分章节来说,你还需要专门为虚拟机准备1GB内存,不过在第9章和第11章中则需要2GB内存。附录A讲解了安装必要软件的所有细节。Scrapy本身对硬件和软件的需求更加有限。如果你是一位有经验的读者,并且不想使用Vagrant,也可以根据第 3 章的内容在任何操作系统中安装Scrapy,即使其内存十分有

22、限。当你成功创建Vagrant环境后,无需网络连接,就可以运行本书几乎全部示例了(第4章和第6章的示例除外)。是的,你可以在航班上阅读本书了。本书读者本书尝试着去适应广泛的读者群体。它可能适合如下人群:需要源数据驱动应用的互联网创业者;需要抽取数据进行分析或训练模型的数据科学家与机器学习从业者;需要开发大规模爬虫基础架构的软件工程师;想要为其下一个很酷的项目在树莓派上运行Scrapy的爱好者。就必备知识而言,阅读本书只需要用到很少的部分。在最开始的几章中,本书为那些几乎没有爬虫经验的读者提供了网络技术和爬虫的基础知识。Python易于阅读,对于有其他编程语言基本经验的任何读者来说,与爬虫相关的

23、章节中给出的大部分代码都很易于理解。坦率地说,我相信如果一个人在心中有一个项目,并且想使用Scrapy的话,他就能够修改本书中的示例代码,并在几个小时之内良好地运行起来,即使这个人之前没有爬虫、Scrapy或Python经验。在本书的后半部分中,我们将变得更加依赖于Python,此时初学者可能希望在进一步研究之前,先让自己用几个星期的时间丰富Scrapy的基础经验。此时,更有经验的Python/Scrapy开发者将学习使用Twisted进行事件驱动的Python开发,以及非常有趣的Scrapy内部知识。在性能章节,一些数学知识可能会有用处,不过即使没有,大多数图表也能给我们清晰的感受。第1章S

24、crapy简介欢迎来到你的Scrapy之旅。通过本书,我们旨在将你从一个只有很少经验甚至没有经验的Scrapy初学者,打造成拥有信心使用这个强大的框架从网络或者其他源爬取大数据集的Scrapy专家。本章将介绍Scrapy,并且告诉你一些可以用它实现的很棒的事情。1.1初识ScrapyScrapy是一个健壮的网络框架,它可以从各种数据源中抓取数据。作为一个普通的网络用户,你会发现自己经常需要从网站上获取数据,使用类似Excel的电子表格程序进行浏览(参见第3章),以便离线访问数据或者执行计算。而作为一个开发者,你需要经常整合多个数据源的数据,但又十分清楚获得和抽取数据的复杂性。无论难易,Scra

25、py都可以帮助你完成数据抽取的行动。以健壮而又有效的方式抽取大量数据,Scrapy已经拥有了多年经验。使用Scrapy,你只需一个简单的设置,就能完成其他爬虫框架中需要很多类、插件和配置项才能完成的工作。快速浏览第7章,你就能体会到通过简单的几行配置,Scrapy可以实现多少功能。从开发者的角度来说,你也会十分欣赏Scrapy的基于事件的架构(我们将在第8章和第9章中对其进行深入探讨)。它允许我们将数据清洗、格式化、装饰以及将这些数据存储到数据库中等操作级联起来,只要我们操作得当,性能降低就会很小。在本书中,你将学会怎样可以达到这一目的。从技术上讲,由于Scrapy是基于事件的,这就能够让我们

26、在拥有上千个打开的连接时,可以通过平稳的操作拆分吞吐量的延迟。来看这样一个极端的例子,假设你需要从一个拥有汇总页的网站中抽取房源,其中每个汇总页包含100个房源。Scrapy可以非常轻松地在该网站中并行执行16个请求,假设完成一个请求平均需要花费1秒钟的时间,你可以每秒爬取16个页面。如果将其与每页的房源数相乘,可以得出每秒将产生1600个房源。想象一下,如果每个房源都必须在大规模并行云存储当中执行一次写入,每次写入平均需要耗费3秒钟的时间(非常差的主意)。为了支持每秒16个请求的吞吐量,就需要我们并行运行1600 3 = 4800次写入请求(你将在第9章中看到很多这样有趣的计算)。对于一个传

27、统的多线程应用而言,则需要转变为4800个线程,无论是对你,还是对操作系统来说,这都会是一个非常糟糕的体验。而在Scrapy的世界中,只要操作系统没有问题,4800个并发请求就能够处理。此外,Scrapy的内存需求和你需要的房源数据量很接近,而对于多线程应用而言,则需要为每个线程增加与房源大小相比十分明显的开销。简而言之,缓慢或不可预测的网站、数据库或远程API都不会对Scrapy的性能产生毁灭性的结果,因为你可以并行运行多个请求,并通过单一线程来管理它们。这意味着更低的主机托管费用,与其他应用的协作机会,以及相比于传统多线程应用而言更简单的代码(无同步需求)。1.2喜欢Scrapy的更多理由

28、Scrapy已经拥有超过5年的历史了,成熟而又稳定。除了上一节中提到的性能优势外,还有下面这些能够让你爱上Scrapy的理由。Scrapy能够识别残缺的HTML你可以在Scrapy中直接使用Beautiful Soup或lxml,不过Scrapy还提供了一种在lxml之上更高级的XPath(主要)接口selectors。它能够更高效地处理残缺的HTML代码和混乱的编码。社区Scrapy拥有一个充满活力的社区。只需要看看https:/ forum/#!forum/scrapy-users 上的邮件列表,以及StackOverflow网站(http:/ scrapy)中的上千个问题就可以知道了。大

29、部分问题都能够在几分钟内得到回应。更多社区资源可以从http:/scrapy.org/ community/中获取到。社区维护的组织良好的代码Scrapy要求以一种标准方式组织你的代码。你只需编写被称为爬虫和管道的少量Python模块,并且还会自动从引擎自身获取到未来的任何改进。如果你在网上搜索,可以发现有相当多专业人士拥有Scrapy经验。也就是说,你可以很容易地找到人来维护或扩展你的代码。无论是谁加入你的团队,都不需要漫长的学习曲线,来理解你的自定义爬虫中的特别之处。越来越多的高质量功能如果你快速浏览发布日志(http:/doc.scrapy.org/en/latest/news.html

30、),就会注意到无论是在功能上,还是在稳定性/bug修复上,Scrapy都在不断地成长。1.3关于本书:目标和用途在本书中,我们的目标是通过重点示例和真实数据集教你使用Scrapy。大部分章节将专注于爬取一个示例的房屋租赁网站。我们选择这个例子,是因为它能够代表大多数的网站爬取项目,既能让我们介绍感兴趣的变动,又不失简单。以该示例为主题,可以帮助我们聚焦于Scrapy,而不会分心。我们将从只运行几百个页面的小爬虫开始,最终在第11章中使用几分钟的时间,将其扩展为能够处理5万个页面的分布式爬虫。在这个过程中,我们将向你介绍如何将Scrapy与MySQL、Redis和Elasticsearch等服务

31、相连接,使用Google的地理编码API找到我们示例属性中的位置坐标,以及向Apache Spark提供数据用于预测最影响房价的关键词。你需要做好阅读本书多次的准备。你可能需要从略读开始,先理解其架构。然后阅读一到两章,仔细学习、实验一段时间,再进入后面的章节。如果你觉得自己已经熟悉了某一章的内容,那么跳过这一章也无需担心。尤其是如果你已经了解HTML和XPath,那么就没有必要花费太多时间在第2章上面了。不用担心,对你来说本书还有很多需要学习的内容。一些章节,比如第8章,将参考书和教程的元素结合起来,深入编程概念。这就是一个例子,我们可能会阅读某一章几次,在这中间允许我们有几个星期的时间实践

32、Scrapy。你在继续阅读后续的章节,比如以应用为主的第9章之前,不需要完美掌握第8章中的内容。阅读后续的内容,有助于你理解如何使用编程概念,如果你愿意的话,可以回过头来反复阅读几次。为使本书既有趣,又对初学者友好,我们已经试图做了平衡。不过我们不会做的一件事情是,在本书中教授Python。对于这一主题,目前已经有了很多优秀的书籍,不过我更加建议的是以一种轻松的心态来学习。Python如此流行的一个理由是因为它比较简单、整洁,并且阅读起来更近似于英文。Scrapy是一个高级框架,无论是初学者还是专家,都需要学习。你可以将其称之为“Scrapy语言”。因此,我会推荐你通过材料来学习Python,

33、如果你发觉自己对于Python的语法比较迷惑,那么可以通过一些Python的在线教程或Coursera等为Python初学者开设的免费在线课程予以补充。请放心,即使你不是Python专家,也能够成为一名优秀的Scrapy开发者。1.4掌握自动化数据爬取的重要性对于大多数人来说,掌握一门像Scrapy这样很酷的技术所带来的好奇心和精神上的满足,足以激励我们。令人惊喜的是,在学习这个优秀框架的同时,我们还能享受到开发过程始于数据和社区,而不是代码所带来的好处。1.4.1开发健壮且高质量的应用,并提供合理规划为了开发现代化的高质量应用,我们需要真实的大数据集,如果可能的话,在开始动手写代码之前就应该

34、进行这一步。现代化软件开发就是实时处理大量不完善数据,并从中提取出知识和有价值的情报。当我们开发软件并应用于大数据集时,一些小的错误和疏忽难以被检测出来,就有可能导致昂贵的错误决策。比如,在做人口统计学研究时,很容易发生仅仅是由于州名过长导致数据被默认丢弃,造成整个州的数据被忽视的错误。在开发阶段,甚至更早的设计探索阶段,通过细心抓取,并使用具有生产质量的真实世界大数据集,可以帮助我们发现和修复错误,做出明智的工程决策。另外一个例子是,假设你想要设计Amazon风格的“如果你喜欢这个商品,也可能喜欢那个商品”的推荐系统。如果你能够在开始之前,先爬取并收集真实世界的数据集,就会很快意识到有关无效

35、条目、停产商品、重复、无效字符以及偏态分布引起的性能瓶颈等问题。这些数据将会强迫你设计足够健壮的算法,无论是数千人购买过的商品,还是零销售量的新条目,都能够很好地处理。而孤立的软件开发,可能会在几个星期的开发之后,也要面对这些丑陋的真实世界数据。虽然这两种方法最终可能会收敛,但是为你提供进度预估承诺的能力以及软件的质量,都将随着项目进展而产生显著差别。从数据开始,能够带给我们更加愉悦并且可预测的软件开发体验。1.4.2快速开发高质量最小可行产品对于初创公司而言,大规模真实数据的集甚至更加必要。你可能听说过“精益创业”,这是由Eric Ries创造的一个术语,用于描述类似技术初创公司这样极端不确

36、定条件下的业务发展过程。该框架的一个关键概念是最小可行产品(Minimum Viable Product,MVP),这种产品只有有限的功能,可以被快速开发并向有限的客户发布,用于测试反响及验证业务假设。基于获得的反馈,初创公司可能会选择继续更进一步的投资,也可能是转向其他更有前景的方向。在该过程中的某些方面,很容易忽视与数据紧密连接的问题,这正是Scrapy所能为我们做的部分。比如,当邀请潜在的客户尝试使用我们的手机应用时,作为开发者或企业主,会要求他们评判这些功能,想象应用在完成时看起来应该如何。对于这些并非专家的人而言,这里需要的想象有可能太多了。这个差距相当于一个应用只展示了“产品1”、

37、“产品2”、“用户433”,而另一个应用提供了“三星 UN55J6200 55英寸电视机”、用户“Richard S”给出了五星好评以及能够让你直达产品详情页面(尽管事实上我们还没有写这个页面)的有效链接等诸多信息。人们很难客观判断一个MVP产品的功能性,除非使用了真实且令人兴奋的数据。一些初创企业将数据作为事后考虑的原因之一是认为收集这些数据需要昂贵的代价。的确,我们通常需要开发表单及管理界面,并花费时间录入数据,但我们也可以在编写代码之前使用Scrapy爬取一些网站。在第4章中,你可以看到一旦拥有了数据,开发一个简单的手机应用会有多么容易。1.4.3Google不会使用表单,爬取才能扩大规

38、模当谈及表单时,让我们来看下它是如何影响产品增长的。想象一下,如果Google的创始人在创建其引擎的第一个版本时,包含了一个每名网站管理员都需要填写的表单,要求他们把网站中每一页的文字都复制粘贴过来。然后,他们需要接受许可协议,允许Google处理、存储和展示他们的内容,并剔除大部分广告利润。你能想象解释该想法并说服人们参与这一过程所需花费的时间和精力会有多大吗?即使市场非常渴望一个优秀的搜索引擎(事实正是如此),这个引擎也不会是Google,因为它的增长过于缓慢。即使是最复杂的算法,也不能弥补数据的缺失。Google使用网络爬虫技术,在页面间跳转链接,填充其庞大的数据库。网站管理员则不需要做

39、任何事情。实际上,反而还需要一些努力才能阻止Google索引你的页面。虽然Google使用表单的想法听起来有些荒谬,但是一个典型的网站需要用户填写多少表单呢?登录表单、新房源表单、结账表单,等等。这些表单中有多少会阻碍应用增长呢?如果你充分了解你的受众/客户,很可能已经拥有关于他们通常使用并且很可能已经有账号的其他网站的线索了。比如,一个开发者很可能拥有Stack Overflow和GitHub的账号。那么,在获得他们允许的情况下,你是否能够抓取这些站点,只需他们提供给你用户名,就能自动填充照片、简介和一小部分近期文章呢?你能否对他们最感兴趣的一些文章进行快速文本分析,并根据其调整网站的导航结

40、构,以及建议的产品和服务呢?我希望你能够看到如何使用自动化数据抓取替代表单,从而更好地服务你的受众,增长网站规模。1.4.4发现并融入你的生态系统抓取数据自然会让你发现并考虑与你付出相关的社区的关系。当你抓取一个数据源时,很自然地就会产生一些问题:我是否相信他们的数据?我是否相信获取数据的公司?我是否需要和他们沟通以获得更正式的合作?我和他们是竞争关系还是合作关系?从其他源获得这些数据会花费我多少钱?无论如何,这些商业风险都是存在的,不过抓取过程可以帮助我们尽早意识到这些风险,并制定出缓解策略。你还会发现自己想知道能够为这些网站和社区带来的回馈是什么。如果你能够给他们带来免费的流量,他们应该会

41、很高兴。另一方面,如果你的应用不能给你的数据源带来一些价值,那么你们的关系可能会很短暂,除非你与他们沟通,并找到合作的方式。通过从不同源获取数据,你需要准备好开发对现有生态系统更友好的产品,充分尊重已有的市场参与者,只有在值得努力时才可以去破坏当前的市场秩序。现有的参与者也可能会帮助你成长得更快,比如你有一个应用,使用两到三个不同生态系统的数据,每个生态系统有10万个用户,你的服务可能最终将这30万个用户以一种创造性的方式连接起来,从而使每个生态系统都获益。例如,你成立了一个初创公司,将摇滚乐与T恤印花社区关联起来,你的公司最终将成为两种生态系统的融合,你和相应的社区都将从中获益并得以成长。1

42、.5在充满爬虫的世界里做一个好公民当开发爬虫时,还有一些事情需要清楚。不负责任的网络爬虫会令人不悦,甚至在某些情况下是违法的。有两个非常重要的事情是避免类似拒绝服务(DoS)攻击的行为以及侵犯版权。对于第一种情况,一个典型的访问者可能每几秒访问一个新的页面。而一个典型的网络爬虫则可能每秒下载数十个页面。这样就比典型用户产生的流量多出了10倍以上。这可能会使网站所有者非常不高兴。请使用流量限速将你产生的流量减少到可以接受的普通用户的水平。此外,还应该监控响应时间,如果发现响应时间增加了,就需要降低爬虫的强度。好消息是Scrapy对于这些功能都提供了开箱即用的实现(参见第7章)。对于版权问题,显然

43、你需要看一下你抓取的每个网站的版权声明,并确保你理解其允许做什么,不允许做什么。大多数网站都允许你处理其站点的信息,只要不以自己的名义重新发布即可。在你的请求中,有一个很好的User-Agent字段,它可以让网站管理员知道你是谁,你用他们的数据做什么。Scrapy在制造请求时,默认使用BOT_NAME参数作为User-Agent。如果User-Agent是一个URL或者能够指明你的应用名称,那么网站管理员可以通过访问你的站点,更多地了解你是如何使用他们的数据的。另一个非常重要的方面是,请允许任何网站管理员阻止你访问其网站的指定区域。对于基于Web标准的robots.txt文件(参见http:/

44、 Nutch,也就是说,它不是一个通用的网络爬虫。如果Scrapy访问一个一无所知的网站,它将无法做出任何有意义的事情。Scrapy是用于提取结构化信息的,需要人工介入,设置合适的XPath或CSS表达式。而Apache Nutch则是获取通用页面并从中提取信息,比如关键字。它可能更适合于一些应用,但对另一些应用则又更不适合。Scrapy不是Apache Solr、Elasticsearch或Lucene,换句话说,就是它与搜索引擎无关。Scrapy并不打算为你提供包含“Einstein”或其他单词的文档的参考。你可以使用Scrapy抽取数据,然后将其插入到Solr或Elasticsearch

45、当中,我们会在第9章的开始部分讲解这一做法,不过这仅仅是使用Scrapy的一个方法,而不是嵌入在Scrapy内的功能。最后,Scrapy不是类似MySQL、MongoDB或Redis的数据库。它既不存储数据,也不索引数据。它只用于抽取数据。即便如此,你可能会将Scrapy抽取得到的数据插入到数据库当中,而且它对很多数据库也都有所支持,能够让你的生活更加轻松。然而Scrapy终究不是一个数据库,其输出也可以很容易地更改为只是磁盘中的文件,甚至什么都不输出虽然我不确定这有什么用。1.7本章小结本章介绍了Scrapy,给出了它能够帮你做什么的概述,并描述了我们认为的使用本书的正确方式。本章还提供了几

46、种自动化数据抓取的方式,通过帮你快速开发能够与现有生态系统更好融合的高质量应用而获益。下一章将介绍HTML和XPath,这是两个非常重要的Web语言,我们在每个Scrapy项目中都将用到它们。第2章理解HTML和XPath为了从网页中抽取信息,你必须对其结构有更多了解。我们将快速浏览HTML、HTML的树状表示,以及在网页上选取信息的一种方式XPath。2.1HTML、DOM树表示以及XPath让我们花费一些时间来了解从用户在浏览器中输入URL(或者更常见的是,在其单击链接或书签时)到屏幕上显示出页面的过程。从本书的视角来看,该过程包含4个步骤,如图2.1所示。图2.1在浏览器中输入URL。U

47、RL的第一部分(域名,比如)用于在网络上找到合适的服务器,而URL以及cookie等其他数据则构成了一个请求,用于发送到那台服务器当中。服务端回应,向浏览器发送一个HTML页面。需要注意的是,服务端也可能返回其他格式,比如XML或JSON,不过目前我们只关注HTML。将HTML转换为浏览器内部的树状表示形式:文档对象模型(Document Object Model,DOM)。基于一些布局规则渲染内部表示,达到你在屏幕上看到的视觉效果。下面来看看这些步骤,以及它们所需的文档表示。这将有助于定位你想要抓取并编写程序获取的文本。2.1.1URL对于我们而言,URL分为两个主要部分。第一个部分通过域名

48、系统(Domain Name System,DNS)帮助我们在网络上定位合适的服务器。比如,当在浏览器中发送https:/ u/0/#inbox。URL的剩余部分对于服务端理解请求是什么非常重要。它可能是一张图片、一个文档,或是需要触发某个动作的东西,比如向服务器发送邮件。2.1.2HTML文档服务端读取URL,理解我们的请求是什么,然后回应一个HTML文档。该文档实质上就是一个文本文件,我们可以使用TextMate、Notepad、vi或Emacs打开它。和大多数文本文档不同,HTML文档具有由万维网联盟指定的格式。该规范当然已经超出了本书的范畴,不过还是让我们看一个简单的HTML页面。当访

49、问http:/时,可以在浏览器中选择View Page Source(查看页面源代码)以看到与其相关的HTML文件。在不同的浏览器中,具体的过程是不同的;在许多系统中,可以通过右键单击找到该选项,并且大部分浏览器在你按下Ctrl + U快捷键(或Mac系统中的Cmd + U)时可以显示源代码。在一些页面中,该功能可能无法使用。此时,需要通过单击Chrome菜单,然后选择Tools | View Source才可以。下面是http:/目前的HTML源代码。 Example Domain body background-color: . Example Domain This domain is established to be used for illustrative examples examples in documents. You may use this domain in examples without prior coordination or asking for permission. More information. 我将这个HTML文档进行了格式化,使其更具可读性,而你看到的情况可能是所有文本在同一行中。在HTML中,空格和换行在大多数情况下是无关紧要的。尖括号中间的文本(比如或)被称为标签。是起始标签,而是结束标签。这两种标签的唯一区别是/字符。这说

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 技术方案

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报