爬虫之数据解析

数据解析

数据解析这篇内容, 很多知识涉及到的都是以前学习过的内容了, 那这篇文章我们主要以实操为主, 来展开来讲解关于数据解析的内容。

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}已经下载完毕~')

解释代码:

  1. t_dict = json.loads(t_str)这句话是将json字符串转换为字典。

  2. os库, 这个库是用于与操作系统进行交互。if not os.path.exists(d_path)这句话在判断是否有这么个文件夹(目录), 如果没有就创建, exists的返回值取决于该文件夹(目录)是否存在, 存在为true, 不存在为false。

  3. 对img_url发起请求: img_res = requests.get(img_url), 获取图片的名字: name = i[‘title’], 文件名后缀: suffix = img_url.split(‘.’)[-1]。

  4. 最后下载图片并保存:

     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&copyright=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&copyright=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

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这道实战题, 你写出来了吗? 如果写出来的话, 给自己鼓掌哦👏

以上就是爬虫数据解析的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

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

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

相关文章

CSS 图标和文本对齐

比如下面一段HTML代码&#xff0c;我们想在图标旁边显示文本或者数字 <body> <div><img src"smile.svg" alt"smile"><span>12</span></div> <div><img src"heartShape.svg" alt"…

光伏仿真系统在光伏项目开发中有哪些应用场景?

光伏仿真系统在光伏项目开发中的应用场景广泛&#xff0c;涵盖了从项目规划、设计优化到运维管理的全过程。 一、项目规划与选址 1、气象模拟与评估 光伏仿真系统能够基于历史气象数据和先进的预测模型&#xff0c;模拟不同地理位置、不同季节和时间段的光照强度、温度、湿度…

Fomality基础知识

formal主要用于等价性检查&#xff0c;检查步骤如下&#xff1a; 1.Read design 2.Set up 3.Matching&#xff1a;Map corresponding signals between pairs of designs 4.Verification&#xff1a;Compare the logic cones that drive the mapped signals 二&#xff1a;…

Hadoop生态圈三大组件:HDFS的读写流程、MapReduce计算流程、Yarn资源调度

文章目录 1. HDFS的读写流程1.1 HDFS读流程1.2 HDFS写流程 2. MapReduce计算流程3. Yarn资源调度一、客户端请求资源二、Resource Manager处理请求三、任务资源计算与申请四、Resource Manager分配资源五、Node Manager执行任务六、任务执行与监控 1. HDFS的读写流程 1.1 HDFS…

UTF8编码的PowerShell脚本中文乱码的解决方法

1.问题现象 使用VSCode(已安装Code Runner扩展)编写含有中文字符串的ps1脚本之后运行收到各种错误 例如&#xff1a;字符串缺少终止符: "。&#xff1b;表达式或语句中包含意外的标记“}”。&#xff1b;语句块或类型定义中缺少右“}”。 使用快捷键CtrlAltN触发Run Cod…

YOLO11 实例分割 | 导出ONNX模型 | ONNX模型推理

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行实例分割任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 备注&#xff1a;本文是使用Python&#xff0c;编写ONNX模型推理代码的 目…

HDMI Type B 连接器的引脚分配与接口尺寸

连接器引脚分配 B 型连接器引脚分配&#xff1a; 连接器接触顺序 连接器接口尺寸 B 型插座接口尺寸&#xff1a; B 型插头接口尺寸&#xff1a; B 型插座与插头配合状态&#xff1a; 微信公众号&#xff1a;

CreateEvent 事件对象可以用来在线程之间同步操作 信号事件

CreateEvent 是一个 Windows API 函数&#xff0c;用于创建或打开一个事件对象&#xff0c;事件对象可以用来在线程之间同步操作。该函数的签名如下&#xff1a; HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性&#xff0c;可以为 NULLBOOL bManu…

使用XML实现MyBatis的基础操作

目录 前言 1.准备工作 1.1⽂件配置 1.2添加 mapper 接⼝ 2.增删改查操作 2.1增(Insert) 2.2删(Delete) 2.3改(Update) 2.4查(Select) 前言 接下来我们会使用的数据表如下&#xff1a; 对应的实体类为&#xff1a;UserInfo 所有的准备工作都在如下文章。 MyBatis 操作…

React国际化中英文切换实现

目录 概况 安装 文件结构 引入 使用 正常使用 传参使用 概况 react-intl-universal 是一个国际化库&#xff0c;专门为 React 应用提供多语言支持。与 React 原生的 react-intl 相比&#xff0c;react-intl-universal 支持从远程服务器加载语言包&#xff0c;动态切换语…

MySQL数据的导入

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

简单使用webpack

下载依赖&#xff1a;npm install webpack webpack-cli --save-dev新建一个目录app。加入html&#xff1a; <html><head><meta charset"utf-8"></head><body><script type"text/javascript" src"./dist/main.js&quo…

05 django管理系统 - 部门管理 - 修改部门

04我们已经实现了新增部门的功能&#xff0c;下面开始修改部门模块的实现。 按道理来说&#xff0c;应该是做成弹框样式的&#xff0c;通过ajax悄咪咪的发数据&#xff0c;然后更新前端数据&#xff0c;但是考虑到实际情况&#xff0c;先用页面跳转的方式实现&#xff0c;后面…

c到c++衔接速成

温馨提示&#xff1a;本篇文章乃博主多次学习后的总结&#xff0c;其中一些专业名词的概念不会做介绍&#xff0c;本篇文章只解决实操问题 c到c中&#xff0c;语法上得到了许多升级&#xff0c;那么哪些地方升级了&#xff0c;我们来快速复习一下 目录 头文件的升级 命名空间…

Android基于gradle task检查各个module之间资源文件冲突情况

做组件化开发的时候&#xff0c;我们经常会遇到各个不同的module之间资源文件冲突的问题&#xff0c;运行也不报错&#xff0c;但是会出现覆盖的问题&#xff0c;导致运行之后发送错误的效果。 所以我们需要利用一个gradlke 脚本task&#xff0c;来自动化检查资源文件冲突。 …

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

IRP读写函数

驱动代码&#xff1a; #include <ntddk.h>#define DEVICE_NAME L"\\device\\MyDricer1" //设备对象名称 #define LINK_NAME L"\\dosdevices\\Goose" //符号链接名称VOID UnDirver(PDRIVER_OBJECT pDriverObj) {UNICODE_STRING uLinkName RTL_CONST…

04_实现调度执行

什么是可调度&#xff1f;所谓可调度&#xff0c;指的是当 trigger 动作触发副作用函数重新执行的时候&#xff0c;有能力决定副作用函数执行的时机、次数以及方式 副作用函数执行方式 示例代码&#xff1a; const obj { a: 1 } const objProxy new Proxy(obj, /* ... */)…

02.顺序表、链表简述+对比

目录 一、线性表 二、顺序表 三、链表 四、顺序表和链表的区别 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列&#xff08;相同特性指都为整型int、字符型char或其它类型&#xff09;。 线性表是一种在实际中广泛使用的数据…

雷池社区版配置遇到问题不要慌,查看本文解决

很多新人不太熟悉反向代理&#xff0c;所以导致配置站点出现问题 配置问题 记录常见的配置问题 配置后攻击测试没有拦截记录 检查访问请求有没有真实经过雷池 有很多新人配置站点后&#xff0c;真实的网站流量还是走的源站&#xff0c;导致雷池这边什么数据都没有 配置后…