百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

爬虫请求分析——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 的原理非常简单,大致包含三个步骤:

  1. 发送网络请求

在早先时候,window 下的 XMLHttpRequest 对象是发送 Ajax 请求的原始实现,通过获取 XMLHttpRequest 示例,并监听 onreadystatechange 事件来完成整个异步流程,而且需要考虑浏览器的兼容性,在使用过程中非常麻烦。不过后来的 JQuery 框架提供了非常简便的调用方法,还不需要考虑兼容性,这使得 Ajax 使用易用且越来越广泛。现在非常流行的 Vue 项目,则使用 axios 框架来完成 Ajax 请求。

  1. 服务器响应数据成功后,解析响应数据

数据解析的过程相对简单,虽然通过 Ajax 可以返回任意形式的数据,这在开发阶段一般前后端会做约定,现今较为流行的是返回 JSON 格式的标准数据,JavaScript 可以非常容易的处理这些响应的数据。

  1. 通过 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模块需要...

取消回复欢迎 发表评论: