动态网页数据抓取

动态网页数据抓取

一、网页

1.传统网页:

如果需要更新内容,则需要重新加载网页。

2.动态网页:

使用AJAX则不需要加载更新整个网页,实现部分内容更新。

二、什么是AJAX?

AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。

理解:通过在后台与服务器进行少量数据交换【一般为post请求】,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

比如:百度图片采用的就是Ajax方式加载页面。

动态网页数据抓取

Ajax加载页面特点:通过交互产生的数据不会在网页源码中出现,这就表明了我们无法通过python发送请求直接获得这些新出现的数据,那么此时爬虫只能爬取没有通过Ajax交互所产生的数据。假设一个网页是由Ajax动态加载数据的,一共有十页,但是通过Python来获取的话,一般只能获取一页,后续的九页数据均无法直接获得。

Ajax加载页面原理:通过某个接口【可以理解为一个网址】与服务器产生数据交换,从而得到新的数据加载到当前页面上。

Ajax加载页面优势:

1.反爬虫 。对于一些初级爬虫工程师来说,不懂异步加载,总感觉代码全对,但是就是获取不到想要的数据,从而怀疑自己代码有问题,直至怀疑人生。

2.更加方便地回应用户数据,优化用户体验。一个页面经常有相同的内容,如果每次都重复加载一个页面,实际上完全相同的不同也是被重复加载的,浪费响应时间。

Ajax加载页面劣势:

破坏浏览器后退按钮的正常行为。比如一个网页一共有十页,通过动态加载后,十页全部在同一个页面加载出来,但是你想后退到第九页是不可能的事情,所以,浏览器的后退按钮对于这种情况就无效了。

三、爬虫怎么应对Ajax

1.找接口

既然Ajax是通过某个接口【特定网址】与服务器交互的,那么我们只要找到这个接口,再模拟浏览器发送请求就行了。

技术难点:

(1)接口可能有多个。一个网页可能有多个特定的接口进行数据交互,需要我们自己多次尝试寻找,增大了爬虫的难度。

(2)与服务器交互的数据加密,较难**。在与服务器产生交互式需要发送数据,但是这部分数据是网站开发人员设定的,浏览器发送了什么数据虽然大部分情况下我们能够找得到,但是数据经过了加密,**起来比较困难。

(3)需要爬虫工程师有较高的js功底。

2.使用selenium模拟浏览器行为

相当于使用代码操控浏览器行为,浏览器能够获得什么数据,我们就能够获得什么数据。

技术难点:

代码量大。

3.两种方式对比

方式 优点 缺点
分析接口 代码量少,性能很高。 有的网站接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
selenium 模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到,爬虫更稳定。 代码量多,性能低。

四、总结:

先分析接口,如果接口简单的话,那就使用接口来获取数据,如果接口复杂的话,那就使用selenium来模拟浏览器行为,获取数据。

万事万物皆有利有弊,一方面快捷方便,必然导致另一方面复杂,所以全凭自己权衡利弊或者成本。