ajax抓取网页内容(分类目录:《Python爬虫从入门到精通》总目录Ajax数据)

优采云 发布时间: 2022-04-04 07:17

  ajax抓取网页内容(分类目录:《Python爬虫从入门到精通》总目录Ajax数据)

  分类:《Python爬虫从入门到精通》总目录

  Ajax 数据爬取(一):基础

  Ajax数据爬取(二):分析方法

  Ajax数据爬取(三):结果提取

  有时候我们使用requests爬取页面时,得到的结果可能和我们在浏览器中看到的不一样:我们可以看到页面数据在浏览器中正常显示,但是使用requests得到的结果却不是。这是因为请求都是原创的 HTML 文档,而浏览器中的页面是通过 JavaScript 处理数据的结果。这些数据有多种来源,可以通过 Ajax 加载或收录在 HTML 中。在文档中,也可能是通过 JavaScript 和特定算法计算后生成的。

  对于第一种情况,数据加载是一种异步加载方式。最初的页面不会收录一些数据。原创页面加载完成后,会向服务器请求一个接口获取数据,然后对数据进行处理呈现。对网页来说,这实际上是发送一个 Ajax 请求。根据Web发展的趋势,这种形式的页面越来越多。网页的原创HTML文档不收录任何数据,通过Ajax统一加载后呈现数据,这样可以在Web开发中分离前后端,以及服务器带来的压力直接渲染页面减少了。

  因此,如果遇到这样的页面,直接使用requests等库爬取原创页面是无法获取有效数据的。这时候就需要分析网页后端向接口发送的Ajax请求了。如果可以使用requests来模拟ajax请求,那么就可以成功抓取了。

  Ajax,全称是Asynchronous JavaScript and XML,即异步JavaScript和XML。它不是一种编程语言,而是一种使用 JavaScript 与服务器交换数据并更新网页的部分内容而不刷新页面且页面链接不改变的技术。

  对于传统的网页,如果要更新其内容,则必须刷新整个页面,但使用 Ajax,您可以在不完全刷新页面的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器交互的。获取到数据后,使用 JavaScript 改变网页,从而更新网页的内容。

  在浏览网页的时候,我们会发现很多网页已经向下滚动,可以查看更多选项。比如新浪微博,切换到微博页面,一直往下滑,可以发现往下滑了几条微博后就消失了,并且会出现一个加载*敏*感*词*,过一会下面还会继续出现新的微博. 内容,这个过程其实就是Ajax加载的过程。

  初步了解了Ajax之后,我们再来了解一下它的基本原理。向网页更新发送 Ajax 请求的过程可以简单分为以下 3 个步骤:

  发送请求解析内容渲染网页发送请求

  我们知道JavaScript可以实现页面的各种交互功能,Ajax也不例外。它也是由 JavaScript 实现的,实际执行如下代码:

  var 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属性对应的方法,可以通过xmlhttp的responseText属性获取响应内容。这类似于 Python 中使用 requests 向服务器发起请求,然后得到响应的过程。那么返回的内容可能是 HTML,也可能是 JSON,然后你只需要在方法中使用 JavaScript 进行进一步处理即可。例如,如果是JSON,则可以进行解析和转换。

  呈现网页

  JavaScript 具有更改网页内容的能力。解析响应内容后,可以调用 JavaScript 对网页进行解析处理。例如,通过document.getElementById().innerHTML的操作,可以改变一个元素中的源代码,从而改变网页上显示的内容。该操作也称为DOM操作,即对Document网页的Document操作,如更改、删除等。

  在上面的例子中,document.getElementById("myDiv").innerHTML=xmlhttp.responseText 会将ID为myDiv的节点内部的HTML代码改成服务器返回的内容,这样服务器返回的新数据就是显示在 myDiv 元素内。页面的某些部分似乎已更新。

  我们观察到这 3 个步骤实际上是由 JavaScript 完成的,它完成了请求、解析和渲染的整个过程。回想一下微博的下拉刷新,这其实就是JavaScript向服务器发送Ajax请求,然后获取新的微博数据,解析,在网页中渲染。

  因此,我们知道,真正的数据实际上是一次又一次地从 Ajax 请求中获取的。如果你想捕获这些数据,你需要知道这些请求是如何发送的,发送到哪里,发送了什么参数。如果我们知道这一点,我们可以使用 Python 来模拟这个发送操作并得到结果。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线