爬虫之数据解析
数据解析
数据解析这篇内容, 很多知识涉及到的都是以前学习过的内容了, 那这篇文章我们主要以实操为主, 来展开来讲解关于数据解析的内容。
360搜索图片
请求的url大家不需要再找了, 相信大家都会找请求了, 寻找请求从我的第一篇爬虫的博客开始到现在一直都在写,这边的话, 我已经给大家找好请求的url了, 请求的url是https://image.so.com/j?callback=jQuery1830016941744487520394_1728302031468&q=%E8%A1%A8%E6%83%85%E5%8C%85&qtag=&pd=1&pn=60&correct=%E8%A1%A8%E6%83%85%E5%8C%85&adstar=0&tab=all&sid=0ba46b6797934a87fe2a080f1319d622&ras=6&cn=0&gn=0&kn=26&crn=0&bxn=20&cuben=0&pornn=0&manun=50&src=360pic_strong&sn=106&ps=150&pc=150&_=1728302047538
import requests
import re
import json
import osurl = 'https://image.so.com/j?callback=jQuery1830016941744487520394_1728302031468&q=%E8%A1%A8%E6%83%85%E5%8C%85&qtag=&pd=1&pn=60&correct=%E8%A1%A8%E6%83%85%E5%8C%85&adstar=0&tab=all&sid=0ba46b6797934a87fe2a080f1319d622&ras=6&cn=0&gn=0&kn=26&crn=0&bxn=20&cuben=0&pornn=0&manun=50&src=360pic_strong&sn=106&ps=150&pc=150&_=1728302047538'
res = requests.get(url)
print(res.json())
结果:
报错了, 这个报错的原因很简单, 就是在最后一样的print(res.json())这里出的问题。
我们只需要把json()改为text即可, 因为后端数据返回的不完全是一个字典或列表, 所以只能用text.
修改后代码:
import requests
import re
import json
import osurl = 'https://image.so.com/j?callback=jQuery1830016941744487520394_1728302031468&q=%E8%A1%A8%E6%83%85%E5%8C%85&qtag=&pd=1&pn=60&correct=%E8%A1%A8%E6%83%85%E5%8C%85&adstar=0&tab=all&sid=0ba46b6797934a87fe2a080f1319d622&ras=6&cn=0&gn=0&kn=26&crn=0&bxn=20&cuben=0&pornn=0&manun=50&src=360pic_strong&sn=106&ps=150&pc=150&_=1728302047538'
res = requests.get(url)
print(res.text)
返回结果:
在最前面有个jQuery1830016941744487520394_1728302031468, 然后我们想要的数据是在小括号里面的那个字典。
那我们怎么去获取到小括号里面的数据呢?
如果大家看过我以前写过的博客的话,应该有印象, 就是之前有个实战题目里面也有类似于这种的情况, 上次那个实战内容就是爬取关于股票数据的内容。上次的解决办法是把url里面的callback=xxxx那一串去掉。
那今天我们这篇文章会讲解第二种方法, 不删除那串callback=xxxx也一样能够实现。
说明一下讲第二种方法的原因:
1.上次博客实战题里面用到的方法不一定都可行(有时候可行, 看运气), 并不是所有请求, 去掉那个参数就可以拿到自己想要的数据。
2.这里要讲的第二种方法, 就是解决提取我们想要的数据, 并且没有任何的运气成分, 这种办法可以解决一切有关于这一类的问题。
一、
字符串替换
import requests
import re
import json
import osurl = 'https://image.so.com/j?callback=jQuery1830016941744487520394_1728302031468&q=%E8%A1%A8%E6%83%85%E5%8C%85&qtag=&pd=1&pn=60&correct=%E8%A1%A8%E6%83%85%E5%8C%85&adstar=0&tab=all&sid=0ba46b6797934a87fe2a080f1319d622&ras=6&cn=0&gn=0&kn=26&crn=0&bxn=20&cuben=0&pornn=0&manun=50&src=360pic_strong&sn=106&ps=150&pc=150&_=1728302047538'
res = requests.get(url)
print(res.text)
res_data = res.text
t_str = res_data.replace("jQuery1830016941744487520394_1728302031468(", "").replace(")", "")
这种方法, 简单粗暴, 我们没有在请求的url里面删除callback参数, 而是用字符串的替换方法来对返回的数据进行处理。
但是这也有局限性, 原因很简单, 因为jQuery后面的那串数字会随时变化的, 当那些数字发生改变的时候, 那我们不得又再去把请求里面的这个jQueryxxxxxx这块地方再放到replace里面去替换么, 这样岂不是太麻烦了!!!
所以我们还有一钟办法, 就是用正则表达式去匹配我们想要的内容(正则表达式是python的基础内容, 如果对这方面还不熟悉的话, 需要去学习一下python编程基础部分)。
二、
正则表达式
import requests
import re
import json
import osurl = 'https://image.so.com/j?callback=jQuery1830016941744487520394_1728302031468&q=%E8%A1%A8%E6%83%85%E5%8C%85&qtag=&pd=1&pn=60&correct=%E8%A1%A8%E6%83%85%E5%8C%85&adstar=0&tab=all&sid=0ba46b6797934a87fe2a080f1319d622&ras=6&cn=0&gn=0&kn=26&crn=0&bxn=20&cuben=0&pornn=0&manun=50&src=360pic_strong&sn=106&ps=150&pc=150&_=1728302047538'
res = requests.get(url)
print(res.text)
res_data = res.text
t_str = re.findall('jQuery\d+_\d+\((.*?)\);',res_data)[0] #获取到的数据 {xxx}
我们想要获取到小括号里面的那个字典, 在正则表达式里面, 我们只需要输入.*?即可。
json字符串和对象数据互转方法:
json字符串->对象数据: loads方法
对象数据->json字符串: dumps方法
爬取360里面的图片完整代码:
那在我们这个爬取360里面的图片的这个案例中, 我们看一看是怎么实现的
url = 'https://image.so.com/j?callback=jQuery1830016941744487520394_1728302031468&q=%E8%A1%A8%E6%83%85%E5%8C%85&qtag=&pd=1&pn=60&correct=%E8%A1%A8%E6%83%85%E5%8C%85&adstar=0&tab=all&sid=0ba46b6797934a87fe2a080f1319d622&ras=6&cn=0&gn=0&kn=26&crn=0&bxn=20&cuben=0&pornn=0&manun=50&src=360pic_strong&sn=106&ps=150&pc=150&_=1728302047538'import requests
import re
import json
import os
res = requests.get(url)# print(res.json())
res_data = res.text
print(res_data)
# 如果以后看到这种响应数据, 可以尝试去除参数中的callback,如果没法去掉,如何解决?
# jQuery1830016941744487520394_1728302031468({});
# 1- 字符串替换
# 2- 正则提取
t_str = re.findall('jQuery\d+_\d+\((.*?)\);',res_data)[0] #{xxx}
# print(type(t_str))
# print(t_str)
# 通过正则提取,提取到的数据是一个规范的数据,但是是个字符串类型,不好循环取值
# 如果是个字典, 那就很方便了
# 字符串 转为 字典?
# json字符串 转为 字典?t_dict = json.loads(t_str)
# print(t_dict,type(t_dict))d_path = '360图片'
# 如果能找到,则为True,反之则False
if not os.path.exists(d_path):# 创建os.mkdir(d_path)
count = 0
p = 0
for i in t_dict['list']:print(p)p+=1# 图片的urlimg_url = i['_thumb']# 对img_url发起请求img_res = requests.get(img_url)
# 保存图片 (保存图片数据)
# 文件名必须要变,如果不变,最后只会生成一张图片
# 获取图片的名字name = i['title']# 判断名字中是否包含/# if '/' in name :# # 则替换 替换到重新赋值,字符串是不可变# name = name.replace('/','')# 如果图片是静图,后缀名可以是jpg或者png# 如果图片是动图,后缀名可以是gifsuffix = img_url.split('.')[-1]# 新发型小熊猫表情包.jpg# 如果路径为f'{name}.{suffix}' 那么会把所有的图片文件创建在当前python文件对应的文件夹中# 如果路径为f'360图片/{name}.{suffix}' 360图片文件夹必须要先提前创建# 创建的方式:1-手动自己创建 2-代码创建# try:with open(f'{d_path}/{count}.{suffix}', 'wb')as f:f.write(img_res.content)print(f'{img_url}{name}{count}已经下载完毕~')count += 1# except Exception as e:# print(e)# # 如果图片的原本名字出现特殊符号导致保存失败# # 处理异常,名字改为数字# with open(f'{d_path}/{count}.{suffix}', 'wb')as f:# f.write(img_res.content)# count+=1# print(f'{img_url}{count}已经下载完毕~')
解释代码:
t_dict = json.loads(t_str)这句话是将json字符串转换为字典。
os库, 这个库是用于与操作系统进行交互。if not os.path.exists(d_path)这句话在判断是否有这么个文件夹(目录), 如果没有就创建, exists的返回值取决于该文件夹(目录)是否存在, 存在为true, 不存在为false。
对img_url发起请求: img_res = requests.get(img_url), 获取图片的名字: name = i[‘title’], 文件名后缀: suffix = img_url.split(‘.’)[-1]。
最后下载图片并保存:
with open(f'{d_path}/{count}.{suffix}', 'wb')as f:f.write(img_res.content)print(f'{img_url}{name}{count}已经下载完毕~')count += 1
结果:
再打开图片看看:
360搜索图片, 然后爬取图片成功!!!
实战:
爬取百度图片
百度搜索任意主题图片进行下载
先自己尝试做一做哦, 不要马上看答案哦!!!
还有, url请求是根据你在搜索框里面搜索的内容给你跳出来的网页图片来决定的, 每个人爬取的内容不一样, 那每个人的请求url就会不一样, 请求url自己去寻找。
参考答案:
import requests
import osdef download_pic(i, url):res = requests.get(url)if not os.path.exists("picture"):os.mkdir("picture")with open('picture/beautiful_girl'+str(i)+'.jpg', 'wb') as f:f.write(res.content)print('The picture is already fetched about beautiful_girl'+str(i)+'.jpg')url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8411016515474874704&ipn=rj&ct=201326592&is=&fp=result&fr=&word=%E7%BE%8E%E5%A5%B3&cg=girl&queryWord=%E7%BE%8E%E5%A5%B3&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=0&ic=0&hd=0&latest=0©right=0&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn=0&rn=30"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36","referer": "https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=0&hd=0&latest=0©right=0&se=&showtab=0&fb=0&width=&height=&face=0&istype=2&dyTabStr=MCwzLDEsMiwxMyw3LDYsNSwxMiw5&ie=utf-8&ctd=&sid=&word=%E7%BE%8E%E5%A5%B3"
}
response = requests.get(url, headers=headers)
# print(response.json())
res_data = response.json()
c = 1
for i in res_data['data']:if i != {}:print(i['thumbURL'])download_pic(c, i['thumbURL'])c += 1
结果:
这道实战题, 你写出来了吗? 如果写出来的话, 给自己鼓掌哦👏
以上就是爬虫数据解析的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!
相关文章:

