收藏 分享(赏)

用Python写网络爬虫.pdf

上传人:jintaihu 文档编号:5709151 上传时间:2022-06-15 格式:PDF 页数:171 大小:10.02MB
下载 相关 举报
用Python写网络爬虫.pdf_第1页
第1页 / 共171页
用Python写网络爬虫.pdf_第2页
第2页 / 共171页
亲,该文档总共171页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、 写澳 Richard Lawson著李斌译人民邮电出版社北京图书在版编目(CI P)数据用Python写网络爬虫(澳大利亚)理查德劳森(Richard Lawson)著;李斌译一北京:人民邮电出版社,2016.9ISBN 978-7-115-43179一0I . 用II . 理李III. 软件工具一程序设计N.TP311. 56 中国版本图书馆CIP数据核宇(2016)第177976号版权声明Cop严ight 2 0 15 Packt Publishing. First published in the English language under the title Web Scrapin

2、g with Python. All Rights Reserved. 本书 由英国Packt Publishing公司授权人民邮电出版社出版。 未经出版者书面许可, 对本书的任何部分不得以任何方式或任何手段复制和传播。版权所有, 侵权必究。 著澳 Richard Lawson 译李斌责任编辑傅道坤责任印制焦志炜 人民邮电出版社出版发行北京市丰台区成寿寺路II号邮编100164 电子邮件3 l 网址http:/ 三河市海波印务有限公司印刷 开本:800 x!OOO 1/16 印张: 10.75 字数z 148千字印数z 1-3000册著作权合同登记号2016年9月第l版2016年9月河北第1次

3、印刷图字:0 1-2 0 16-3962 号定价:45.00元读者服务热线: (010) 81055410 印装质量热线:(010) 81055316 反盗版热线:(010) 81055315 内容提要本书讲解了如何使用P川lOil来编写 网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的三种方法,提取缓存中 的数据,使用 多个线程和进程来进行并发抓取,如何抓取动态页面中 的 内容,与表单进行交互,处理页面中 的验证码问题,以及使用 Sca rpy 和 Portia 来进行数据抓取,并在最后使用本书介绍的数据抓取技术对几个真实的 网站进行了抓取,旨在帮助读者活学活用书中介绍的技术。本书适合

4、有一定Python 编程经验,而且对爬虫技术感兴趣的读者阅读。关于作者Richard Lawson 来 自澳大利亚,毕业于墨尔本大学计算机科学专业。 毕业后 , 他创办了一家专注于网络爬虫的公司 , 为超过 50 个国家的业务提供远程工作 。 他精通于世界语,可以使用汉语和韩语对话,并且积极投身于开源软件。 他 目 前在牛津大学攻读研究生学位, 并利用业余时间研发 自 主无人机。我要感谢Timothy Baldwin 教授将我引入这个令人兴奋的领域,以及本书编写时在巴黎招待我的iara 可Douc。欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本

5、Py t h o n 书籍!关于审稿人Martin Bur咄是一名常驻纽约的数据记者, 其工作是为华尔街日报绘制交互式图表。 他在新墨西哥州立大学获得了新闻学和信息系统专业的学士学位,然后在纽约城市大学新闻学研究院获得了新闻学专业硕士学位。我要感谢我的妻子Lisa鼓励我协助本书的创作,我的叔叔Michael耐心解答我的编程问题, 以及我的父亲Richard激发了我对新闻学和写作的热爱。William Sankey是一位数据专业人士,也是一位业余开发人员,生活在马里兰州科利奇帕克市。 他于2012年毕业于约翰霍普金斯大学,获得了公共政策硕士学位,专业方向为定量分析。他目前在L &M政策研究有限责

6、任公司担任健康服务研究员, 从事与 美国医疗保险和医疗补助服务中心 (CMS) 相关的项目。 这些项目包括责任医疗机构评估以及精神病院住院患者预付费系统监测。我要感谢我深爱的妻子Julia和顽皮的小猫Ruby,给予我全部的爱和支持。欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!关于审稿人Ayush Tiwari是一名Python开发者,本科就读于印度理 工学院罗克分校。他自2013年起工作于印度理工学院罗克分校信息管理小组,并活跃于网 络开发领域。 对他而言, 审阅本书是一个非常棒的经历。 他不仅是一名审稿人,也是一

