【Python3网络爬虫开发实战】6-Ajax数据爬取-1-什么是Ajax

有时候咱们在用requests抓取页面的时候,获得的结果可能和在浏览器中看到的不同:在浏览器中能够看到正常显示的页面数据,可是使用requests获得的结果并无。这是由于requests获取的都是原始的HTML文档,而浏览器中的页面则是通过JavaScript处理数据后生成的结果,这些数据的来源有多种,多是经过Ajax加载的,多是包含在HTML文档中的,也多是通过JavaScript和特定算法计算后生成的。html

对于第一种状况,数据加载是一种异步加载方式,原始的页面最初不会包含某些数据,原始页面加载完后,会再向服务器请求某个接口获取数据,而后数据才被处理从而呈现到网页上,这其实就是发送了一个Ajax请求。ajax

照Web发展的趋势来看,这种形式的页面愈来愈多。网页的原始HTML文档不会包含任何数据,数据都是经过Ajax统一加载后再呈现出来的,这样在Web开发上能够作到先后端分离,并且下降服务器直接渲染页面带来的压力。算法

因此若是遇到这样的页面,直接利用requests等库来抓取原始页面,是没法获取到有效数据的,这时须要分析网页后台向接口发送的Ajax请求,若是能够用requests来模拟Ajax请求,那么就能够成功抓取了。编程

因此,本章咱们的主要目的是了解什么是Ajax以及如何去分析和抓取Ajax请求。后端

Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面连接不改变的状况下与服务器交换数据并更新部分网页的技术。浏览器

对于传统的网页,若是想更新其内容,那么必需要刷新整个页面,但有了Ajax,即可以在页面不被所有刷新的状况下更新其内容。在这个过程当中,页面其实是在后台与服务器进行了数据交互,获取到数据以后,再利用JavaScript改变网页,这样网页内容就会更新了。bash

能够到W3School上体验几个示例来感觉一下:www.w3school.com.cn/ajax/ajax_x…服务器

1. 实例引入

浏览网页的时候,咱们会发现不少网页都有下滑查看更多的选项。好比,拿微博来讲,咱们以个人我的的主页为例:m.weibo.cn/u/283067847…,切换到微博页面,一直下滑,能够发现下滑几个微博以后,再向下就没有了,转而会出现一个加载的动画,不一下子下方就继续出现了新的微博内容,这个过程其实就是Ajax加载的过程,如图6-1所示。微信

图6-1 页面加载过程网络

咱们注意到页面其实并无整个刷新,也就意味着页面的连接没有变化,可是网页中却多了新内容,也就是后面刷出来的新微博。这就是经过Ajax获取新数据并呈现的过程。

2. 基本原理

初步了解了Ajax以后,咱们再来详细了解它的基本原理。发送Ajax请求到网页更新的这个过程能够简单分为如下3步:

(1) 发送请求; (2) 解析内容; (3) 渲染网页。

下面咱们分别来详细介绍这几个过程。

发送请求

咱们知道JavaScript能够实现页面的各类交互功能,Ajax也不例外,它也是由JavaScript实现的,实际上执行了以下代码:

1234567891011121314var xmlhttp;if (window.XMLHttpRequest) {    // code for IE7+, Firefox, Chrome, Opera, Safari    xmlhttp=new XMLHttpRequest();} else {// code for IE6, IE5    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange=function() {    if (xmlhttp.readyState==4 && xmlhttp.status==200) {        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;    }}xmlhttp.open("POST","/ajax/",true);xmlhttp.send();复制代码

这是JavaScript对Ajax最底层的实现,实际上就是新建了XMLHttpRequest对象,而后调用onreadystatechange属性设置了监听,而后调用open()send()方法向某个连接(也就是服务器)发送了请求。前面用Python实现请求发送以后,能够获得响应结果,但这里请求的发送变成JavaScript来完成.因为设置了监听,因此当服务器返回响应时,onreadystatechange对应的方法便会被触发,而后在这个方法里面解析响应内容便可。

解析内容

获得响应以后,onreadystatechange属性对应的方法便会被触发,此时利用xmlhttpresponseText属性即可取到响应内容。这相似于Python中利用requests向服务器发起请求,而后获得响应的过程。那么返回内容多是HTML,多是JSON,接下来只须要在方法中用JavaScript进一步处理便可。好比,若是是JSON的话,能够进行解析和转化。

渲染网页

JavaScript有改变网页内容的能力,解析完响应内容以后,就能够调用JavaScript来针对解析完的内容对网页进行下一步处理了。好比,经过document.getElementById().innerHTML这样的操做,即可以对某个元素内的源代码进行更改,这样网页显示的内容就改变了,这样的操做也被称做DOM操做,即对Document网页文档进行操做,如更改、删除等。

上例中,document.getElementById("myDiv").innerHTML=xmlhttp.responseText便将IDmyDiv的节点内部的HTML代码更改成服务器返回的内容,这样myDiv元素内部便会呈现出服务器返回的新数据,网页的部份内容看上去就更新了。

咱们观察到,这3个步骤其实都是由JavaScript完成的,它完成了整个请求、解析和渲染的过程。

再回想微博的下拉刷新,这其实就是JavaScript向服务器发送了一个Ajax请求,而后获取新的微博数据,将其解析,并将其渲染在网页中。

所以,咱们知道,真实的数据其实都是一次次Ajax请求获得的,若是想要抓取这些数据,须要知道这些请求究竟是怎么发送的,发往哪里,发了哪些参数。若是咱们知道了这些,不就能够用Python模拟这个发送操做,获取到其中的结果了吗?

在下一节中,咱们就来了解下到哪里能够看到这些后台Ajax操做,去了解它究竟是怎么发送的,发送了什么参数。


本资源首发于崔庆才的我的博客静觅: Python3网络爬虫开发实战教程 | 静觅

如想了解更多爬虫资讯,请关注个人我的微信公众号:进击的Coder

weixin.qq.com/r/5zsjOyvEZ… (二维码自动识别)

相关文章
相关标签/搜索