带你读《Python网络爬虫从入门到实践(第2版)》之一:网络爬虫入门

 阿里云安全     |      2019-11-06 00:00:00

点击查看第二章
点击查看第三章
Python网络爬虫从入门到实践(第2版)

image.png

唐 松 编著

第1章

网络爬虫入门
网络爬虫就是自动地从互联网上获取程序。想必你听说过这个词汇,但是又不太了解,会觉得掌握网络爬虫还是要花一些工夫的,因此这个门槛让你有点望而却步。
我常常觉得计算机和互联网的发明给人类带来了如此大的方便,让人们不用阅读说明书就能知道如何上手,但是偏偏编程的道路又是如此艰辛。因此,本书尽可能地做到浅显易懂,希望能够将网络爬虫学习的门槛降低,大家都能享受到使用网络爬虫编程的快乐。
本书的第1章将介绍网络爬虫的基础部分,包括学习网络爬虫的原因、网络爬虫带来的价值、网络爬虫是否合法以及网络爬虫的基本议题和框架。让读者在开始学习爬虫之前理解为什么学习、要学什么内容。

1.1 为什么要学网络爬虫

在数据量爆发式增长的互联网时代,网站与用户的沟通本质上是数据的交换:搜索引擎从数据库中提取搜索结果,将其展现在用户面前;电商将产品的描述、价格展现在网站上,以供买家选择心仪的产品;社交媒体在用户生态圈的自我交互下产生大量文本、图片和视频数据等。这些数据如果得以分析利用,不仅能够帮助第一方企业(拥有这些数据的企业)做出更好的决策,对于第三方企业也是有益的。而网络爬虫技术,则是大数据分析领域的第一个环节。

1.1.1 网络爬虫能带来什么好处

大量企业和个人开始使用网络爬虫采集互联网的公开数据。那么对于企业而言,互联网上的公开数据能够带来什么好处呢?这里将用国内某家知名家电品牌举例说明。
作为一个家电品牌,电商市场的重要性日益凸显。该品牌需要及时了解对手的产品特点、价格以及销量情况,才能及时跟进产品开发进度和营销策略,从而知己知彼,赢得竞争。过去,为了获取对手产品的特点,产品研发部门会手动访问一个个电商产品页面,人工复制并粘贴到Excel表格中,制作竞品分析报告。但是这种重复性的手动工作不仅浪费宝贵的时间,一不留神复制少了一个数字还会导致数据错误;此外,竞争对手的销量则是由某一家咨询公司提供报告,每周一次,但是报告缺乏实时性,难以针对快速多变的市场及时调整价格和营销策略。针对上述两个痛点——无法自动化和无法实时获取,本书介绍的网络爬虫技术都能够很好地解决,实现实时自动化获取数据。
上面的例子仅为数据应用的冰山一角。近几年来,随着大数据分析的火热,毕竟有数据才能进行分析,网络爬虫技术已经成为大数据分析领域的第一个环节。
对于这些公开数据的应用价值,我们可以使用KYC框架来理解,也就是Know Your Company(了解你的公司)、Know Your Competitor(了解你的竞争对手)、Know Your Customer(了解你的客户)。通过简单描述性分析,这些公开数据就可以带来很大的商业价值。进一步讲,通过深入的机器学习和数据挖掘,在营销领域可以帮助企业做好4P(Product:产品创新,Place:智能选址,Price:动态价格,Promotion:个性化营销活动);在金融领域,大数据征信、智能选股等应用会让公开数据带来越来越大的价值。

1.1.2 能从网络上爬取什么数据

简单来说,平时在浏览网站时,所有能见到的数据都可以通过爬虫程序保存下来。从社交媒体的每一条发帖到团购网站的价格及点评,再到招聘网站的招聘信息,这些数据都可以存储下来。

1.1.3 应不应该学爬虫