7、名狂热的网 络爬虫学习者。 他向所有Python爱好者推荐本书, 以便享受爬虫的益处。他热衷于Python网 络爬虫,曾参与 体育直播订阅、 通用P川lOil电子商务网 络爬虫(在Miranj)等 相关项目。他还使用 Django应用开发了就业门户, 帮助改善印度理 工学院罗克分校的就业流程。除了后端开发之外, 他还喜欢使用诸如N u m Py、 SciPy等Python库进行科学计算和数据分析,目前他从事计算流体力学领域的研究。你可以在Git Hub上访问到他的项目, 他的用户名是 t iwariay ush。他喜欢徒步穿越喜马拉雅山谷,每年会参加多次徒步行走活动。此外,他还喜欢弹吉他。 他

8、的成就还包括参加国际知名的Su per30小组, 并在其中成为排名保持者。 他在高中时, 还参加了国际奥林匹克数学竞赛。我的家庭成员(我的姐姐Aditi、 我的父母以及Anand先生)、 我在VI和IMG的朋友以及我的教授都为我提供了很大的帮助。我要感谢他们所有人对我的支持。最后,感谢尊敬的作者和Packt出版社团队出版了这些非常好的技术书籍。 我要对他们在编写这些书籍时的所有辛苦工作表示赞赏。2 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!.a.&. .1刷昌互联网 包含了迄今为止最有用的数据集, 并且大部分可以

9、免费公开访问。但是, 这些数据难以复用。 它们被嵌入在网 站的结构和样式当中, 需要抽取出来才能使用。 从网 页中抽取数据的过程又被称为网 络爬虫。 随着越来越多的信息被发布到网 络上, 网 络爬虫也变得越来越有用。本书内容第1章, 网 络爬虫简 介, 介绍了网 络爬虫, 并讲解了爬取网站的方法。第2章, 数据抓取,展示了如何从网 页中抽取数据。第3章, 下载缓存, 学习了如何通过缓存结果避免重复下载的问题。第4章, 并发下载, 通过并行下载加速数据抓取。第5章, 动态内容,展示了如何从动态网 站中抽取数据。第6章, 表单交互,展示了如何与 表单进行交互,从 而访问你需要的数据。第7章, 验证

10、码处理, 阐述了如何访问被验证码图像保护的数据。第8章, Scrapy, 学习了如何使用流行的高级框架 Scrapy。第9章, 总结,对我们介绍的这些网 络爬虫技术进行总结。欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!前言阅读本书的前提本书中所有的代码都己经在 Python2.7环境中进行过测试, 并且可以从htt p: /bi tbucket. org/wswp/code 下载到这些源代码。 理想情况下,本书未来的版本会将示例代码移植到Python3当中。 不过, 现在依赖的很多库(比如Scrapy/Twiste

11、d、 Mechan ize和Gho st) 还只支持Python2。 为了 帮助阐明爬取示例, 我们创建了一个示例网 站, 其网 址为 htt p: /example.webscraping. com。 由于该网站限制了下载内容的速度,因此如果你希望自行搭建示例网 站,可以从h tt p: /bi tbucket. org/wswp/places获取网站源代码和安装说明。我们决定为本书中使用的大部分示例搭建一个定制网站, 而不是抓取活跃网站, 这样我们就对环境拥有了完全控制。 这种方式为我们提供了稳定性,因为活跃网 站要比书中的定制网 站更新更加频繁, 并且当你尝试运行爬虫示例时, 代码可能已

12、经无法工作。另外, 定制网 站允许我们自定义示例, 用于阐释特定技巧并避免其他干扰。 最后, 活跃网 站可能并不欢迎我们使用它作为学习网 络爬虫的对象, 并且可能会尝试封禁我们的爬虫。 使用我们自己定制的网 站可以规避这些风险, 不过在这些例子中学到的技巧确实也可以应用到这些活跃网 站当中。本书读者阅读本书需要有一定的编程经验,并且不适用于绝对的初学者。在实践中,我们将会首先实现我们自己的网 络爬虫技术版本,然后才会介绍现有的流行模块, 这样可以让你更好地理解这些技术是如何工作的。 本书中的这些示例将假 设你已经拥有Python语言以及使用pip安装模块的能力。如果你想复习一下这些知识,有一本

