js 爬虫抓取网页数据(一下什么是Ajax全称为andXML,Ajax请求是什么)
优采云 发布时间: 2022-04-01 17:09js 爬虫抓取网页数据(一下什么是Ajax全称为andXML,Ajax请求是什么)
文章目录
有时候,当我们使用requests爬取一个页面时,得到的结果可能与我们在浏览器中看到的不同:在浏览器中我们可以看到页面数据正常显示,但是使用requests得到的结果却不是。这是因为请求获取的是原创的 HTML 文档,而浏览器中的页面是通过 JavaScript 处理数据的结果。这些数据有多种来源,可以通过 Ajax 加载或收录在 HTML 中。在文档中,也可能是通过 JavaScript 和特定算法计算后生成的。
对于第一种情况,数据加载是一种异步加载方式。最初的页面不会收录一些数据。原创页面加载完成后,会向服务器请求一个接口获取数据,然后对数据进行处理和渲染。对网页来说,这实际上是发送一个 Ajax 请求。
根据Web发展的趋势,这种形式的页面越来越多。网页原创HTML文档不收录任何数据,通过Ajax统一加载后呈现数据,让Web开发者可以将前后端分离,直接减少服务器带来的压力渲染页面。
所以如果遇到这样的页面,直接使用requests之类的库爬取原创页面是无法获取有效数据的。这时候就需要分析网页后端向接口发送的Ajax请求了。如果可以使用requests来模拟ajax请求,那么就可以成功抓取了。
我们来看看什么是Ajax请求。什么是阿贾克斯
Ajax,全称是Asynchronous JavaScript and XML,即异步JavaScript和XML。它不是一种编程语言,而是一种使用 JavaScript 与服务器交换数据并更新网页的部分内容而不刷新页面且页面链接不改变的技术。
对于传统的网页,如果要更新其内容,就必须刷新整个页面,但是使用Ajax,可以在不刷新整个页面的情况下更新页面的内容。在这个过程中,页面实际上是在后台与服务器交互的。获取到数据后,使用 JavaScript 改变网页,从而更新网页的内容。
1.实例介绍
在浏览网页的时候,我们会发现很多网页已经向下滚动,可以查看更多选项。比如以微博为例,以徐嵩的主页为例:切换到微博页面,一直往下滑,你会发现往下滑几条微博后,它就消失了,而是出现了一个加载*敏*感*词*,并且然后下面继续出现新的微博内容,这个过程其实就是Ajax加载的过程:
我们注意到页面并没有完全刷新,也就是说页面上的链接没有变化,但是页面中出现了新的内容,也就是后来刷到的新微博。这就是通过 Ajax 获取新数据并呈现的内容。
2.基本原则
初步了解了Ajax之后,我们再来了解一下它的基本原理。向网页更新发送 Ajax 请求的过程可以简单分为以下 3 个步骤:
发送请求
我们知道JavaScript可以实现页面的各种交互功能,Ajax也不例外。它也是由 JavaScript 实现的,实际执行如下代码:
var xmlhttp;
if (window.XMLHttpRequest){
//code for IE7+,Firefox,Chrmoe,Opera,Safari
xmlhttp=new XMLHttpRequest();
}else{//code for IE5,IE6
xmlhttp=new ActiveXObject("Mircrosoft.XMLHTTP");
}
xmlhttp.onreadystatchange=function(){
if(xmlhttp.readyState==4 && xmlhttp.stutus == 200){
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("POST","/ajax/",true);
xmlhttp.send();
这是由 JavaScript 实现的 Ajax 的最低级别。其实就是新建一个XMLHttpRequest对象,然后调用onreadystatechange属性设置*敏*感*词*,然后调用open()和send()方法向一个链接(也就是服务器)发送请求。在前面的文章中,我们使用python发送请求后可以得到响应结果,但是这里请求的发送是通过JavaScript编程完成的。由于设置了*敏*感*词*器,当服务器返回时,会触发onreadystatechange对应的方法,然后可以在该方法中解析响应的内容。
解析内容
得到响应后,会启动onreadychange属性对应的方法,可以通过xmlhttp的responseText属性获取对应的内容。这类似于 Python 中使用 requests 向服务器发起请求,然后得到响应的过程。那么返回的内容可能是 HTML,也可能是 JSON,然后你只需要在方法中使用 JavaScript 进行进一步处理即可。例如,如果是JSON,则可以进行解析和转换。
呈现网页
JavaScript 具有更改网页内容的能力。解析响应内容后,可以调用 JavaScript 对网页进行解析处理。例如,通过document.getElementById().innerHTML的操作,可以改变一个元素中的源代码,从而改变网页上显示的内容。文档操作,如更改、删除等。
在上面的例子中,document.getElementById("myDiv").innerHTML = xmlhttp.responseText 会将ID为myDiv的节点内部的HTML代码改成服务器返回的内容,这样服务器返回的新数据就是呈现在 myDiv 元素中。部分内容似乎已更新。
我们观察到这 3 个步骤实际上是由 JavaScript 完成的,它完成了请求、解析和渲染的整个过程。
回想一下微博的pull-to-refresh,这其实就是JavaScript向服务器发送Ajax请求,然后获取新的微博数据,解析,渲染到网页中。
因此,我们知道,真正的数据实际上是一次又一次地从 Ajax 请求中获取的。如果你想捕获这些数据,你需要知道数据是如何发送的,发送到哪里,发送了什么参数。如果我们知道这一点,我们可以在 Python 中模拟这个操作并得到结果。