python网络数据采集-Ajax和动态HTML

2017-10-23 18:57:53来源:CSDN作者:wanght89人点击

分享

第一部分:基本概念

       到目前为止,我们与网站服务器的唯一通讯方式,就是发出HTTP请求获取新页面。如果提交表单之后,或从服务器获取信息之后,网站的页面不需要重新刷新,那么你访问的网站就在使用Ajax技术。

       与一些人的印象不大一样,Ajax其实并不是一门语言,而是用来完成网络任务(可以认为它与网络数据采集差不多)的一系列技术。Ajax的全称为Asynchronous JavaScript and XML(异步JavaScript和XML),网站不需要使用单独的页面请求就可以与网络服务器进行交互(收发信息)。需要注意的是:你不应该说“这个网站时Ajax写的”。正确的说法应该是“这个表单用Ajax与网络服务器通信”。

       和Ajax一样,动态HTML(dynamic HTML,DHTML)也是一系列用于解决网络问题的技术集合。DHTML使用客户端语言改变页面的HTML元素(HTML,CSS,或者二者皆被改变)。比如,页面上的按钮只有当用户移动鼠标之后才会出现,背景色可能每次点击都会改变,或者用一个Ajax请求触发页面加载一段新内容。

       有时你还会发现,网页用一个加载页面把你引到另一个页面上,但是网页的URL链接在这个过程中一直没有变化。如果你采集过很多网站,很有可能遇到这样一种情况。你在浏览器上看到的内容,与你用爬虫从网站上采集的内容不一样。你可能会怀疑自己是不是哪个细节没处理好,希望找出内容采集不出来的原因。这些都是因为你的爬虫不能执行那些让页面产生各种神奇效果的JavaScript代码。如果网站的HTML页面没有运行JavaScript,就可能和你的浏览器里看到的样子完全不同,因为浏览器可以正确执行JavaScript。

       那些使用了Ajax或者DHTML技术改变/加载内容的页面,可能有一些采集手段,但是用Python解决了这个问题只有两种途径:直接从JavaScript代码里采集内容,或者用Python的第三方库运行JavaScript,直接采集你在浏览器里看到的内容

第二部分: 在Python中用Selenium执行JavaScript

       Selenium是一个强大的网络数据采集工具,其最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium可以让浏览器自动加载页面,获取需要的数据,设置页面截屏,或者判断网站上某些动作是否发生。  

       Selenium自己不带浏览器,它需要与第三方浏览器结合在一起使用。例如,如果在FireFox上运行Selenium,可以直接看到一个FireFox窗口被打开,进入网站,然后执行你代码中设置的动作。虽然这样可以看得很清楚,但是我更喜欢后台运行,所以我这边使用一个PhantomJS的工具替代真实的浏览器。

      PhantomJS是一个“无头”(headless)浏览器。它会把网站将在到内存并执行页面上的JavaScript,但是他不会向用户展示图形界面。把Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,可以处理cookie、JavaScript,header,以及任何你需要做的事情。

     你可以通过PyPI网站(https://pypi.python.org/simple/selenium)下载Selenium库,也可以用第三方管理器如pip直接安装。PhantomJS也可以从他的官网下载(http://phantomjs.org/download.html),因为PhantomJS是一个功能完善(虽然无头)的浏览器,并非一个python库,所以它不需要像Python的其他库一样安装,也不能用pip安装。

      虽然很多页面都用Ajax加载数据(尤其是Google),在http://pythonscraping.com/pages/javascript/ajaxDemo.html建了一个简单的页面来运行爬虫。这个页面有一些简单的文字,都是手工敲在HTML代码里的,打开页面两秒钟后,页面就会被替换成一个Ajax生成的内容。如果我们用传统的方法采集这个页面,只能获取加载前的界面,而我们真正需要的信息(Ajax执行后的页面)却抓不到。

      Selenium库是一个在WebDriver上调用的API。WebDriver有点像可以将在网站的浏览器,但是它也可以像BeautifulSoup对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。

     下面的代码可以获取前面测试页面上Ajax“墙”后面的内容:

     这段代码用PhantomJS库创建了一个新的Selenium WebDriver,首先用WebDriver加载页面,然后暂停执行三秒,再查看页面获取(希望已加载完成)的内容。

     依据你的PhantomJS安装位置,在创建新的PhantomJS WebDriver的时候,你需要在Selenium的WebDriver接入点指明PhantomJS可执行文件的路径:

driver=webdriver.PhantomJS(executable_path='/var/wht/PhantomJS/...')


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台