爬虫之数据解析
数据解析 数据解析这篇内容, 很多知识涉及到的都是以前学习过的内容了, 那这篇文章我们主要以实操为主, 来展开来讲解关于数据解析的内容。 360搜索图片 请求的url大家不需要再找了, 相信大家都会找请求了, 寻找请求从我的第一篇爬虫的博客开始到现在一直都在写,这边的话, 我已…...
本地缓存少更改、小数据、低一致表的思考
对于那些少更改、小数据的表,以及对一致性要求不高的业务,其实完全可以通过本地缓存将表数据缓存到本地内存中,然后通过定时机制拉取表更新数据 直接从内存中获取数据,将会使得查询性能得到巨大的提升,并且由于更改少…...
redis 使用
打开redis 前台启动 同路径下打开redis-server 出现窗口,即启动成功 此时关闭窗口,redis关闭; 不管有没有使用密码,或者使用了什么密码,都能连上 如果使用下文提到的redis cli增加密码,就只能使用你设置的…...

使用 Pake 一键打包网页为桌面应用 / 客户端
项目 项目:https://github.com/tw93/Pake/ 免费ICO图片:https://icon-icons.com/zh/ 设置环境 以下教程仅针对windows系统适用 请确保您的 Node.js 版本为 18 或更高版本 文档:https://v1.tauri.app/zh-cn/v1/guides/getting-started/prerequ…...

