第5章 Ajax数据爬取

目录

  • 1. 什么是Ajax
    • 1.1 实例引入
    • 1.2 基本原理
      • 发送请求
      • 解析内容
      • 渲染网页
  • 2. Ajax分析方法
    • 2.1 分析案例
    • 2.2 过滤请求
  • 3. Ajax分析与爬取实战
    • 3.1 爬取目标
    • 3.2 初步探索
    • 3.3 爬取列表页
      • 分析
      • 实现
        • 基础配置
        • 爬取页面内容(获取页面的JSON内容)
        • 爬取列表页(爬取指定列表页)
      • 合并
    • 3.4 爬取详情页
      • 分析
      • 实现
        • 爬取详情页
        • 串联调用
      • 合并
    • 3.5 保存数据(MongoDB)(后期补充)

  • 使用requests获取的是原始HTML文档
  • 浏览器中的页面是JavaScript处理数据后生成的结果
  • 数据的来源
    • 通过Ajax加载
    • 包含在HTML文档中
    • 经过JavaScript和特定算法计算后生成
  • Ajax加载数据
    • 方式:异步
      • 原始页面最初不包含某些数据
      • 当原始页面加载成功后,再向服务器请求某个接口获取数据
        • 发送Ajax请求
      • 然后将数据处理并呈现在网页上

1. 什么是Ajax

  • Ajax(Asynchronous JavaScript and XML):异步的 JavaScript 和 XML
    • 不是一门编程语言
    • 利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术

1.1 实例引入

  • 下滑查看更多
  • 下滑后加载的动画:Ajax 加载的过程

1.2 基本原理

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

发送请求

  • JavaScript对Ajax最底层的实现
var xmlhttp;
if (window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();
} else {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();

解析内容

var xmlhttp;
if (window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();
} else {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();

渲染网页

var xmlhttp;
if (window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();
} else {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();

2. Ajax分析方法

2.1 分析案例

  • 微博 (weibo.cn)
  • Ajax 的请求类型:xhr
  • 如果 Request Headers 中有一个信息为XMLHttpRequest,则此请求就是 Ajax 请求
    • 以 getIndex 开头的请求
  • 可以在 Preview 查看响应的内容
  • 也可以在 Response 查看真实返回的数据

2.2 过滤请求

  • 点击 Network 中的 XHR 选项,显示所有的 Ajax 请求

3. Ajax分析与爬取实战

  • 爬取 Scrape | Movie
    • 与 2.5(Scrape | Movie)不同
      • 数据请求是通过 Ajax 实现的
      • 页面内容通过 JavaScript 渲染出来的
      • 只是呈现样式是一样的

3.1 爬取目标

  • 爬取电影的名称、封面、类别、上映时间、评分、剧情简介等内容
  • 分析页面数据的加载逻辑
  • 用 requests 实现 Ajax 数据的爬取
  • 将每部电影数据分别保存到 MongoDB 数据库

3.2 初步探索

import requestsurl = "https://spa1.scrape.center/"
html = requests.get(url).textprint(html)
  • 获取到的 html 资源较少
  • 整个页面都是JavaScript渲染得到的,浏览器执行了HTML中引用的JavaScript文件,JavaScript通过调用一些数据加载和页面渲染方法,才最终呈现出浏览器中的显示效果
  • 数据一般是通过Ajax加载的,JavaScript在后台调用Ajax数据接口

3.3 爬取列表页

分析

  • 请求URL的limit恒定为10,offset为已经已经翻过的电影数量( ( 当前页数 − 1 ) ∗ 10 (当前页数-1)*10 (当前页数1)10
  • 根据响应内容可以发现所需数据皆在其中

实现

基础配置
import logginglogging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s: %(message)s')INDEX_URL = "https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}"
爬取页面内容(获取页面的JSON内容)
import requestsdef scrape_api(url):logging.info(f"scraping {url}...")try:response = requests.get(url)if response.status_code == 200:return response.json()logging.error(f"Status code: {response.status_code} while scraping {url}")except requests.RequestException:logging.error(f"Error while scraping {url}", exc_info=True)
爬取列表页(爬取指定列表页)
LIMIT = 10def scrape_index(page):url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))return scrape_api(url)

合并

import logging
import requestslogging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s: %(message)s')INDEX_URL = "https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}"
LIMIT = 10def scrape_api(url):logging.info(f"scraping {url}...")try:response = requests.get(url)if response.status_code == 200:return response.json()logging.error(f"Status code: {response.status_code} while scraping {url}")except requests.RequestException:logging.error(f"Error while scraping {url}", exc_info=True)def scrape_index(page):url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))return scrape_api(url)

