当前位置: 首页 > article >正文

爬虫笔记22——当当网图书详情页静、动态数据爬取

当当网动态数据爬取

  • 静态数据爬取
  • 动态数据爬取
  • 接口参数的获取

静态数据爬取

在这里插入图片描述
进入图书详情,这里的图书数据信息比如标题、价格、图片都是非结构化数据,可以使用xpath语法提取。是很简单的数据采集了,就不细说了。

动态数据爬取

在这里插入图片描述
滑到下面这里的数据,像大图,内容简介等这些,我们通过详情页静态页面数据是找不到对应的数据内容的,而且通过全局搜索我们也找不到对应的内容。这就不好办了。但是作为动态加载的数据,那肯定在返回的接口数据中可以找到对应的内容。

现在我们只能通过一个一个接口看了,不过看接口也是有技巧的,比如这里他有这么长的大图数据,说明这个接口数据的大小不会很小,应该是数据比较大的。
在这里插入图片描述

最终发现是倒数第二个接口数据返回的内容,里面就有我们要的内容。

在这里插入图片描述

说是动态数据,其实返回回来的接口数据也是一个html文本内容。最后我们提取也是可以用xpath语法提取,或者习惯哪种方法就哪种方法提取。

在这里插入图片描述

接口参数的获取

那么这个接口的参数需要传递什么?还有要如何获取这些参数呢?这不同的图书总有各自对应的参数吧。

在这里插入图片描述

经过测试发现,主要这四个参数是变换的,这四个参数在图书详情页静态页面数据里可以找到,这里就可以通过全局搜索找到,我也是通过全局搜索搜到的。

在这里插入图片描述

但是要提取出来就发现这个数据是在js语法里面

在这里插入图片描述

用xpath提取不了,只能通过正则语法把这个参数数据提取出来,直接看代码吧

try:
	# 先获取详情页数据
    res = requests.get(url, headers=headers, cookies=cookies)
    # print(res.status_code)
except requests.exceptions.ProxyError as e:
    print(f"Proxy error: {e}")
# print(res.text)
book_detail_html = etree.HTML(res.text)
# print(re.findall(r'var prodSpuInfo = (.*);', res.text))
playload = json.loads(re.findall(r'var prodSpuInfo = (.*);', res.text)[0])
# print(playload)
# 在这里获取通过playload载荷请求接口
params = {
    'r': 'callback/detail',
    'productId': playload['productId'],
    'templateType': 'publish',
    'describeMap': playload['describeMap'],
    'shopId': playload['shopId'],
    'categoryPath': playload['categoryPath'],
}
# 这个作为接口参数
try:
	detail_res = requests.get('https://product.dangdang.com/index.php', params=params, cookies=cookies,
	                       headers=headers)
except requests.exceptions.ProxyError as e:
 	print(f"Proxy error: {e}")

上面就是获取动态数据的所有内容。点个赞吧,大佬!


http://www.kler.cn/a/373936.html

相关文章:

  • 全国计算机等级考试二级
  • Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS
  • 超详细的flex教程(面试必考)
  • 计算机毕业设计——ssm-基于SSM框架的校园爱心公益平台的设计与实现-演示录像2021
  • 107. 阴影范围.shadow.camera
  • STM32F103C8T6 IO 操作
  • leetcode day7 442
  • 6. 线程池实现
  • 如何安装和使用PowerDesigner
  • TDengine 数据订阅 vs. InfluxDB 数据订阅:谁更胜一筹?
  • ETLCloud遇上MongoDB:灵活数据流,轻松管理
  • 四、k8s快速入门之Kubernetes资源清单
  • 忘记无线网络密码的几种解决办法
  • 【GO学习笔记 go基础】编译器下载安装+Go设置代理加速+项目调试+基础语法+go.mod项目配置+接口(interface)
  • vue中el-table显示文本过长提示
  • 函数的调用
  • vue2和vue3的数据双向绑定差异整理
  • PPT制作新选择:本地部署PPTist结合内网穿透实现实时协作和远程使用
  • 【java batik_使用BATIK解析SVG生成PNG图片】
  • 数字普惠金融-工具变量(2024.2更新)
  • ubuntu 给终端设置代理
  • web文件包含include
  • 变压器漏感对整流电路的影响【电力电子技术3章】
  • 【jvm】空间分配担保策略
  • Rust 力扣 - 643. 子数组最大平均数 I
  • kafka中MirrorMaker1和MirrorMaker2的区别