爬虫之数据解析
数据解析
数据解析这篇内容, 很多知识涉及到的都是以前学习过的内容了, 那这篇文章我们主要以实操为主, 来展开来讲解关于数据解析的内容。
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重要元件三——中继器修改数据
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器修改数据 主要内容:显示编辑内容、表格赋值、修改数据 应用场景:更新行、表单数据行修改 案例展示: 正文…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...

五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...