3.4 爬取详情页

分析

  • url:最后的一个参数为此电影的id
  • 电影的id:Ajax请求返回的数据中含有电影对应的id

实现

爬取详情页
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(f"detail data {detail_data}")if __name__ == "__main__":main()

合并

import logging
import requestslogging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s: %(message)s')INDEX_URL = "https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}"
DETAIL_URL = "https://spa1.scrape.center/api/movie/{id}"
LIMIT = 10
TOTAL_PAGE = 10def scrape_api(url):logging.info(f"scraping {url}...")try:response = requests.get(url)if response.status_code == 200:return response.json()logging.error(f"Status code: {response.status_code} while scraping {url}")except requests.RequestException:logging.error(f"Error while scraping {url}", exc_info=True)def scrape_index(page):url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))return scrape_api(url)def scrape_detail(id):url = DETAIL_URL.format(id=id)return scrape_api(url)def 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(f"detail data {detail_data}")if __name__ == "__main__":main()

3.5 保存数据(MongoDB)(后期补充)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李宏毅2020机器学习课程笔记(二)- 深度学习

相关专题: 李宏毅2020机器学习资料汇总 本系列笔记: 李宏毅2020机器学习课程笔记(一)- 分类与回归李宏毅2020机器学习课程笔记(二)- 深度学习李宏毅2020机器学习课程笔记(三)- CNN、半监督、RNN文章目录 3. Deep LearningBrief Introduction of Deep Learning(P12)Ba…

【华为OD题库-056】矩阵元素的边界值-java

题目 给定一个N * M矩阵,请先找出M个该矩阵中每列元素的最大值,然后输出这M个值中的最小值 补充说明: N和M的取值范围均为: [0,100] 示例1: 输入: [[1,2],[3,4]] 输出: 3 说明: 第一列元素为:1和3,最大值为3 第二列元素为: 2和4,最…

3D点云目标检测:VoxelNex解读

VoxelNext 通用检测器 vs VoxelNext一、3D稀疏卷积模块1.1、额外的两次下采样消融实验结果代码 1.2、稀疏体素删减消融实验:代码 二、稀疏体素高度压缩代码 三、稀疏预测head 通用检测器 vs VoxelNext 一、3D稀疏卷积模块 1.1、额外的两次下采样 使用通用的3D spa…

保姆级大猿人中控系统搭建教程/话费充值系统/支持代理分销(12.1更新下)

前言 csdn上面是多久没更新啦,没啥值得写的,有也懒得写~ 写文章依然是那么飘逸,哈哈~ 最近看上了一款系统还是挺不错的,直接对接话费、垫费、燃气api充值的系统,还可以,市面上主流的话费中控系统&#xf…

最新发布SPAB模块,YOLOv5改进之SPAB

目录 一、原理 二、代码 三、应用到YOLOv5 一、原理 单幅图像超分辨率(SISR)是低分辨率计算机视觉中的一项重要任务,旨在从低分辨率图像中重建高分辨率图像。传统的注意机制虽然显著提高了SISR的性能,但往往导致网络结构复杂、参数过多,导致推理速度慢

python爬虫基础知识

使用python进行网络爬虫开发之前,我们要对什么是浏览器、什么HTML,HTML构成。请求URL的方法都有一个大概了解才能更清晰的了解如何进行数据爬取。 什么是浏览器? 网页浏览器,简称为浏览器,是一种用于检索并展示万维网信息资源的…

【力扣 面试题02.07链表相交】一种思路极其清晰的解法