13、非常好的免费在线书籍可以使用, 其作者为Mark2 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!前言Pilg rim,书 籍网址是http: /www. di veintop y thon. net 。这本书也是我初学Python时所使用的资源。此外,这些例子还假 设你己经了解网页是如何使用HTML进行构建并通过JavaScript 更新的知识。 关于HTTP、 css、 A J A X、 Web Kit 以及M ongoDB的既有知识也很有用, 不过它们不是必需的,这些技术会在需要使用时进行介绍。上述很多主题的详

14、细参考 资料可以从 ht t p: /www. w3schools. com获取到。3 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!目录第1章网络爬虫简介1.1 网络爬虫何时有用.1.2 网络爬虫是否合法 21.3 背景调研31.3.1 检查 robots .txt.3 1.3.2 检查网站 地图.4 1.3.3 估算网站 大小.51.3.4 识别网站 所用技术71.3.5 寻找网站 所有者. 71.4 编写第一个网络爬虫.81.4.1 下载网 页.9 1.4.2 网站 地图爬虫.12 1.4.3 ID遍历爬虫13

15、 1.4.4 链接爬虫15 1.5 本章小结n第2章数据抓取23 2.1 分析网页.232.2 三种网页抓取方法.262.2.1 正则表达式26欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!目录2.2.2 Beautifu l Sou p .28 2.2.3 Lxml30 2.2.4性能对比.322.2.5 结论.352.2.6 为链接爬虫添加抓取回调.35 2.3 本章小结.38第3章下载缓存39 3.1 为链接爬虫添加缓存支持.39 3.2 磁盘缓存.42 3.2.1 实现.443.2.2 缓存测试.463.2.

16、3 节省磁盘空间.463.2.4清理过期数据.47 3.2.5缺点.483.3 数据库缓存.”3.3.1 NoS QL是什么.503.3.2 安装M ongoDB.503.3.3 M ongoDB概述.503.3.4 M ongoDB缓存实现.523.3.5 压缩.”3.3.6 缓存测试”.543.4 本章小结. 妇第4章并发下载57 4.1 100万个网页.57 4.2 串行爬虫.604.3 多线程爬虫.602 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!目录4.3.1 线程和进程如何工作.“4.3.2 实现.6

17、14.3.3 多进程爬虫.63 4.4 性能.67 4.5 本章小结 .68 第5章动态内容69 5.1 动态网页示例.69 5.2 对动态网页进行逆向工程.725.3 渲染动态网页.77 5.3.1 PyQt 还是PySide785.3.2 执行JavaScript.7g 5.3.3 使用WebKit 与 网站 交互.805.3.4 Selenium . 85 5.4本章小结.gg 第6章表单交E89 6.1 登录表单.90 6.2 支持内容更新的登录脚本扩展.97 6.3 使用 Mechan ize模块实现自动化表单处理.100 6.4 本章小结102第7章验证码处理103 7.1 注册账

18、号103 7.2 光学字符识别1067.3 处理复杂验证码.111 7.3.1 使用验证码处理服务.112 7.3.2 9kw入门1123 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!目录7.3.3 与注册功能集成.119 7.4 本章小结 .120第8章Scrapy121 8.1 安装.121 8.2启动项目.122 8.2.1 定义模型.1238.2.2 创建爬虫.124 8.2.3 使用 sh el l命令抓取.128 8.2.4 检查结果.1298.2.5 中断与恢复爬虫”.132 8.3 使用Port i

19、a编写可视化爬虫.133 8.3.1 安装.133 8.3.2 标注1368.3.3 优化爬虫138 8.3.4检查结果.140 8.4 使用Scrap el y 实现自动化抓取.1418.5 本章小结.142 第9章总结143 句300OOAUI句3呵,ATA丛TA件,、dp气dF飞d,、d4EA唱EA唱BEAEA唱EAEA唱A擎23 索站千搜业网M结kmMHuh 句J,町鸣叫UUP马章AUh吭吭AU宝本咽且咱,“咱3AaTZJ0707070707 4 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!本 章中, 我们

20、将会介绍如下主题:网 络爬虫领域简介:解释合法性质疑:对目标网站 进行背景调研1逐步完善一个高级网 络爬虫。1 .1 网络爬虫何时有用第1章网络爬虫简介假 设我有一个鞋店, 并且想要及时了解竞争对手的价格。 我可以每天访问他们的网站, 与 我店铺中鞋子的价格进行对比。但是, 如果我店铺中的鞋类品种繁多,或是希望能够更加频繁地查看价格变化的话, 就需要花费大量的时间,甚至难以实现。 再举一个例子, 我看中了一双鞋, 想等它促销时再购买。我可能需要每天访问这家鞋店的网 站来查看这双鞋是否降价, 也许需要等待几个月的时间, 我才能如愿盼到这双鞋促销。 上述这两个重复性的手 工流程,都可以利用本 书介

