当前位置: 首页 > news >正文

《Python3 网络爬虫开发实战》:什么是AJAX?

《Python3 网络爬虫开发实战》:什么是AJAX

Ajax,全称为 Asynchronous JavaScript and XML即异步的 JavaScript XML。它不是一门编程语言,而是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。
对于传统的网页,如果想更新其内容,那么必须刷新整个页面,但有了 Ajax,便可以在页面不被全部刷新的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器进行了
数据交互
,获取到数据之后,再利用 JavaScript 改变网页,这样网页内容就会更新了。


向服务器发送请求

如需向服务器发送请求,就会涉及到 open()和send()方法

xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();

GET 还是 POST?
GET 比 POST 更简单更快,可用于大多数情况下。

不过,请在以下情况始终使用 POST:

  • 缓存文件不是选项(更新服务器上的文件或数据库)
  • 向服务器发送大量数据(POST 无大小限制)
  • 发送用户输入(可包含未知字符),POST 比 GET 更强大更安全

get请求

一条简单的GET请求:

1. 实例引入

浏览网页的时候,我们会发现很多网页都有下滑查看更多的选项。比如,拿微博来说: 微博页面,一直下滑,可以发现下滑几个微博之后,再向下就没有了,转而会出现一个加载的动画,不一会儿下方就继续出现了新的微博内容,这个过程其实就是** Ajax 加载**的过程,如图所示。

2. 基本原理

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

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

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

在这里插入图片描述
这是 JavaScript 对 Ajax 最底层的实现,实际上就是新建了 XMLHttpRequest 对象,然后调用 onreadystatechange 属性设置了监听,然后调用 opensend 方法向某个链接(也就是服务器)发送了请求。前面用 Python 实现请求发送之后,可以得到响应结果,但这里请求的发送变成 JavaScript 来完成。由于设置了监听,所以当服务器返回响应时,onreadystatechange 对应的方法便会被触发,然后在这个方法里面解析响应内容即可。

解析内容

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

渲染网页

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

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

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

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

因此,我们知道,真实的数据其实都是一次次 Ajax 请求得到的,如果想要抓取这些数据,需要知道这些请求到底是怎么发送的,发往哪里,发了哪些参数。如果我们知道了这些,不就可以用 Python 模拟这个发送操作,获取到其中的结果了吗?

  1. 总结
    本节我们简单了解了 Ajax 请求的基本原理和带来的页面加载效果,下一节我们来介绍下怎么来分析 Ajax 请求。

相关文章:

  • 超详细Python自动化测试学习指南,附学习路线图+企业真实项目。看完月薪30K指日可待。。。
  • 卷积神经网络基础
  • PCIe系列专题之二:2.1 TLP的前世今生
  • 【面经】HTTP篇
  • web自动化测试(selenium.webdriver)
  • grpc和protobuf在一起
  • 1. HelmTemplate 3分钟将项目打包成Helm Chart并部署至k8s
  • 【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量
  • Redis 备份恢复(持久化)手册
  • 【Linux】01-Linux系统CentOS7虚拟机VMware安装保姆级教程
  • Go语言各种扩容机制(防止混淆)
  • Pytorch深度学习——线性回归实现 04(未完)
  • 虚拟内存、锁页内存、内存分页、分段、段页式内存管理(超详细)
  • 【BOOST C++】教程4:常量和宏
  • 不可以涩涩!AI续写软件初体验;迁移学习路线图;谷歌新闻非官方搜索API;CS295『因果推理』2021课程资料;前沿论文 | ShowMeAI资讯日报
  • 10个最佳ES6特性 ES7与ES8的特性
  • Elasticsearch 参考指南(升级前重新索引)
  • git 常用命令
  • Git学习与使用心得(1)—— 初始化
  • Java多线程(4):使用线程池执行定时任务
  • October CMS - 快速入门 9 Images And Galleries
  • python学习笔记-类对象的信息
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vultr 教程目录
  • 从伪并行的 Python 多线程说起
  • 对象引论
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 听说你叫Java(二)–Servlet请求
  • 自动记录MySQL慢查询快照脚本
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (2)STL算法之元素计数
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (SpringBoot)第七章:SpringBoot日志文件
  • (超详细)语音信号处理之特征提取
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (七)Knockout 创建自定义绑定
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net中ListT 泛型转成DataTable、DataSet
  • .net中生成excel后调整宽度
  • /dev/sda2 is mounted; will not make a filesystem here!
  • [Apio2012]dispatching 左偏树
  • [asp.net core]project.json(2)
  • [autojs]逍遥模拟器和vscode对接
  • [BZOJ2208][Jsoi2010]连通数
  • [C++核心编程](四):类和对象——封装
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [JavaWeb]—Spring入门
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [LeetCode] 178. 分数排名