vue.js【常用UI组件库】
Element Plus组件库 Element Plus是基于Vue 3开发的优秀的PC端开源UI组件库,它是Element的升级版,对于习惯使用Element的人员来说,在学习Element Plus时,不用花费太多的时间。因为Vue 3不再支持IE 11,所以Element Plu…...

基于vue框架的的地铁站智慧管理系统的设计n09jb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:用户,上班打卡,下班打卡,人员管理,交接班,视频巡检,车辆巡检,车辆管理 开题报告内容 基于Vue框架的地铁站智慧管理系统的设计开题报告 一、研究背景与意义 随着城市化进程的加速,地铁站作为城市交通系统的重要组成部分&am…...
《南京师大学报(自然科学版)》
《南京师大学报(自然科学版)》刊载内容主要包括:数学;物理学;化学;地理学;海洋科学;生物学;生态学;力学;电子科学与技术;计算机科学与…...

考研读研生存指南,注意事项
本视频课程,涉及考研读研的方方面面,从考研初试→复试面试→研究生生活→导师相处→论文专利写作混毕业,应有尽有。有了他,你的研究生生涯稳了。 读研考研注意事项,研究生生存指南。_哔哩哔哩_bilibili 一、考研初试注…...

爬虫结合项目实战
由于本人是大数据专业,所以准备的是使用pycharm工具进行爬虫爬取数据,然后实现一个可视化大屏 参考项目: 1.医院大数据可视化最后展示 2. 大数据分析可视化系统展示 代码包:...