21、绍的网 络爬虫技术实现自动化处理。欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!第 1 章网络爬虫简介理想状态下,网 络爬虫并不是必须品,每个网站 都应该提供API, 以结构化的格式共享它们的数据。然而现实情况中,虽然一些网站已经提供了这种API,但是它们通常会限制可以抓取的数据,以及访问这些数据的频率。另外,对于网站的开发者而言, 维护前端界面比维护后端API接口优先级更高。 总之, 我们不能仅仅依赖于API去 访问我们所需的在线数据, 而是应该学习一些网 络爬虫技术的相关知识。1 .2 网络爬虫是否合法网 络爬虫

22、目前还处于早期的蛮荒阶段,“允许哪些行为”这种基本秩序还处于建设之中。从目前的实践来看, 如果抓取数据的行为用于个人使用,则不存在问题:而如果数据用于转载,那么抓取的数据类型就非常关键了。世界各地法院的一些案件可以帮助我们确定哪些网 络爬虫行为是允许的。在Feist Publications, Inc.起诉Rural Tel写phone Service Co.的案件中, 美国联邦最高法院裁定抓取并转载真实数据 (比如, 电话清单是允许的。而在澳大利亚,Telstra Corporation Limited起诉Phone Directories Company Pty Ltd 这一类似案件中,则

23、裁定只有拥有明确作者的数据, 才可以获得版权。此外, 在欧盟的ofir.dk起诉home.dk一案中,最终裁定定期抓取和深度链接是允许的。这些案件告诉我们,当抓取的数据是现实生活中的真实数据(比如,营业地址、电话 清单) 时, 是允许转载的。 但是, 如果是原创数据(比如, 意见和评论), 通常就会 受到版权限制,而不能转载。无论如何,当你抓取某个网站的数据时,请记住自己是该网站的访客,应当约束自己的抓取行为, 否则他们可能会封禁你的I P,甚至采取更进一步的法律行动。 这就要求下载请求的速度需要限定在一个合理值之内, 并且还需要设定一个专属的用户代理来标识自己。在下面的小节中我们将会对这些实

24、践进行具体介绍。2 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!1.3 背景调研关于上述几个法律案件的更多信息可以参考下述地址: http:/ getcase. pl?court=US&vol=499&invol=340 http:/www.austlii.edu.au/au/cases/cth/ FCA/2010/44.html http:/www.bvhd.dk/uploads/tx mocarticles /S og Handelsrettens afg relse i Ofir-sagen.pdf 1 .3

25、 背景调研在深入讨 论爬取一个网站之前,我们首先需要对目标站 点的规模和结构进行一定程度的了解。 网站 自身的robots.txt 和S itema p文件都可以为我们提供一定的帮助,此外还有一些能提供更详细信息的外部 工具,比如Googl e搜索和WHOIS。1.3.1 检查robots.txt大多数网站都会定义robots. txt文件, 这样可以让爬虫了解爬取该网站时存在哪些限制。 这些限制虽然仅仅作为建议给出,但是良好的网 络公民都应当遵守 这些限制。 在爬取之前, 检查robots.txt文件这一宝贵资源可以最小化爬虫被封禁的可能,而且还能发现 和网站 结构相关的线索。关于robot

26、s. t xt协议的更多信息可以参见 http: /www.robotstxt. org。下面的代码是我们的示例文件 robots.txt中的内容,可以访问 ht tp:/exam p le.webscra ping. com/robots.txt 获取。r e w a r 户Ud a B 叮4,卡Mnn oew qo ta1le c4 era ses s工UD 3 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!第 1 章网络爬虫简介# section 2 User-agent : * Crawl-delay : 5

27、 Disallow : /trap # section 3 Sitemap : http : /example . webscraping . com/sitemap . xml 在section 1 中,robots.txt 文件 禁止用户代理为BadCrawler 的爬虫爬取该网站, 不过这种写法可能无法起 到应有的作用,因为恶意爬虫根本不会遵从robots. txt 的要求。本 章后面的一个例 子将会 展示如何让爬虫自动遵守robots. txt 的要求。section 2规定, 无论使用哪种用户代理, 都应该在两次下载请求之间给出5秒 的抓取延迟,我们需要遵从该建议以避免服务器过载。

28、这里还有一个trap 链接,用于封禁那些爬取了不允许链接的恶意爬虫。如果你访问了这个链接,服务器就会封禁你的 I P 一分钟!一个真实的网站 可能会对你的 I P 封禁更长时间, 甚至 是永久封禁。不过如果这样设置 的话, 我们就无法继续这个例 子了。section 3 定义了一个S itemap 文件, 我们将在下一节中了解如何检查该文件。1.3.2 检查网站地图网站提供的Sitemap 文件(即网站 地图) 可以帮助爬虫定位网站最新的内容 , 而 无须爬 取每 一 个网页。 如 果 想要了 解 更多信息,可 以从http: /www. sitemaps. org/protocol.html

29、 获取网 站 地图标准 的定义。下面 是在robots. txt 文件中发现的Sitemap 文件的内容。?xml version ” 1 .。” encoding”UTF- 8 ”?urlset xmlns”http : /www . sitemaps . org/schemas/sitemap/0 . 9 ”http : /example . webscraping . com/view/Afghanistan-1 http : /example . webscraping . com/view/Aland-Islands-2 4 欢迎加入非盈利Py t h o n 编程学习交流QQ群78

30、3462347,群里免费提供500+本Py t h o n 书籍!1 .3 背景调研 http : /example . webscraping . com/view/Albania-3 网站 地图提供了所有网页的链接, 我们会在后面的小节中使用这些信息,用于创建我们的第一个爬虫。 虽然Sitema p文件提供了一种爬取网站 的有效方式, 但是我们仍需对其谨慎处理,因为该文件经常存在缺失、过期 或不完整的问题。1.3.3 估算网站大小目标网站 的大小会影响我们如何进行爬取。 如果是像我们的示例站 点这样只有几百个URL的网站,效率并没有那么重要:但如果是拥有数百万个网页的站 点, 使用串行下载

31、可能需要持续数月才能完成, 这时就需要使用第4章中介绍的分布式下载来解决了。估算网站 大小的一个简便方法是检查Google爬虫的结果,因为Google很可能已经爬取过我们感兴趣的网站。 我们可以通过Google搜索的site 关键词过滤域名结果,从而获取该信息。我们可以从http : /www. search 了解到该接口及其他高级搜索参数的用法。图1.1所示为使用site 关键词对我们的示例网站 进行搜索的结果,即在Google中搜索 site: exam ple. webscra ping. com o从图1.1中可以看出,此时Google估算该网站 拥有202个网页, 这和实际情况差不多

32、。不过对于更大型的网站,我们会发现Google的估算并不十分准确。在域名后面添加URL路径,可以对结果进行过滤,仅显示网站 的某些部分。图1.2所示为搜索 site: exam ple. webscra ping. com/view 的结果。该搜索条件会限制Google只搜索国家页面。5 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!第 1 章网络爬虫简介Aboul202re田JltS伺45蕃emnds)AF Example web scrapng website 辄酬阳.we民町,商ping.oomlcor世in回