正在准备继续阅读本书的读者可能会问自己:我应不应该学爬虫?
这也是我之前问自己的一个问题,作为一个本科是商学院的学生,面对着技术创新驱动变革的潮流,我还是自学了Python的网络爬虫技术,从此踏入了编程的世界。对于编程小白而言,入门网络爬虫并没有想象中那么困难,困难的是你有没有踏出第一步。
我认为,对于任何一个与互联网有关的从业人员,无论是非技术的产品、运营或营销人员,还是前端、后端的程序员,都应该学习网络爬虫技术。
一方面,网络爬虫简单易学、门槛很低。没有任何编程基础的人在认真看完本书的爬虫基础内容后,都能够自己完成简单的网络爬虫任务,从网站上自动获取需要的数据。
另一方面,网络爬虫不仅能使你学会一项新的技术,还能让你在工作的时候节省大量的时间。如果你对网络爬虫的世界有兴趣,就算你不懂编程也不要担心,本书将会深入浅出地为你讲解网络爬虫。

1.2 网络爬虫是否合法

网络爬虫合法吗?
网络爬虫领域目前还属于早期的拓荒阶段,虽然互联网世界已经通过自身的协议建立起一定的道德规范(Robots协议),但法律部分还在建立和完善中。从目前的情况来看,如果抓取的数据属于个人使用或科研范畴,基本不存在问题;而如果数据属于商业盈利范畴,就要就事而论,有可能属于违法行为,也有可能不违法。

1.2.1 Robots协议

Robots协议(爬虫协议)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守这项协议。
下面以淘宝网的robots.txt为例进行介绍。
这里仅截取部分代码,查看完整代码可以访问https://www.taobao.com/robots.txt

image.png

在上面的robots文件中,淘宝网对用户代理为百度爬虫引擎进行了规定。
以Allow项的值开头的URL是允许robot访问的。例如,Allow:/article允许百度爬虫引擎访问/article.htm、/article/12345.com等。
以Disallow项为开头的链接是不允许百度爬虫引擎访问的。例如,Disallow:/product/不允许百度爬虫引擎访问/product/12345.com等。
最后一行,Disallow:/禁止百度爬虫访问除了Allow规定页面外的其他所有页面。
因此,当你在百度搜索“淘宝”的时候,搜索结果下方的小字会出现:“由于该网站的robots.txt文件存在限制指令(限制搜索引擎抓取),系统无法提供该页面的内容描述”,如图1-1所示。百度作为一个搜索引擎,良好地遵守了淘宝网的robot.txt协议,所以你是不能从百度上搜索到淘宝内部的产品信息的。

image.png

淘宝的Robots协议对谷歌爬虫的待遇则不一样,和百度爬虫不同的是,它允许谷歌爬虫爬取产品的页面Allow:/product。因此,当你在谷歌搜索“淘宝 iphone7”的时候,可以搜索到淘宝中的产品,如图1-2所示。

image.png

当你爬取网站数据时,无论是否仅供个人使用,都应该遵守Robots协议。

1.2.2 网络爬虫的约束

除了上述Robots协议之外,我们使用网络爬虫的时候还要对自己进行约束:过于快速或者频密的网络爬虫都会对服务器产生巨大的压力,网站可能封锁你的IP,甚至采取进一步的法律行动。因此,你需要约束自己的网络爬虫行为,将请求的速度限定在一个合理的范围之内。

image.png