力扣一单简单题,看完大佬的题解真是佩服得五体投地! 虽是一道简单题,当我吭哧吭哧写了几十行后,看到大佬仅仅几行直接秒掉,只能说算法的本质还是数学,数学逻辑思维真是太重要了,有时候真得慢慢去…

layui学习笔记

中文网1: https://www.layui1.com/doc/index.html 中文网2: https://layui.dev/docs/2/ laye弹出层: https://blog.csdn.net/qq_61313896/article/details/132901112 laye弹出层: https://blog.csdn.net/gybshen/article/details/110725734 layer.alert https://blog.csd…

操作系统进程与线程篇

目录 一、进程 1.1、进程状态 1.2、进程的控制结构 1.3、进程的控制 1.4、进程的上下文切换 二、线程 2.1.线程是什么 2.2、线程与进程的比较 2.3、线程的上下文切换 2.4、线程的实现 2.5、轻量级线程 三、进程间的通信方式 3.1、管道 3.2、消息队列 3.3、共享内…

代码人生,养生有道

导言: 在代码的征程中,我们往往忽略了自身的身体健康。这次的活动,我们不妨一同探讨一下,作为程序员,如何通过科学的养生方式,告别亚健康,迎接更健康、更充实的人生。 工作中的挑战 繁忙的工…

Node.js与npm的准备与操作

1.下载 Node.js官网:Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 打开后的界面如下: LTS(Long Term Support):长期支持版,稳定版 Current&am…

键入网址到网页显示,期间发生了什么?(计算机网络)

一、浏览器首先会对URL进行解析 下面以http://www.server.com/dir1/file1.html为例 当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html 对URL进行解析之后,浏览器确定了 Web 服务器和文件名&am…

SQL Sever Unicode字符串简单介绍

热情推荐文章:SQL Sever 存储过程相关知识点 Unicode 字符简介 在 SQL Server 中,Unicode 字符串是一种用于存储 Unicode 字符集中字符的数据类型。Unicode 是一种字符编码标准,用于支持世界上几乎所有的字符,包括各种语言、符号…

算法——动态规划

动态规划:有很多重叠子问题,每一个状态一定是由上一个状态推导出来的 贪心:没有状态推导,而是从局部直接选最优的 动规五步曲: 确定dp数组(dp table)以及下标的含义 确定递推公式(容…

分享89个清新唯美PPT,总有一款适合您

分享89个清新唯美PPT,总有一款适合您 89个清新唯美PPT下载链接:https://pan.baidu.com/s/14DAA9jvVmlQZ_FJ4DNy9Rw?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整…

二十三种设计模式全面解析-探索解释器模式如何应对性能挑战

在前一篇文章中,我们介绍了解释器模式在处理大型代码或复杂语法时可能面临性能方面的挑战。 这里,我们将继续探索解释器模式的更多高级应用和优化技巧,如何处理复杂的语法规则、如何支持扩展和定制化,以及如何应对性能挑战。 一、…

Juniper EX系列交换机端口配置操作

配置物理端口参数 userhost#set interface ge-slot/pic/port decription description #配置端口描述 userhost#set interface ge-slot/pic/port mtu mtu-number #配置端口MTU userhost#set interface ge-slot/pic/port ether-options speed (10m | 100m | 1g) #配置端口速率…

Java Class文件结构细节最全解读

官方文档位置:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html Class 类的本质 任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,Class文件实际上它并不一定以磁盘文件的形式存在。Class 文件是一组以8位字…

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点 1,蓝屏显示问题1.1,蓝屏1,清楚显示1.2,蓝屏2,模糊显示 2,排除故障问题3,解决蓝屏的有效方法 1&a…

Mac电脑音乐标签管理 Yate 激活最新 for Mac

Yate是一款非常实用的音频编辑和标记软件,它提供了丰富的功能和工具来帮助用户编辑、整理和管理音频文件。无论是在音乐收藏管理、DJ和音乐制作方面,还是在其他需要处理大量音频文件的领域,Yate都是非常值得推荐的工具。 Yate for Mac功能特…