事情的时候,想要查找“产品设计”,可以直接在搜索引擎上输入内容,就可以直接找到数以百万计的资料。
高下班路上,刷新闻类APP的时候,只要乐意,就会有源源不断的新的信息,足够刷一起的韶光。

搜索引擎和(大多数)新闻类APP都不自己生产内容(虽然有些平台孵化了自己的内容,但也只占全体平台内容的很少的一部分,更主要的是,本钱非常高)。
那么,他们的大量的内容从哪里来?
“我们不生产内容,只是内容的搬运工”,将互联网上的内容“搬运”到自己的做事器上,这便是爬虫。
首先,我们须要理解一下互联网的构造。
互联网上的内容数以亿计,虽然很繁芜,但说白了便是一张大网,网上的每个节点便是一个网页,连接网页的超链接(Hyperlinks)相称于线,线把所有的节点连接在一起,形成了一个繁芜的网。
通过点击超链接的笔墨或者图片,就可以跳转到对应的网页。爬虫可以自动访问到每一个网页,并把网页的内容保存下来。
天下上第一个网络爬虫由麻省理工学院的学生马修·格雷(Matthew Gray)在1993年写成,之后的爬虫只管越来越繁芜。
比如:可以实现更快的访问速率、访问更多的网页、更好的将网站内容解析出来。但爬虫的基本事理是一样的,都紧张包括三个部分:访问网页链接,下载网页内容,解析网页内容。
爬虫的事情过程与我们查找网页的过程是一样的。
比如,我们想要查一下豆瓣上最新的电影:首先,在浏览器地址栏输入网址链接https://movie.douban.com/,之后,浏览器会跳转到豆瓣电影。末了,我们就可以找到当前热映的电影。
同样的,一个最大略的爬虫三步就可以爬取一个网页——首先,访问这个网页,之后,把网页内容下载下来,末了,对下载的内容进行解析。
二、7行代码爬取豆瓣电影
最大略的爬虫三步就可以爬取一个网页,那么要写多少行代码呢?
我们写一个爬虫,爬取豆瓣的“一周口碑榜”,只要7行代码!
这里我们利用Python措辞,至于为什么选择Python措辞,会在后面交代清楚,如果不懂Python也没有关系,理解爬虫是如何事情的就可以了。
代码如下:
import requests from lxml
import html url=’https://movie.douban.com/’ # 1、须要爬数据的网址
page=requests.Session.get(url) # 2、访问网页
tree=html.fromstring(page.text) # 3、解析网页的过程
result=tree.xpath(‘//td[@class=”title”]//a/text’) #3、解析网页的过程
print(result) # 打印出结果
在Python环境中运行这几行代码,就可以获取“一周口碑榜”了,结果如下:
[‘迦百农’, ‘绿皮书’, ‘驯龙高手3’, ‘速成家庭’, ‘阿丽塔:战斗天使’, ‘肤色’, ‘去世亡天使’, ‘黎明墙’, ‘小小巨人’, ‘出·路’]
个中最关键的是解析网页内容,紧张是(‘//td[@class=”title”]//a/text’)这行代码,大多数人可能比拟较困惑。
这涉及到HTML网页的构造,可以把网页理解成一个文件夹,打开一个文件夹,会创造子文件夹,子文件夹或许还有文件夹。通过打开一个个文件夹,终极找到须要的数据。
//td :这个相称于大目录;[@class=”title”]:这个相称于小目录; //a :这个相称于最小的目录;/text:这个是提取个中的笔墨内容。至于是怎么写出来这行代码的,可以通过在网页空缺处点击右键,查看源代码,就可以找到对应的td、class=”title”、a等标识符。
大多数程序员写爬虫选择python的情由很大略.
首先,python有很多的库,可以直接调用,比如:上面的代码就引入了requests、lxml库,分别实现访问网页、对网页构造解析。有开源的库,就直接调用,避免重复造轮子。
其次,python写起来很方便,配置也大略,短短几行的代码,就可以直接运行了,如果利用C或者Java,可能配置环境就要老半天。
三、一个简答的爬虫系统
把上面的每个步骤分别实现(模块化),就可以构成一个简答的爬虫系统。
利用URL(可以理解为网址链接)管理器管理所有的网址链接,利用HTML(可以理解为网页内容)下载器下载网页内容,利用HTML解析器对下载的内容解析,再加上数据存储模块、掌握全体爬虫的调度模块,就构成了一个大略的爬虫系统。
爬虫基本架构
更详细的说,URL管理器卖力管理所有的网址链接,记录下哪些URL已经爬取了,哪些还没有爬取。如果爬取过了,就要避免再次下载,如果没有,就要加入行列步队,等HTML下载器下载。
HTML下载器可以从做事器下载全体网页的内容,从URL管理器中获取未爬取的网址链接,之后,访问这些网页链接,下载网页。
HTML解析器卖力解析下载好的网页,紧张有两个任务:一方面,解析出须要的信息,比如上文的“一周口碑榜”;另一方面,解析出新的URL链接,交给URL管理器,连续下载,这个功能在上面的“7行代码”没有实现。
数据存储器实现存储数据的功能,将HTML解析器解析出来的信息存储起来,否则每次利用都要下载,会摧残浪费蹂躏大量的韶光。图片、文档之类的文件可以直接保存到做事器上,笔墨类的可以通过数据库存储起来。
爬虫调度器作为系统的大脑,卖力统筹其他四个模块的折衷事情。
无论是大型的还是小型的爬虫虽然在设计细节,性能上有所不同,但都不会分开这五个模块。
四、更深入的考虑
乍一看,每个模块实现起来都很大略,但细想,彷佛每个模块都要考虑很多东西。
1. 初始的网址链接如何得到
7行代码爬取豆瓣电影,直接访问网址链接(https://movie.douban.com/)就可以爬取“一周口碑榜”。对稍大一些的爬虫系统或者商用爬虫,就要有更多的考虑了,在担保获取充足信息的同时,也要担保下载的质量。
对搜索引擎公司而言,要尽可能包括互联网所有的信息。对垂直领域,更多的倾向业务类信息,比如:对新闻类的APP,紧张包括一些新闻网站、政府网站等,对Github这类的编程网站,他们可能就不感兴趣。
巧妇难为无米之炊,初始的网址链接基本要靠人工凭履历获取,比如:新闻类的APP,他们的初始URL列表里可能就包括新浪、网易、搜狐等门户网站,也包括各个级别的政府网站,还有公民网、新华社、公民日报等媒体的网站。
2. 如何确定哪些网页已经下载过了
当一个页面下载完成后,从这个网页中提取出个中的网址链接,把它们添加到等待下载的行列步队中,就可以得到更多的网址链接。
如果一个网页已经下载过了,重新下载,会花费大量的韶光,并占用存储空间。更要命的是,如果一贯重复下载,就可能陷入去世循环。
那么,如何知道这网址链接是不是已经下载过了?
对付小型爬虫,可以利用列表存储下载过的网址链接,当有新的网址链接的时候,先查找这个列表中有没有该网址链接。如果有的话,就不用插入,如果没有的话,就插入列表,等待访问下载。
对付大型爬虫,有成百上千个“小爬虫”(更加专业的名词叫做分布式爬虫),分布在不同的做事器上,同时爬取网址链接,就要考虑更多的东西。
比如:不同爬虫之间的分工和通信,如何共同掩护上述的列表。
当数据很大的时候,就要考虑分布式、通信、存储、带宽等每个环节的限定,无论哪个环节没有做好,都有可能成为系统的瓶颈,这就像是木桶效应中的短板。
数据量增加10倍,之前的代码可能要重写了,事情量可能就要增加100倍,这也是量变引起质量的一个很好的例子。
在打算机领域,这样的例子随处可见,当数据增大到一定量级,原有的算法很可能无法连续利用,须要重新开拓,随之而来的是加班、DEBUG以及延期上线。
3. 页面的解析
爬取豆瓣电影的“一周口碑榜”,须要研究网页的源代码,并编写对应的解析代码。但是网页的构造不同,用这个代码爬取知乎,解析不到任何内容。
以新闻类的APP为例:一个好的新闻类APP须要爬虫数以亿计的网页,并把里面的笔墨、视频、图片分别解析出来,难度可想而知。
好是一部分网站会遵守RSS规范(遵守RSS规范的网页构造和代码都有相似性,以便于订阅器获取紧张信息),一种类型的爬虫就可以爬取大量这种类似的网页。但大部分的网站的构造,都是不同的,这须要算法工程师花费大量的韶光和精力做解析事情。
五、 反爬虫
新闻类APP通过爬虫,得到大量的优质资源,读者也乐意在一个平台上看到所有的内容,但“被爬取”的网站就不太高兴了。对付大多数依赖广告收入的网站,没有了流量,连生存都成了问题,更别说盈利了。
一些自成体系的平台,比如:大型电商平台,他们希望所有的用户在自己的平台上查找信息,所有的商家在自己的平台上吸引卖家(广告费可不能付给搜索引擎),同样不肯望爬虫的骚扰。
搜索引擎希望爬取更多的信息,优质的内容供应商又不肯望被爬虫骚扰,利益冲突难以调和,于是产生了Robots协议来办理这个问题。
Robots协议网站做事器的一个声明,常日是保存在网站根目录下的一个TXT格式的文件,网站通过Robots协议见告搜索引擎:哪些页面可以抓取?哪些页面不能抓取?
当爬虫访问一个站点时,它会首先检讨该站点根目录下是否存在robots.txt,如果存在,爬虫就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的爬虫将能够访问网站上所有没有被口令保护的页面。
我们利用搜索引擎,常常会看到“由于该网站的robots.txt文件存在限定指令(限定搜索引擎抓取),系统无法供应该页面的内容描述”,便是源于这个协议。
值得把稳的是:Robots协议是国际互联网界通畅的道德规范,并没有逼迫性约束力。
一些“没有道德”的爬虫同样会爬取有robots.txt限定指令的网站,这时候就须要一些技能来实现反爬虫了。
最常见的有三种办法:
1. 网站会根据IP地址访问的频率确定是不是爬虫
每个电脑都有唯一的IP地址,每个爬虫也有唯一的IP地址,当电脑或者爬虫访问网站的时候,网站会记录这个IP地址。如果同一个IP短韶光多次访问同一个网站,这个网站可能会方向于认为这是个爬虫,会采纳一些方法。
当然,这在反爬虫的同时,也会给用户带来一些不好的体验。
比较之下,一些比较精良的网站或者APP,会根据用户点击频率、韶光间隔等信息,判断是不是爬虫或者误点击,之后再确定是否须要验证。
更好的用户体验背后,是更大的开拓本钱,更长的开拓周期。
2. 网站也可以根据用户要求的Headers来判断是不是爬虫
当我们利用浏览器访问网站的时候,浏览器会自动在访问要求上添加一些信息,比如:浏览器采取的编码办法、利用的操作系统、浏览器版本等信息放在访问要求的最开始,作为Headers,但爬虫一样平常不会附加这些信息。
网站会根据是否存在Headers信息以及Headers信息的内容,判断对方是不是爬虫,有必要的话,就谢绝访问。
3. 动态页面的反爬虫
之前将的HTML网页都是静态的,随着HTML代码天生,页面的内容和显示效果就不会发生变革了。而动态网页则不然,动态网站是脚本措辞(比如PHP)天生的,一些内容不是直接可见的,而是要运行一些脚本,才能看到。
网址后缀为htm、html、shtml、xml的网页是静态网页,而动态网页因此·aspx、.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且在动态网页网址中有一个标志性的符号“?”,这些不同的后缀基本代表了网页利用的措辞。
访问静态网页,只须要直接访问链接就可以了,访问动态网站,还须要实行一些特定的操作(比如点击),才能显示更多的内容,这就增加了爬取的难度,一些大略的爬虫就被拒之门外了。
先容完三种主流的反爬虫的办法,末了要说的是:反爬虫技能也不是一劳永逸的,在反爬虫的发展过程中,爬虫也进化出了一系列反“反爬虫”的办法。
针对反爬虫验证IP机制,爬虫“进化”出了IP代理池,这样,爬虫就可以不断变换自己的IP地址,迷惑反爬虫。针对Headers验证,爬虫也会天生一个Headers信息,乃至针对动态页面,也会仿照浏览器的行为。
虽然如此,反爬虫在一定程度长进步了爬虫的本钱,降落了爬虫的效率,就可以将一大部分爬虫挡在门外。
从爬虫与反爬虫的例子也可以看出:大多数时候,没有绝对的有效办法。提高对方的本钱,让对方以为代价太大,得不偿失落,便是很好的办理问题的办法。
六、爬虫实现冷启动——胜利即正义?
上面讲了爬虫是怎么运行的,常见的反爬虫机制。末了,我们再讲一个爬虫的运用处景的例子,可以帮助我们更好理解爬虫。
冷启动是每一个产品经理、运营职员和创业者面临的重大问题。没有优质的内容,就吸引不了用户,没有大量的用户,就无法吸引优质的内容,就陷入了先有鸡还是先有蛋的悖论。
爬虫,低本钱、快速地办理了这个问题!
“我们不生产新闻,我们只是新闻的搬运工”,通过爬虫,低本钱、快速地爬取全体互联网的优质内容,并凭借海量数据,利用算法实现内容分类和个性推举(个性推举系统会在后序章节详细先容),吸引大量的用户,终极通过广告变现。
事实证明,这是个非常成功的商业模式。而媒体平台和新闻网站雇佣大量编辑职员,花费大量韶光、金钱写成的高质量内容,连说一声都没有,就这样被拿走了,这不是陵犯人家版权嘛!
于是,多家媒体联合发起侵权诉讼或抗议声讨,终极迫使这家新闻巨子支付版权费,但无论法律上、道德上有多少问题,都不影响这家公司商业成功的既定事实。
类似的事情同样发生在其他垂直领域。
一家新成立的技能博客平台,爬取竞争对手上的文章,迅速实现优质内容的聚合。如果原博客主创造了自己的文章被盗用了,新的平台就移交账号并看情形给予少许补偿。如果对方不肯意,就注销账号,当统统都没有发生过。凭借这种运营办法,顺利实现了冷启动。
短视频APP的后来者,也可以通过类似的办法,实现用户的积累和优质内容的聚合。
胜利即正义?
这彷佛是过于武断的一个评价。
上述的视频APP做得太过分,引起众怒,终极不得不关闭自己的平台。
对付通过爬虫获取内容的平台而言,内容的获取也只是万里长征的第一步,通过运营手段减小生产内容的本钱,通过利益共享勉励优质内容的产生,通过技能减小信息本钱吸引用户,更加任重而道远。
而版权,也始终是悬于头顶的达摩克利斯之剑。
本文由@linghu 原创发布于大家都是产品经理,未经容许,禁止转载
题图来自Unsplash, 基于CC0协议