Python实现爬取网页中动态加载的数据


Posted in Python onAugust 17, 2020

在使用python爬虫技术采集数据信息时,经常会遇到在返回的网页信息中,无法抓取动态加载的可用数据。例如,获取某网页中,商品价格时就会出现此类现象。如下图所示。本文将实现爬取网页中类似的动态加载的数据。

Python实现爬取网页中动态加载的数据

1. 那么什么是动态加载的数据?

我们通过requests模块进行数据爬取无法每次都是可见即可得,有些数据是通过非浏览器地址栏中的url请求得到的。而是通过其他请求请求到的数据,那么这些通过其他请求请求到的数据就是动态加载的数据。(猜测有可能是js代码当咱们访问此页面时就会发送得get请求,到其他url中获取数据)

2. 如何检测网页中是否存在动态加载得数据?

在当前页面中打开抓包工具,捕获到地址栏中的url对应的数据包,在该数据包的response选项卡搜索我们想要爬取的数据,如果搜索到了结果则表示数据不是动态加载的,否则表示数据为动态加载的。如图所示:

Python实现爬取网页中动态加载的数据

或者鼠标右键单击要爬取的页面显示网页源代码搜索我们想要爬取的数据,如果搜索到了结果则表示数据不是动态加载的,否则表示数据为动态加载的。如图所示:

Python实现爬取网页中动态加载的数据

3. 如果数据为动态加载,那么我们如何捕获到动态加载的数据?

在实现爬取动态加载的数据信息时,首先需要在浏览器的网络监视器中根据动态加载的技术选择网络请求的类型,然后通过逐个筛选的方式查询预览信息中的关键数据,并获取对应的请求地址,最后进行信息的解析工作即可。具体步骤如下:

在浏览器中快捷键F12打开开发者工具,然后选择Network(网络监视器)并在网络类型中选择JS,再按快捷键F5刷新,如下图所示。

Python实现爬取网页中动态加载的数据

在请求信息的列表中,依次单击每个请求信息,然后在对应的Preview(请求结果预览)中核对是否为需要获取的动态加载数据,如下图所示。

Python实现爬取网页中动态加载的数据

动态加载的数据信息核对完成后,单击Headers获取当前的网络请求地址以及所需参数,如下图所示。

Python实现爬取网页中动态加载的数据

根据以上步骤获取到的请求地址,发送网络请求并从返回的信息中提取商品价格信息。笔者在代码中使用到了反序列化,关于json序列化和反序列化可以点击 此处 进行学习,代码如下:

import requests
import json

# 获取商品价格的请求地址
url = "https://c0.3.cn/stock?skuId=12464037&cat=1713,3259,3333&venderId=1000077923&area" \
  "=4_113_9786_0&buyNum=1&choseSuitSkuIds=&extraParam={%22originid%22:%221%22}&ch=1&fqsp=0&" \
  "pduid=1573698619147398205303&pdpin=jd_635f3b795bb1c&coord=&detailedAdd=&callback=jQuery6495921"
jQuery_id = url.split("=")[-1] + "("
# 头部信息
headers = {
 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) "
     "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
}
# 发送网络请求
response = requests.get(url, headers=headers)
if response.status_code == 200:
 goods_dict = json.loads(response.text.replace(jQuery_id, "")[:-1]) # 反序列化
 print(f"当前售价为: {goods_dict['stock']['jdPrice']['op']}")
 print(f"定价为: {goods_dict['stock']['jdPrice']['m']}")
 print(f"会员价为: {goods_dict['stock']['jdPrice']['tpp']}")
else:
 print("请求失败!")

笔者在写博文的时候,价格发生了变化,运行结果如下图所示:

Python实现爬取网页中动态加载的数据

注意:爬取动态加载数据信息时,需要根据不同的网页使用不同的方式进行数据的提取。如果在运行源码时出现了错误,请根据操作步骤获取新的请求地址即可。

到此这篇关于Python实现爬取网页中动态加载的数据的文章就介绍到这了,更多相关Python 爬取网页动态数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
Python 错误和异常代码详解
Jan 29 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
Django Rest framework之认证的实现代码
Dec 17 Python
python scipy卷积运算的实现方法
Sep 16 Python
Django 自动生成api接口文档教程
Nov 19 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
浅谈python出错时traceback的解读
Jul 15 Python
Python 如何操作 SQLite 数据库
Aug 17 #Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 #Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 #Python
Python 程序员必须掌握的日志记录
Aug 17 #Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 #Python
Python 如何查找特定类型文件
Aug 17 #Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 #Python
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
收音机术语解释
2021/03/01 无线电
说明的比较细的php 正则学习实例
2008/07/30 PHP
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
医药个人求职信范文
2014/01/29 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
岳麓书院导游词
2015/02/03 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书