【Next.js 项目实战系列】07-分配 Issue 给用户
原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】06-身份验证 分配 Issue 给用户 本节代码链接 Select Button # /app/issues/[i…...

Web,RESTful API 在微服务中的作用是什么?
大家好,我是锋哥。今天分享关于【Web,RESTful API 在微服务中的作用是什么?】面试题?希望对大家有帮助; Web,RESTful API 在微服务中的作用是什么? 在微服务架构中,Web 和 RESTful …...
Ajax:跨域、防抖和节流、HTTP协议
在善意的“双向奔赴”中,每个普通人都如星辰,微小但释放着自己的光芒,交织成灿烂的星河 文章目录 跨域防抖和节流HTTP协议HTP状态码以及代表意义错误代码的影响移动的小天使 跨域 同源策略 概念:协议,域名,…...

数据结构(8.2_2)—希尔排序
希尔排序的定义: 第一趟:先将在排序表中根据增量di分别将数组元素分别插入各个子表 ,在进行排序 代码实现: 算法性能分析 稳定性:不稳定! 适用性:仅适用于顺序表,不适用于链表 总…...

Netty笔记
本笔记是看了黑马的Netty进行总结的。想要更详细的可以去看视频 学习netty之前要先打好NIO的基础,可以先去看我的另一篇文章 一、概述 不想看的可以直接跳过 Netty 的地位 Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位…...

管道燃气监管系统
一、建设目标 建立一个高效、智能、安全的管道燃气监管系统,实现对管道燃气的实时监测、风险预警、事故应急处理和数据分析,确保燃气供应的安全稳定,提高燃气管理的效率和水平。 二、系统架构 感知层 安装压力传感器、流量传感器、温度传感…...

Python语法结构(三)(Python Syntax Structure III)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...
08_Linux文件查找技巧:locate、find 和 grep 命令详解
系列文章导航:01_Linux基础操作CentOS7学习笔记-CSDN博客 文章目录 1. locate命令2. grep命令3. find命令 在Linux系统中,文件查找是一项常见的任务。本文将详细介绍三种强大的文件查找命令:locate、find 和 grep,以及它们的使用…...
JAVA 实验六
一: (1) 运行以上尟序并尣以上尟序尜尢一行尥码添加注解,将尟序保存尣e601.java (2) 以上尟序尣类变量是哪一个变量,类尠尞是哪一个尠尞,请找出类变量和类尠尞被使用尜语…...

电脑查不到IP地址是什么原因?怎么解决
在日常使用电脑的过程中,有时会遇到无法查询到电脑IP地址的情况,这可能会影响到网络的正常使用。本文将探讨电脑查不到IP地址的可能原因,并提供相应的解决方案。 一、原因分析 网络连接问题:首先,网络连接不稳定或…...

Axure重要元件三——中继器修改数据
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器修改数据 主要内容:显示编辑内容、表格赋值、修改数据 应用场景:更新行、表单数据行修改 案例展示: 正文…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...