基于Python的动态页面爬取
在介绍动态爬虫之前,我们先简单的认识一下Ajax的基本原理。正是有了Ajax的动态请求机制,才使得传统的静态爬虫方式不起效果,这才需要进行动态爬虫。
Ajax基本概念和原理
Ajax的全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML,为什么称Ajax为一项异步的请求技术,如图所示:
Ajax工作原理
上图给出了Ajax的动态请求原理,其中用户(通常就是浏览器)发出的请求给Ajax引擎,再由Ajax引擎动态的向服务器发出请求,接收一些响应,反馈给浏览器。
常见的应用Ajax技术的web页面有下拉刷新(这里是指浏览器中的下拉刷新,不是普通APP中的下拉刷新)、含有大量列表信息的页面(比如电影网站)、含有文库的页面(比如百度文库等等)。
总结一点,利用了Ajax技术的页面都是动态页面,需要进行动态爬取页面信息。那么如何判断web页面是否为动态页面?又该如何爬取动态页面?下面我们一一介绍。
如何判断页面是动态页面?
如何判断页面是否为动态页面,主要有两种方式:
利用Toggle JavaScript插件利用Google Chrome浏览器,安装Toggle JavaScript插件(篇幅原因,本文不介绍插件如何下载安装,请自行查阅相关资料)安装完毕之后,会在浏览器的右上角有一个黄色图标:
Toggle JavaScript插件是一个可以关闭Chrome浏览器中javascript文件的插件。前面我们已经介绍,Ajax技术是动态的接收javascript等文件,当我们利用Toggle JavaScript插件关闭浏览器接收javascript文件的功能时,页面内容就不能完整的加载。举个例子,当我们打开豆瓣电影时,可以看到完整的内容:
而当我们利用Toggle JavaScript插件关闭浏览器接收javascript文件的功能时:
可以看出,很多内容加载不出来,因为这是一个动态的请求。
查看网页源代码第二种方式就是查看网页源代码,我们用鼠标在页面进行右击,有两个快捷键可选:
一个是“查看网页源代码”,一个是“检查”(在Chrome浏览器是这样,其他的浏览器可能换个名词),这两者是有区别的。
其中,查看源代码,是查看的接收到的最原始的html文件,是不经过任何处理的,而检查,看到的是浏览器处理过后的页面,也就是说,当存在动态请求时,Ajax引擎会对原始的html文件进行处理,形成最终的html文件。
所以对于动态页面,这两者文件是由区别的,还是以豆瓣电影的页面为例,“查看源代码”和“检查”得到的页面是不一样的,“检查”的页面就是显示在浏览器,我们直接看到的状态。而“查看源代码”是通过静态爬虫能够获取的页面。
如何利用Python爬取动态页面
利用Python对动态页面的爬取,有两种方式:
基于selenium+phantomjs+python的动态爬虫技术简单点将,这一技术就是仿照浏览器,既浏览器的Ajax请求机制,selenium+phantomjs说白了就是一个浏览器,只是没有界面,我们可以通过Python调用他。
所以,浏览器能够获得的内容,它当然能获取。它是将动态页面转变成了静态页面。详细内容请查阅相关资料。
基于逆向分析的动态爬虫技术这种爬虫技术就是通过对网页的逆向分析,总结js文件的规律,获取Ajax引擎访问的服务器地址,然后使用 Python 直接访问该链接,这时再利用静态爬虫的技术,对网页内容进行分析。
基于逆向分析的动态爬虫技术的一般步骤,我们以国家教育资源公共服务平台为例,页面中授课的教案是以文库的形式给出:
我们要爬取其中的教案。经过上面的方法分析,我们知道这是一个动态页面,以Chrome浏览器为例,对它进行分析,首先按F12键,进入源代码,分析其中的js和XHR文件:
通过对js文件的查找,找到了对应的js文件:
教案一共5页,对应5个js文件,以第一个js文件为例,访问的地址为:
所以问题转换为如何获取键值对:"doc_id" = "doc-jdd13bkamgsyrnn",下面再对XHR文件进行分析,得到:
在该文件中的能够得到相应的“doc_id”值,这样就可以利用该地址直接对服务器进行访问,得到想要的数据。