实际上,由于网络爬虫获取的数据带来了巨大的价值,网络爬虫逐渐演变成一场网站方与爬虫方的战争,你的矛长一寸,我的盾便厚一寸。在携程技术微分享上,携程酒店研发部研发经理崔广宇分享过一个“三月爬虫”的故事,也就是每年的三月份会迎来一个爬虫高峰期。因为有大量的大学生五月份交论文,在写论文的时候会选择爬取数据,也就是三月份爬取数据,四月份分析数据,五月份交论文。
因此,各大互联网巨头也已经开始调集资源来限制爬虫,保护用户的流量和减少有价值数据的流失。
2007年,爱帮网利用垂直搜索技术获取了大众点评网上的商户简介和消费者点评,并且直接大量使用。大众点评网多次要求爱帮网停止使用这些内容,而爱帮网以自己是使用垂直搜索获得的数据为由,拒绝停止抓取大众点评网上的内容,并且质疑大众点评网对这些内容所享有的著作权。为此,双方开打了两场官司。2011年1月,北京海淀法院做出判决:爱帮网侵犯大众点评网著作权成立,应当停止侵权并赔偿大众点评网经济损失和诉讼必要支出。
2013年10月,百度诉360违反Robots协议。百度方面认为,360违反了Robots协议,擅自抓取、复制百度网站内容并生成快照向用户提供。2014年8月7日,北京市第一中级人民法院做出一审判决,法院认为被告奇虎360的行为违反了《反不正当竞争法》相关规定,应赔偿原告百度公司70万元。
虽然说大众点评上的点评数据、百度知道的问答由用户创建而非企业,但是搭建平台需要投入运营、技术和人力成本,所以平台拥有对数据的所有权、使用权和分发权。
以上两起败诉告诉我们,在爬取网站的时候需要限制自己的爬虫,遵守Robots协议和约束网络爬虫程序的速度;在使用数据的时候必须遵守网站的知识产权。如果违反了这些规定,很可能会吃官司,并且败诉的概率相当高。

1.3 网络爬虫的基本议题

对于网络爬虫技术的学习,其他教学很少有从整体结构来说的,多数是直接放出某部分代码。这样的方法会使初学者摸不着头脑:就好像是盲人摸象,有人摸到的是象腿,以为是一根大柱子;有人摸到的是大象耳朵,以为是一把大蒲扇等。因此,在开始第一个爬虫之前,本书先从宏观角度出发说清楚两个问题:

  • Python爬虫的流程是怎样的?
  • 三个流程的技术实现是什么?

值得说明的是,本书选择了Python 3作为开发语言,现在Python最新版为Python 3.7。熟悉Python 2的读者可以在本书代码的基础上稍加改动,用Python 2运行。值得注意的是,Python 2即将在2020年1月1日停止支持,因此建议初学者直接安装Python 3进行学习。
由于本书的潜在读者多数使用Windows操作系统,因此本书大部分实例都是基于Windows编写和运行的。如果使用的是Linux和Mac OS操作系统,在搭建好Python平台之后也可以直接运行本书中的代码。

1.3.1 Python爬虫的流程

网络爬虫的流程其实非常简单,主要可以分为三部分:(1)获取网页;(2)解析网页(提取数据);(3)存储数据。

image.png

(1)获取网页就是给一个网址发送请求,该网址会返回整个网页的数据。类似于在浏览器中键入网址并按回车键,然后可以看到网站的整个页面。
(2)解析网页就是从整个网页的数据中提取想要的数据。类似于你在页面中想找到产品的价格,价格就是你要提取的数据。
(3)存储数据也很容易理解,就是把数据存储下来。我们可以存储在csv中,也可以存储在数据库中。

1.3.2 三个流程的技术实现

下面列出三个流程的技术实现,括号里是对应的章节。
1. 获取网页
获取网页的基础技术:requests、urllib和selenium(3&4)。
获取网页的进阶技术:多进程多线程抓取(8)、登录抓取(12)、突破IP封禁(9)和使用服务器抓取(12)。
2. 解析网页
解析网页的基础技术:re正则表达式、BeautifulSoup和lxml(5)。
解析网页的进阶技术:解决中文乱码(10)。
3. 存储数据
存储数据的基础技术:存入txt文件和存入csv文件(6)。
存储数据的进阶技术:存入MySQL数据库和MongoDB数据库(6)。
除此之外,第7章介绍Scrapy爬虫框架,第13章也会介绍分布式爬虫。
本书的使用方法:第1章到第7章是网络爬虫的基础,建议大家按顺序读;第8章到第13章是进阶部分,大家可以选择自己感兴趣的内容跳跃阅读。之后可以阅读第14章到第17章,通过项目实践消化和吸收Python爬虫的知识。
如果对于上述技术不熟悉的读者也不必担心,本书将会对其中的技术进行讲解,力求做到深入浅出。