爬虫请求分析——Ajax请求 python爬取ajax异步加载
qiyuwang 2024-10-21 09:39 25 浏览 0 评论
随着前后端技术的越来越成熟,使用成熟的前端框架来实现前后端分离的项目越来越多,这就导致了如果直接使用 requests 库获取到的页面内容,可能与最终在浏览器呈现的不一致,而且没有任何数据内容。这是因为前后端分离的项目页面上的数据是通过 JavaScript 从服务器获取数据后,然后重新处理后所展示出的内容(前台渲染),而数据是通过 Ajax 方式获取的,整个过程通常都是异步完成的,因此在用户体验上非常好。
基于上述原因,想要爬取这种页面的数据,就需要学会分析网页如何通过接口向后台发送 Ajax 请求,并使用 requests 来模拟浏览器发送 Ajax 请求来获取数据。
什么是 Ajax 请求
Ajax 是一种异步的 JavaScript 请求,其中 x 表示的 XML,但现在 JSON 的使用要多于 XML。利用 Ajax 可以实现在页面不刷新的情况下与服务器进行通讯更新数据,这就避免了因为要更新页面而刷新网址的操作,体验效果更好。
Ajax 的原理
Ajax 的原理非常简单,大致包含三个步骤:
- 发送网络请求
在早先时候,window 下的 XMLHttpRequest 对象是发送 Ajax 请求的原始实现,通过获取 XMLHttpRequest 示例,并监听 onreadystatechange 事件来完成整个异步流程,而且需要考虑浏览器的兼容性,在使用过程中非常麻烦。不过后来的 JQuery 框架提供了非常简便的调用方法,还不需要考虑兼容性,这使得 Ajax 使用易用且越来越广泛。现在非常流行的 Vue 项目,则使用 axios 框架来完成 Ajax 请求。
- 服务器响应数据成功后,解析响应数据
数据解析的过程相对简单,虽然通过 Ajax 可以返回任意形式的数据,这在开发阶段一般前后端会做约定,现今较为流行的是返回 JSON 格式的标准数据,JavaScript 可以非常容易的处理这些响应的数据。
- 通过 JavaScript 更新页面内容
不管是使用原生 JavaScript DOM api 还是使用像 JQuery 这样的库,都是将接口返回的数据重新渲染到页面上,才完成了最终的目的。
如何获取 Ajax 请求
由于 Ajax 请求是在不刷新页面的情况下且异步完成的数据请求。因此我们必须借助浏览器开发工具(有多重打开方式: 快捷键 F12, 页面鼠标右键-检查等等)来获取请求链接的相关内容。这对于我们有 web 开发的经验的同学是非常熟悉的技能,在绝大多数时候需要借助此工具来调试接口。
如上述中的图片中,Ajax 发起的请求在浏览器中显示的类型是 xhr,点击后就可看到请求的各种内容,Ajax 请求响应回的数据既有 HTML 页面内容,也有 JSON 数据,在做接口响应分析时一定要关注。
同时也可以在请求头中看到X-Requested-With: XMLHttpRequest 的描述信息(这不是必有的选项)。
Ajax 响应数据处理
前边我们说过,在 Ajax 的响应数据中,返回的数据不总是 JSON 格式的,因此在做接口响应处理之前,需要对响应内容做基础的判断,防止解析方式错误导致获取到的数据不正确。不过当前流行的前后端分离项目中,以 JSON 作为响应结果的占绝大多数,因此以下以 JSON 结果为例做说明。
以 httbin 中的 json 获取为例,通过点击浏览器网络工具中标头可以获得请求相关的信息,包含请求地址 URL,请求方式 GET 等相关内容。
import requests
import pprint
res = requests.get(
'https://www.httpbin.org/json')
pprint.pprint(res.json())
# {
# "slideshow": {
# "author": "Yours Truly",
# "date": "date of publication",
# "slides": [
# {
# "title": "Wake up to WonderWidgets!",
# "type": "all"
# },
# {
# "items": [
# "Why <em>WonderWidgets</em> are great",
# "Who <em>buys</em> WonderWidgets"
# ],
# "title": "Overview",
# "type": "all"
# }
# ],
# "title": "Sample Slide Show"
# }
# }
如上边的代码示例,我们通过使用 request 访问地址,在响应结果中调用 json 方法即可获取到返回的 JSON 数据,并且自动转换为了dic类型,至此就可以轻松的获取 Ajax 响应中的数据。
在爬取Ajax 数据的时候,最重要的就是分析请求接口,包括每次请求的规律,比如每次请求参数是如何变化的,以及各种参数是如何获取和生成的,还有各种防止爬虫的策略,需要设置请求头的数据等等。
相关推荐
- 基于Docker方式安装与部署Camunda流程引擎
-
1Camunda简介官网:https://docs.camunda.org/manual/7.19/installation/docker/Camunda是一个轻量级、开源且高度灵活的工作流和决策自...
- 宝塔Linux面板如何部署Java项目?(宝塔面板 linux)
-
通过宝塔面板部署Java还是很方便的,至少不需要自己输入tomcat之类的安装命令了。在部署java项目前,我还是先说下目前的系统环境,如果和我的系统环境不一样,导致部署不成功,那你可能需要去找其他资...
- 浪潮服务器如何用IPMI安装Linux系统
-
【注意事项】此处以浪潮服务器为例进行演示所需使用的软件:Chrome浏览器个人PC中需要预先安装java,推荐使用jdk-8u181-windows-x64.exe【操作步骤】1、在服务器的BIOS中...
- Centos7环境Hadoop3集群搭建(hadoop集群环境搭建实验报告)
-
由于项目需要存储历史业务数据,经过评估数据量会达到100亿以上,在原有mongodb集群和ES集群基础上,需要搭建Hbase集群进行调研,所以首先总结一下Hadoop集群的搭建过程。一、三个节点的集群...
- Hadoop高可用集群搭建及API调用(hadoop高可用原理)
-
NameNodeHA背景在Hadoop1中NameNode存在一个单点故障问题,如果NameNode所在的机器发生故障,整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNo...
- 使用Wordpress搭建一个属于自己的网站
-
现在开源的博客很多,但是考虑到wordpress对网站的seo做的很好,插件也多。并且全世界流量排名前1000万的网站有33.4%是用Wordpress搭建的!所以尝试用Wordpress搭建一个网站...
- Centos 安装 Jenkins(centos 安装ssh)
-
1、Java安装查看系统是否已安装Javayumlistinstalled|grepjava...
- Java教程:gitlab-使用入门(java中的git)
-
1导读本教程主要讲解了GitLab在项目的环境搭建和基本的使用,可以帮助大家在企业中能够自主搭建GitLab服务,并且可以GitLab中的组、权限、项目自主操作...
- Dockerfile部署Java项目(docker部署java应用)
-
1、概述本文主要会简单介绍什么是Docker,什么是Dockerfile,如何安装Docker,Dockerfile如何编写,如何通过Dockerfile安装jar包并外置yaml文件以及如何通过do...
- 如何在Eclipse中搭建Zabbix源码的调试和开发环境
-
Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...
- Java路径-02-Java环境配置(java环境搭建及配置教程)
-
1Window环境配置1.1下载...
- 35.Centos中安装python和web.py框架
-
文章目录前言1.Centos7python:2.Centos8python:3.进行下载web.py框架然后应用:4.安装好之后进行验证:5.总结:前言...
- 《我的世界》服务器搭建(我的世界服务器如何搭建)
-
1.CentOS7环境1.1更改YUM源#下载YUM源文件curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com...
- CentOS 7 升级 GCC 版本(centos7.4升级7.5)
-
1.GCC工具介绍GCC编译器:...
- Linux安装Nginx详细教程(linux安装配置nginx)
-
环境准备1.因为Nginx依赖于gcc的编译环境,所以,需要安装编译环境来使Nginx能够编译起来。命令:yuminstallgcc-c++显示完毕,表示安装完成:2.Nginx的http模块需要...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 基于Docker方式安装与部署Camunda流程引擎
- 宝塔Linux面板如何部署Java项目?(宝塔面板 linux)
- 浪潮服务器如何用IPMI安装Linux系统
- Centos7环境Hadoop3集群搭建(hadoop集群环境搭建实验报告)
- Hadoop高可用集群搭建及API调用(hadoop高可用原理)
- 使用Wordpress搭建一个属于自己的网站
- Centos 安装 Jenkins(centos 安装ssh)
- Java教程:gitlab-使用入门(java中的git)
- Dockerfile部署Java项目(docker部署java应用)
- 如何在Eclipse中搭建Zabbix源码的调试和开发环境
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)