对于第一种来源,数据加载是一种异步加载的方式,原始页面最初不会包含某些数据,当原始页面加载完成之后,会再向服务器请求某个接口获取新的数据,然后数据才会经过处理从而呈现在网页上,这其实是发送了一个Ajax请求实现的。
按照web的发展趋势来看,这种形式的页面越来越多。甚至网页的原始HTML文档不包含任何数据,数据都是通过公Ajax统一加载后呈现出来的, 这样使得web开发可以做到前后端分离,减少服务器直接渲染页面带来的压力。
所以如果遇到这种网站,直接利用requests等模块来抓取原始的HTML文档,是无法获取有效数据的,这个时候需要分析网页后台向api接口发送的Ajax请求。如果可以用requests模拟Ajax请求,就可以成功的抓取到页面数据了。
所以,本节课只要目的就是了解什么是Ajax请求,以及如何分析爬取Ajax请求。
Ajax,全程Asynchronous JavaScript and XML,既异步的JavaScript和XML。他不是一门编程语言,而是利用JavaScript在保证页面不被刷新,页面链接不被改变的情况下与服务器交换数据并更新部分网页内容的技术。
对于传统的网页,如果想要更新其内容,就必须要刷新整个页面,但是有了Ajax,可以在页面不被全部刷新的情况下更新。这个过程实际上是页面在后台与服务器进行了数据交互,获取数据之后,再利用JavaScript改变网页,这样网页内容就会更新了。
初步了解了Ajax之后,接下里详细了解它的基本原理。从发送Ajax请求到网页更新的这个过程可以简单分为以下3步--发送请求,解析内容,渲染网页
我们知道JavaScript可以实现页面的各种交互功能,Ajax也不例外,它也是由JavaScript实现的。通过Ajax发送网络请求之后,服务器会返回响应,Ajax接收到服务器的响应之后再通过JavaScript解析响应将请求得到的新数据渲染在网页上。
服务器返回响应之后,对应的回调方法就会被触发,此时利用JavaScript就能获取具体的数据。这类似于Python中利用requests向服务器发送请求,然后得到响应的过程。返回内容坑呢是HTML,也可能是JSON数据,接下来只需要在方法中用JavaScript进一步处理即可。如果是JSON的话,可以进行解析和转换。
JavaScript有改变网页内容的能力,因此解析完响应内容之后,就可以调用JavaScript来基于解析完的内容对网页进行下一步处理了。例如,通过document.getElementByid().innerHTML
操作,可以更改某个元素内的源代码,这样网页显示的内容就改变了。这种操作也被成为DOM操作,既对网页文档内容进行操作,如修改,删除等。
网页更新的3个步骤及其都是由JavaScript完成的,他完成了整个却请求,解析和渲染的过程。
当网页刷新的时候,其实就是JavaScript向服务器发送了一个Ajax请求,然后获取新的数据,对其进行解析,并渲染在网页中。
因此我们知道,真实的网页数据其实是一次向服务器发送Ajax请求得到的,想要抓取这些数据,需要知道Ajax请求到底是怎么发送的,发往哪里,发了哪些参数。我们知道这些之后,就可以利用Python模拟发送操作,并获取返回数据了。