悉数那些被征服过的网页们

自己写爬虫也写了好久了,从一个宛若白纸的萌新,到今天能给别人帮助一二的萌旧,时光荏苒,两春一秋。我曾经有多次觉得,在这个世界上,没有我爬不下来的网页了!然而世界他总喜欢不停地无情的打脸。今日在此,献丑二三,悉数过往爬取过的网页类型,抛砖引玉,温故知新。

前言

互联网的产生,拉近了世界上每一个地方的距离,同时也带来了爆炸性增长的信息。bbs、门户网站,让信息何以被更加高效的获取与传播;微信、微信公众号等一些新型媒体的兴起,让信息的浪潮更加波涛汹涌。各式各样的信息中隐藏着巨大的价值。然而即使在今天,人们仍然满足与简单的使用浏览器来访问互联网,点击一个网站,并消费掉在那里发现的任何信息或服务。

网络爬虫,又叫网络机器人、网页蜘蛛。有了网络机器人,互联网的焦点能从“网站能提供什么”转向为“人们想要什么”。这也是现在今日头条等一些公司在正在实现的一些功能,从人们日常生活中收集到的数据分析,替他们考虑,得到“究竟想要什么”、“喜欢什么”、“不喜欢什么”。这听起来有点可笑,我们竟然需要其他人想尽办法去思考我们自己想要的东西,不过事实就是如此。同时,网络机器人还可以把网络上的一切手动工作自动化,并将你所关注的事情通知给你。

被征服的网页们

最简单的

最简单的莫过于直接通过url(Uniform Resource Locator,统一资源定位符)就可以得到源文件的网页。顾名思义,统一资源定位符,就是全世界约定的一个格式,来代表某个资源在网络上的地址。而通过这个地址,我们就可以访问某个资源。通俗的说,就像你通过“D:\software\a_software”来查看你电脑中的一个资源(比如这里是一个软件)一样,通过url,我们就可以访问到世界上任何一个你有权限访问的资源,比如网页、图片、视频、音频等等。举个例子,通过访问这个url,我们可以获取markdown的语法说明。

也是直接通过url访问却复杂一丢丢的

比上面说的“最简单的”稍微复杂一丢丢的网页url,这是新浪的一篇新闻报道,在浏览器的开发者工具(快捷键f12,chrome)找到Networt标签页并打开,然后在地址栏贴入该url转入对应页面,在开发者工具的Name列表中找到相应的url,单击打开右侧栏目,再单击打开Headers标签页,在该标签页下有找到 “Query String Parameters”,这时就可以看到url中相应的参数。现在我们回顾一下这类网页的url格式,“http://域名?参数名称=参数值”,其实就是问号(?)分隔了前面的网页地址和后面的参数,后面的参数是发给服务器的,通俗的讲,就是在这个网页的幕后,有一台计算机在接收你的指令,然后根据你的指令返回不同的网页供你浏览。这种传递参数的方式叫做GET,是一种常用的HTTP请求方法。这种方法很简单明了,该优点也是缺点,因此只能用此方法传输一些无关紧要的参数,若需要不改变url,同时向服务器提交一些数据,就需要用到下面要介绍的HTTP请求方法——POST。

藏起来的参数——POST方法

使用该技术的网页,就不能直接通过url来访问。如果你不知道这种手段的话,就会遇到这种情况:“xxx同学,给你看一个特别有意思的网页”,(把网址发过去),“什么特别的都没有呀”,然后你小跑到xxx同学的电脑前发现你们看的竟然不是同一个页面。此时,你就应该想到这种技术——POST。另外,许多表单也使用POST方法来传递数据,包括现在几乎所有的登陆系统。同时,结合ajax技术,可以动态的改变网页,对浏览者来说,仿佛都在一个页面上浏览似的,之后我们会对ajax单独讨论。同样的,利用chrome的开发者工具我们可以查看向服务器传递的POST数据。

cookie也可以来记录一些信息

当你既传递了GET参数,也把POST参数写入你的爬虫之中以后,仍然不能得到你所需要的页面的时候,很可能cookie在作怪。cookie是由Web服务器保存在用户本地的小文本文件,它用来标识一些和用户相关的信息。上面我们说到了在chrome中查看传递参数的方法,利用该方法,我们也可以在Response Header中找到对应的cookie。此时,在你的爬虫中加入cookie并保持或者更新新的cookie,也许你就能如愿得到你所需要的网页了。

payload传递数据的网页

之前所说的方法技术,已经涵盖了大部分网页。学会上面的方法之后,许许多多网页就可以爬取下来了。你的爬虫生涯会一帆风顺,直到遇到payload类型的网页。我们也可以看一下payload的维基百科 “payload的维基百科”)以及知乎-http中的payload怎么理解?。好吧,这里我承认我有点话少,因为我也就遇到过那么一两次。其实payload是一个底层的技术,当你爬取采用flash技术的网页时候,它的数据传递也是使用的payload。

使用flash展示网页

很少有网页完全是通过flash来完成的,虽然flash的展示效果非常的好,但是加载速度确是非常让人不能忍受。我们来感受一下:海南省污染源环境信息公开发布系统,而且如果你没有用ie,貌似编码也是一个很大的问题。随着近些年HTML5的应用,flash的生存环境受到进一步的挤压。使用flash框架的网页,客户端服务端的通信(即,数据传输)一般采用的是AMF协议。你需要学会使用AMF协议,之后你就可以对这类网页进行爬取了。

再说AJAX的网页

html的静态加载减少了许多互动性,因此许多网页是动态生成的,这其中,就有使用ajax动态加载而生成的网页。爬取该网页的时候,你若直接通过url请求页面,得到的往往只是一个大的框架,里面空空如也,并没有你想看到的一些数据。这时,你可以通过浏览器的控制台(开发者工具中的Console)通过js来定位你想要的数据。当你在控制台中找到之后,就可以使用phantomjs来抓取我们想要的数据了。其实,phantomjs的本意并不是为了抓数据,而是用来进行网页自动化、网络监测、网页截屏、无界面测试等。特别提示,在phantomjs中可以直接运行网页上已经加载的js代码,借此,如果我们找到了存储我们所需数据的变量,我们就可以直接输出而无需再在页面上定位了。

一点点补充

这里提到的技术并不能单独归为一类,但实际中,如果你疏忽了的话,你也无法得到所要请求的网页。这个小技术就是html中的frame标签ifram标签。你所需要做的,就是找到这些标签里面的真正的url,然后去抓取。

结束语

俗话说的好,天外有天,页外有页。以上是我近两年来抓取工作中遇到的一些情况,情况也蛮多了,是时候立flag了:“感觉这个世界上没我抓不下来的网页了呢~”。不过,flag就是用来被打脸的,不是么?咩哈哈哈。