爬取QQ音乐的评论-JSON库的详细使用

227 阅读7分钟

@TOC

前言

本文分享一个分享一个爬取音乐的评论的案例,来讲解下JSON的使用。

导航

JSON的介绍

JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。python 的 json库提供了一套强大的工具来处理 JSON 数据,包括编码(序列化)和解码(反序列化)功能,以及从文件和字符串中读取和写入 JSON 数据的能力。Python 的 json 库可以在 Python 对象(如字典和列表)和 JSON 格式的字符串之间进行转换。

我们在爬取数据的时候,很多时候数据并不在源码当中,很多都是通过js中的fetch 和 XMLHttpRequest (XHR) 发起 HTTP 请求的 API来进行异步加载数据,他们大部分都是JSON格式的数据。下面这个图是某某音乐的某首歌曲的评论异步加载的JSON数据,我们获取特定的数据需要从中提取。

690c1023d7bb80395e7c71aa920b3e5.png 在这里先讲一下python的序列化和反序列化 序列化:将 python 对象转换为字符串或其他格式(如字节流),以便可以存储到文件中或通过网络传输。在 python 中,json.dumps() 函数用于将 python 对象序列化为 json字符串。 反序列化:反序列化是将序列化的数据(如 json 字符串)转换回 python 对象的过程。在 python 中,json.loads() 函数用于将 json 字符串反序列化为 python 对象。

常用函数

常见函数解释
json.dumps()将 python 对象(如字典、列表、字符串、数字、布尔值等)序列化为 JSON 格式的字符串
json.loads()将 JSON 格式的字符串反序列化为 python 对象(如字典或列表)。
json.load()从文件中读取 JSON 数据并反序列化为 python 对象
json.dump()将 python 对象序列化为 JSON 数据并写入文件。

下面是这些函数的应用

import json
import re
# json.dumps()的应用:pyton对象序列化为json字符串
data = {
    "name":"zhangsan",
    "age":18,
    "address":"Beijing",
    "phrase":"Just do it"
}
print(type(data))
# 获取对象(字典)中值的一种方法是通过get方法获取,另外一种是通过键来获取。
print(f"{data['phrase']}  {data.get('phrase')}")
data=json.dumps(data)
print(type(data))
print(data)
"""
输出:
<class 'dict'>
Just do it  Just do it
<class 'str'>
{"name": "zhangsan", "age": 18, "address": "Beijing", "phrase": "Just do it"}
"""

# json.loads()函数的使用:json字符串反序列化为python对象
data = '{"name":"zhangsan","age":18,"address":"Beijing","phrase":"Just do it"}'
res=json.loads(data)
print(res)
# 输出:{'name': 'zhangsan', 'age': 18, 'address': 'Beijing', 'phrase': 'Just do it'}

# json.load()函数的使用:从文件中读取json数据并将反序列化为Python对象
with open("data.json","r") as f:
    data=json.load(f)

# json.dump()函数的使用:将Python对象序列化为json格式的字符串,并写入到文件对象中
data = {"name":"zhangsan","age":18,"address":"Beijing","phrase":"Just do it"}
with open("data.json","w") as f:
    json.dump(data,f)


案例源码

import  requests # 数据请求库
import json  # JSON库
import pprint

url='https://u6.y.qq.com/cgi-bin/musics.fcg'

# 请求头
headers={
    'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',
}
# 会话标识Cookie
cookies={"cookie":"_qpsvr_localtk=0.13579467088812902; RK=qKe9i7NH7e; ptcz=62b7cb434649eb786afa19fe2dbd583ffebc6d18212b3e04ca392d42aedc3f4f; ETCI=e56cb4650ac64108a87e4acf16bd3107; msecToken=f8c4227bc8bf051f3d737b86d675b22b; _qimei_uuid42=1891d002e191006649ccaf1f51ae117bd778fd9ca1; pac_uid=0_A6DSZRJ1GQRSs; _qimei_fingerprint=95f2638e6c4f46e8ca34e527b7df81c9; _qimei_q36=; _qimei_h38=2db8667f49ccaf1f51ae117b0200000271891d; suid=user_0_A6DSZRJ1GQRSs; skey=null; luin=null; lskey=null; user_id=null; session_id=null; pgv_info=ssid=s9370923272; pgv_pvid=3211414884; fqm_pvqid=8b564295-aa67-4148-ac49-27dab3de0220; fqm_sessionid=f0312c20-b9d7-41a6-bf32-c9866f1bcfcf; ts_uid=32067322; _clck=3937507372|1|fr6|0; ts_refer=www.bing.com/; login_type=1; psrf_qqunionid=36D68B17B8E59C68354980F84F6FBB9B; psrf_qqrefresh_token=222BC08F17A92AE47A2A4DB2EBA22935; qm_keyst=Q_H_L_63k3N3IfTelRU-jv6SQ-2w8zN2YLzpXAqL8kVo4sNHWffJcM0dTiHInj9Ayf2VyliX86VTwPCpctW8w_Sx4LddqTRLys; euin=owCFoeci7Ko5oc**; psrf_access_token_expiresAt=1733581421; psrf_musickey_createtime=1732976621; psrf_qqopenid=15C6B475DABC764F28A2786012E792EC; tmeLoginType=2; uin=2680835312; psrf_qqaccess_token=FB433CBBA95D3D850647EAFFF49A5D9E; music_ignore_pskey=202306271436Hn@vBj; wxopenid=; wxunionid=; qqmusic_key=Q_H_L_63k3N3IfTelRU-jv6SQ-2w8zN2YLzpXAqL8kVo4sNHWffJcM0dTiHInj9Ayf2VyliX86VTwPCpctW8w_Sx4LddqTRLys; wxrefresh_token=; ts_last=y.qq.com/n/ryqq/songDetail/003XT6Ef4H6X66"
}
# 查询参数
params = {
    '_': '1732976668667',
    'sign': 'zzc447e749fbpp4okgcb3p7tfuewc4xbqkoy7d94955c',
}
#  请求体:这里的data数据包含了个人信息,各位使用自己的data
data = '{"xxxxx“}'

response=requests.post(url=url,headers=headers,params=params,data=data,cookies=cookies)

# 这里获取的是json数据,需要反序列化为python对象,也可直接使用response.json()来获取
res=response.text
res=json.loads(res)
# res=response.json()
# 可以利用pprint库来打印格式化后的的数据,便于观察
pprint.pprint(res)

# 观察数据格式
for req in res.get("req_4").get('data').get('CommentList').get('Comments'):
    print(f"网名:{req.get('Nick')}  评论:{req.get('Content')} 地址:{req.get('Location')}  头像地址:{req.get('Avatar')}   ")

使用pprint库打印后的数据如下

bb3ddcbfe56f4e39c9ecce0efea017f.png

运行截图

7e49050a95774cb4781852a41250246.png

共勉

知不足而奋进,望远山而前行

博客

  • 本人是一个渗透爱好者,不时会在微信公众号(laity的渗透测试之路)更新一些实战渗透的实战案例,感兴趣的同学可以关注一下,大家一起进步。
  • 之前在公众号发布了一个kali破解WiFi的文章,感兴趣的同学可以去看一下,在b站(up主:laity1717)也发布了相应的教学视频