33、I/AFExam阱嗣b阳叩ing¥盹脚.Arri目,闻geria Angela senin Sotswana 刷刷naFa回6田undlC副陌roonca阳Verde C田11ra1 Arri国nR邱刷lcCh副NAxanple web scraP.ing webs挂e ex翻F瑞eE翼田胃pie web缸万冒pir咱w雹画捶. IJ。曲Arr咀e拖aAn窜山l国 Anti凯iaar晴B酣budaA阳ba Saha、a&Sa1胁ad。SB毫撼IZI”Bl伺11Ud握哥。nala,Saint Eus恒屈JSand . NE-E姐mpleeb scraping website e阻mpl且W创JS

34、CI胃病g.oomllso/捋ENalklnal Fl咽M回:1,267,000 S嗯且惜据阳阳elli剧,问pula如n: 10,676,27专lso:NE. Country: IJ胁,.Cai就醋Nlam町C曲睛酣吐AF.Tlcl: J班Curr田,cy Code: XOF. NG -Example web saping website e刷脚.wet刷刷lisol闸,National Fl啕:岛国:923,768squa阳闹。metres. Pcul硝or应154,00口,000.1聪:NG.C咀Jntry: N精制a巳apl国E Alli!由acon剧团提:AF. Tld: .ng.

35、currency C时居:NGN.图 1.1About 117明ults(0.52 seam峭Example web部rapingwebsite 就ami归”W确scraping.:m1/view/Guemse沪倪,Natio捕F陆g:A,回:76squ町ekllom钝国.Population: 65,22苗,i四:GG.Cou晴y.G佳emse于“Capital:St Peter p。她Con伽ent EU. Tld: .gg. Currency Code: GBP. Example web scraping website 回am树e.w唾民臼撞倒fv梅w/Je陀曹y-113 . Nat阳

36、nal F句:阳明:116呵U脚扭llornet阳.P句“la切罚;阂,612.lso: JE. Country: Jerse沪Capital: Saini Hel田.Conti阴阳t EU.T陆:.je. Currency Code: GBP. PK -Example eb scraping website e泪m阱.webscra酬lv恒w/P副stan-1邸,National Fl句:A陌a:8部,S铅squa用kffome悦s. Population: 184,404,791.国:PK.C由mtry: Pak陆;tan. Cap幅:1时ama缸ad.Cont加剧1l:AS“lld:.p

37、k Currency Code . Example web scrapinQ website -WebS example.w盼scra阪 . Na悔自atFlag; Area: 329,750 squa阳kllometJ髓,Popi!翩。n:28,27 4, 729精I盹:MY“C皿miry: Ma姐ysia.Ca回国:Kuala L四npur.Con11nent AS. Tld: .my. C町rency町图 1.2这种附加的过滤条件非常有用,因为在理想情况下,你只希望爬取网站中包含有用数据的部分,而不是爬取网站 的每个页面。6 欢迎加入非盈利Py t h o n 编程学习交流QQ群7834

38、62347,群里免费提供500+本Py t h o n 书籍!1.3 背景调研1 .3.4 识别网站所用技术构建网站 所使用的技术类型也会对我们如何爬取产生影响。有一个十分有用的工具可以检查网站 构建的技术类型一builtwith模块。该模块的安装方法如下。pip install builtwith 该模块将URL作为参数,下载该URL并对其进行分析,然后返回该网站使用的技术。下面是使用该模块的一个例子。 imp。rt builtwith builtwith . parse ( http : /example . webscraping . c。m u j avascript-framew,。

39、rks :u jQl且ery , u M。dernizr , u jQl且ery UI I u pr。gramming-languages :u Pyth。n I u web-framew。rks :u Web2py ,u Twitter B。tstrap , u web-servers : u Nginx 从上面的返回结果中可以看出,示例网站 使用了Pyt hon的Web2py 框架,另外还使用了一些通用的JavaScript 库,因此该网站 的内容很有可能是嵌入在HTML中的,相对而言比较容易抓取。 而如果改用Angul ar JS构建该网站,此时的网站 内容就很可能是动态加载的。另外,

40、如果网站 使用了AS P .NET ,那么在爬取网页时, 就必须要用到会话管理和表单提交了。对于这些更加复杂的情况, 我们会在第5 章和第6章中进行介绍。1 .3.5 寻找网站所有者对于一些网站,我们可能会关心其所有者是谁。比如,我们已知网站 的所有者会封禁网 络爬虫,那么我们最好把下载速度控制得更加保守一些。为了找到网站 的所有者, 我们可以使用WHOIS协议查询域名的注册者是谁。Py th on中有一个针对该协议的封 装库,其文档地址为http s: / pypi. python.org/ pypi/ python-whois, 我们可以通过 pip进行安装。7 欢迎加入非盈利Py t h

41、 o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!第l章网络爬虫简介pip install pyth。n-wh。is下面是使用该模块对 这个域名进行WHOIS查询时的返回结果。 imp。rt wh。is print whois . wh。is ( appsp。t . com 、四.e_servers : , ”NSl . G。GLE . COM” ,”NS2 . G。GLE . COM” ,”NS3 . G。GLE . COM” ,”NS4 . G。GLE . C。M” ,”ns4 . q。qle . com” ,”ns2 . q。qle . c

42、om” ,”nsl . q。qle . com” ,”ns3 . q。qle . c。m”。rq” :”G。qleInc . ” , ”e啤ails” :”abusecomplaintsmarkm。nit。r . com” ,”dns-ad皿inq。gle . com”从结果中可以看出该域名归属于 Google , 实际上也确实如此。该域名是用于GoogleApp E ngine服务的。当我们爬取该域名时就需要十分小心,因为Google经常会阻断网络爬虫,尽管实际上其自身就是一个网络爬虫业务。1 .4 编写第一个网络爬虫为了抓取网站,我们首先需要下载包含有感兴趣数据的网页,该过程一般被称为爬取

43、(crawling)。爬取一个网站 有很多种方法, 而选用哪种方法更加合适,则取决于目标网站 的结构。本 章中,首先会探讨如何安全地下载网页,然后会介绍如下3种爬取网站 的常见方法:8 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!爬取网站 地图1遍历每个网页的数据库ID;跟踪网页链接。1 .4.1 下载网页1.4 编写第一个网络爬虫要想爬取网页,我们首先需要将其下载下来。下面的示例脚本使用Python的urllib2模块下载URL。import urllib2 def download (url) : return

44、 urllib2 . url。pen (url) . read ( ) 当传入URL参数时,该函数将会下载网页并返回其HTML。不过, 这个代码片段存在一个问题,即当下载网页时, 我们可能会遇到一些无法控制的错误, 比如请求的页面可能不存在。此时,urlli b2会抛出异常,然后退出脚本。安全起 见,下面再给出一个更健壮的版本,可以捕获这些异常。import urllib2 def download (url ) : print D。wnl。ading : ,url try : html = urllib2 . urlopen (url) . read ( ) except urllib2 .

45、URLError as e : print Downl。ad err。r : ,e . reas。nhtml = None return html 现在,当出现下载错误时,该函数能够捕获到异常,然后返回None。1. 重试下载下载时遇到的错误经常是临时性的, 比如服务器过载时返回的 503S ervice U navailable错误。 对于此类 错误, 我们可以尝试重新下载,因为这个服务器问题现在可能己解决。不过, 我们不需要对所有错误都尝试重9 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!第1章网络爬虫简介新下

46、载。 如果服务器返回的是404 Not Found 这种错误,则说明 该网页目前并不存在,再次尝试同样的请求一般也不会出现不同的结果。互联网工程任务组( In te rn etE ng in eering T ask Forc e ) 定义了H?错误的完整列表, 详情 可参考http s: /tools. ietf. org/html/rfc7 231# section- 6。从该 文档中,我们可以了解到4xx错误发生在请求存在问题时,而5xx错误则发生在服务端存在问题时。所以,我们只需要确保download函数在发生Sxx错误时重试下载即可。下面是支持重试下载功能的新版本代码。def dow

47、nload (url , num retries=2 ) : print D。wnloading : ,urltry : html = urllib2 . urlopen (url) . read ( ) except urllib2 . URLError as e : print Download error : ,e . reason html = None if num retries 0: if hasattr (e, code ) and 500 = e . code ae4 Tim臼饱mp: Mon.06心ct-14 18:55:48 GMT Yo咀rIP address: 83.

48、27.128.162 Reques撞ed URL: www.mee灿 E.or reference number: I 0 IO Server ID: FL 33F7 User-Agent:时也on-urllib/2.7图1.3因此,为了下载更加可靠,我们需要控制用户代理的设定。下面的代码对download函数进行了修改, 设定了一个默认的用户代理“wsw p”(即WebScraping with Python 的首字母缩写 )。def d。wnload (url ,user agent wswp ,num retries=2 ) : print Downloading : ,url head

49、ers User-agent :user agent request = urllib2 . Request (url , headers=headers ) try : html = urllib2 . urlopen (request) read ( ) except urllib2 . URLError as e : print Download error : ,e . reason html = None 11 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍!第l章网络爬虫简介if num retries 0: if hasattr (e, code ) and 500 = e . code (. * ? ) +href ” ( 丰?) ” ,re. IGNORECASE) # list of all links from the webpage retur口 webpage regex.findall(html ) 要运行这段代码,只需要调用 link crawler函数, 并传入两个参数:要爬取的网站URL和用于跟踪链接的正则表达式。 对于示例网站, 我们想要爬取的是国家列表索引页和国家页面。其中,索引页链接格式如下。 http: I I example. webs craping. co

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

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

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


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

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

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