Pyhon爬虫之Ajax的数据爬取

2024-03-31 06:12
文章标签 数据 爬虫 ajax 爬取 pyhon

本文主要是介绍Pyhon爬虫之Ajax的数据爬取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Ajax数据爬取

一、什么是Ajax

Ajax,全称Asynchronous JavaScript and XML,即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页内容的技术

对于传统网页,要更新内容则需要刷新页面,而Ajax可以在页面不被刷新的情况下更新。(这个过程实际是页面在后台与服务器进行了数据交互,获取数据后,再利用JavaScript改变网页。)

1、实例

网页中的“下滑查看更多”的选项等…

2、基本原理

从发送Ajax请求到网页更新的这个过程分3步:发送请求、解析内容、渲染网页

2.1、发送请求

这是JavaScript对Ajax最底层的实现:

var xmlhttp;
if (window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();
} else {//code for IE6,IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function (){if (xmlhttp.readyState == 4 && xmlhttp.status == 200){document.getElementById("myDiv").innerText=xmlhttp.responseText;}
}
xmlhttp.open("POST","/ajax/",true);
xmlhttp.send();
  • 先新建一个XMLHttpRequest对象xmlhttp
  • 调用onreadystatechange属性设置监听
  • 调用open和send方法向某个链接(也就是服务器)发送请求。

2.2、解析内容

服务器返回响应后,onreadystateschange属性对应的方法就被触发了,此时利用xmlhttp的responseText属性便可以得到响应内容。

2.3、渲染网页

JavaScript有改变网页内容的能力,因此解析完响应内容之后,就可以调用JacaScript来基于解析完的内容对网页进行下一步处理了。

二、Ajax分析方法

1、案例分析

Ajax有其特殊的请求类型,叫做xhr。在 加载过程中使用检查工具的页面中,我们可以看到一个以getIndex开头的请求信息,其type就为xhr,意味着这就是一个Ajax请求。

右侧可以观察这个Ajax请求的Repuest Headers、URL和Response Headers等信息。其中Request Header中有一个信息为**X-Requested-With:XMLHttpRequest,**这就标记了此请求时Ajax请求,

点击Preview就能看到响应的内容,这些内容是JSON格式的。JavaScript接收到这些数据后,再执行相应的渲染方法,整个页面就渲染出来了。

所以说,呈现给我们的真实数据并不是最原始的页面返回的,而是执行JavaScript后再次向后台发送Ajax请求,浏览器拿到服务器返回的数据后进一步渲染得到的。

2、过滤数据

利用Chrome开发者工具的筛选功能能够筛选出所有Ajax请求。在请求的上方有一层筛选栏,直接单击XHR,就能显示所有Ajax的请求了。

随便点开其中一个条目,都可以清楚地看到其Request URL,Request Headers,Reponse Headers,Response Body等内容,此时想要模拟Ajax请求的发送和数据的提取就非常容易了。(用程序模拟这些Ajax请求

三、Ajax分析与爬取实战

1、爬取目标

https://spa1.scrape.center/

  • 分析页面数据的加载逻辑
  • 用requests实现Ajax数据的爬取
  • 将每部电影的数据分别保存到数据库

2、初步开始

用最简单的代码实现一下requests获取网站首页源码的过程:

import requestsurl = "https://spa1.scrape.center/"
html = requests.get(url).text
print(html)

3、爬取列表页

观察多个Ajax的参数,总结:limit一直为10,正好对应每页的10条数据;offset在依次变大,页数每加1,offset就加10,因此其代表页面的数据偏移量。

结果就是一些JSON数据,其中有一个results字段,是一个列表,列表中每一个元素都是一个字典,观察字典内容,里面正好可以看到对应电影数据的字段,如name、alias、cover、categories。我们只需要构造出所有页面的Ajax接口,就可以轻松获取内容了:

import logging
import requestslogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')		# 定义logging的基本配置INDEX_URL = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}'	# 把limit和offset预留出来变成占位符,可以动态传入参数构造一个完整的URL。# 专门用来处理JSON接口
def scrape_api(url):logging.info('scraping %s...', url)try:response = requests.get(url)	if response.status_code == 200:return response.json()	# 解析响应内容并将其转化成JSON字符串logging.error('get invalid status code %s while scraping %s', response.status_code, url)except requests.RequestException:logging.error('error occurred while scraping %s', url, exc_info=True)LIMIT = 10# 爬取列表页
def scrape_index(page):url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))	# 通过字符串的format方法传入limit和offset的值。return scrape_api(url)

这样就完成了列表页的爬取,每次发送Ajax请求都会得到10部电影的数据信息。

由于这时爬取到的数据已经是JSON类型了,所以无需像之前那样去解析HTML代码来提取数据,爬取到的数据已经是我吗想要的结构化数据。

4、爬取详情页

单击任意一电影,发现URL变成https://spa1.scrape.center/detail/40,页面也成功展示了详情页。

可以在开发者工具发现出现了一个Ajax请求,其URL为https://spa1.scrape.center/api/movie/40,通过Preview也能看到 Ajax请求对应的响应信息。

# 爬取详情页的爬取逻辑
DETAIL_URL = 'https://spa1.scrape.center/api/movie/{id}'def scrape_detail(id):url = DETAIL_URL.format(id=id)return scrape_api(url)# 总的调用方法:
TOTAL_PAGE = 10def main():for page in range(1, TOTAL_PAGE + 1):index_data = scrape_index(page)for item in index_data.get('results'):id = item.get('id')detail_data = scrape_detail(id)logging.info('detail data %s', detail_data)if __name__ == '__main__':main()
  • main()方法首先遍历获取页码,然后把page当做参数传递给scrape_index方法,得到列表页的数据。接着遍历每个列表页的每个结果,获取每部电影的id。之后把id当做参数传递给scrape_detail方法来获取每部电影的详情数据,并将此数据赋值给detail_data,最后输出detail_data即可。

5、保存数据

这篇关于Pyhon爬虫之Ajax的数据爬取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863608

相关文章

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指