【Python】json数据解析

目录

json文件数据解析

爬虫获取王者荣耀英雄信息json数据包并解析

爬虫获取抖音视频json数据包并解析


json文件数据解析

json字符串:通常类似python数据类型中的列表和字典的结合,也可能是单独的列表或者字典格式,通常可以通过json模块的函数接口转换为python数据类型,也可将python中的数据类型转换成json字符串

json文件:后端通常将数据库的文件统一以json文件的格式传给前端,而前端在对json文件数据进行加工渲染,展示在前端页面。

很多时候,我们使用爬虫从前端页面获取的数据因为经过了加工渲染而并不完整,所以我们有时候需要通过获取后端的json文件数据包来获取数据

爬虫获取王者荣耀英雄信息json数据包并解析

注:本代码仅供爬虫技术学习使用,无任何商业目的

【Python】爬虫数据提取_种花家de小红帽的博客-CSDN博客

上一篇文章中的王者荣耀英雄皮肤图片获取的途径是从前端代码中的url获取,一共只有93个英雄,获取得到的数据并不完整,而这次我们可以通过网络数据包中的json文件获取数据信息,再通过爬虫下载,一共有114个英雄,是游戏目前的全部英雄

找到网络数据包中的存放英雄信息的json文件数据包,

在请求头中拿到json文件的url链接,然后下载得到json文件数据包

下载王者荣耀全英雄皮肤图片代码:

import requests
import json
import os

url = "https://pvp.qq.com/web201605/js/herolist.json"
response = requests.get(url)    # 请求得到json包数据
# print(response.text)

# 此处的json文件格式是列表里面包含字典元素
heroList = json.loads(response.text)
# print(len(heroList))        # 114

for i in heroList:
    id = i['ename']
    name = i['cname']
    print(id, name)

    os.makedirs(f"./imag/{name}")   # 给每个英雄的皮肤单独创建目录

    # 找到英雄皮肤图片的url链接,对比观察寻找规律
    cnt = 1
    while True:
        try:
            url = f"https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{id}/{id}-bigskin-{cnt}.jpg"
            response = requests.get(url)
            if response.status_code != 200:
                break
            with open(f"./imag/{name}/skin-{cnt}.jpg", "wb") as f:
                f.write(response.content)
                cnt += 1
        except:
            print(Exception)
            break

爬虫获取抖音视频json数据包并解析

注:本代码仅供爬虫技术学习使用,无任何商业目的

示例:千万粉丝运动教练刘畊宏主页视频

1. 首先打开抖音网页,搜索刘畊宏,进入刘教练的视频主页,选择检查

想要爬取视频,有多种方式,可以通过you-get直接通过视频的网页链接进行下载,但是you-get在面对抖音的反爬机制的时候很多时候会失效,这时我们就要找到视频文件的数据包,直接通过网络请求获取视频文件

2. 在PC端选择网页,并刷新,查看网络数据包,寻找存放有视频的数据包,包名并没有统一的格式,需要逐一查找,这是一个依靠运气和经验的过程,也有可能根本找不到视频数据包

观察response(响应)里面的信息,一般视频文件前面都有“video”标签,而图片文件的链接会以p开头或者标签为img或p,这并不绝对,需要依靠经验判断

3. 通过在PC端的数据包查找,我并没有找到存放视频文件的数据包,于是我们可以查找移动端的数据包,有可能能够找到,当然在移动端页面进行查找的前提是这个网页有移动端软

将抓包工具切换为移动端模式后,按ctrl F 刷新,会发现主页变成了这个影子,此时NetWork里面的网络数据包也已经改变了,我们依然需要在NetWork里面逐一查找视频数据包,观察左边的主页信息,一共有12个视频,也就是说我们最多可以找到12个视频数据的包

4. 根据经验,我找到了一个带有video标签的数据包,这个数据包下面有url_list,里面有链接,复制链接并进入,发现正是我们需要的视频文件

5. 分析数据包里面的数据结构,我们打开一个叫sojson的工具,百度直接搜索就能用,进入后点击json在线解析,这个工具可以帮助我们整理字符串数据,将其转换为可以缩放的格式,方便我们观察数据包的整体结构

通过观察,这个数据包的结构是最外层为字典,'awere_list'关键字的键值是列表,点开列表之后发现里面还会嵌套多层字典或列表

6. 获取请求数据包的url,在请求头里面可以找到url,请求方式为get,获取url的时候也可以从请求头里面获得user-agent、referer、cookied......信息

7.  获得响应信息response后,将之用json模块进行加载,json.loads(response.text),得到数据包的字典格式数据,然后再通过字典的关键字获得存放有视频信息的列表,再迭代遍历列表,获得每一个视频的文件url和标题

直接堆每一个视频文件进行网络请求,并将请求得到的数据以二进制格式写入.mp4后缀的文件中,即完成的了下载,代码中存放视频的目录请自己定义

import requests
import json

# 找到包含视频信息的数据包的url
url = "https://m.douyin.com/web/api/v2/aweme/post/?reflow_source=reflow_page&sec_uid=MS4wLjABAAAASwhiL0bRi1X_zs7UhAIO2udbD1F_XKrsJMOaukl1Io4&count=15&max_cursor=0&msToken=AjdH_77aAG1sC-0U-MaMQBD3QT95XjiZP1e4e5JJYpBnimVxKqDUU10RT2MgbZWKVfyTaxM09vdszhneWinYQNztXdYjJmQxVrp-phFdeimKvdCLmEP8uf3XbhPt4qI=&X-Bogus=DFSzKwVOFYJANeTitVG4MBt/pLfR&_signature=_02B4Z6wo00001.ZN80AAAIDCfQZoo-troSP2XffAAJmzewiu-7U6iD-JbAD74nmRsnNpUV.-BS9Fw6LVCVWwonyxlS-XqkHgugFjUnAqh-vM3n5uFWhxCFihg6oeZDnwSp1ZGQjVtWQvVauT29"
head = {
    'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36',
    'referer': 'https://m.douyin.com/share/user/MS4wLjABAAAASwhiL0bRi1X_zs7UhAIO2udbD1F_XKrsJMOaukl1Io4',
    'cookie': 'ttwid=1%7CSfdsymdYx1QlfjQTR3xYeFSNa9O6q4f1wFp6BtrRqxs%7C1676826682%7C30e0eb856043a47a208c80c1af10d30fc0cfcf4e270115abae592c5ec3873249; passport_csrf_token=6372cba6b4f2cdcca86e2189f5d1065e; passport_csrf_token_default=6372cba6b4f2cdcca86e2189f5d1065e; strategyABtestKey=%221681489097.642%22; d_ticket=5bc0d2611324cd7fbfc9e0f926fec81dc0d98; passport_assist_user=CkHkH_6ka8IiPFCiZKjYeqLlQ3IQO4dnoM20tGGmRhZNzWR0b-vg3QFOuNc8hYUqhotVsLwAHo5tpR-NWGrr7cp3_hpICjynJIYtuuLTHP0W9Aa8AzzU2xfJszvShJhQUoSBt96bF2UGXYQAgVAAwid85Z0QTR8LLb5lB5pKAX6aZzkQ_r6uDRiJr9ZUIgED4L4Gmw%3D%3D; n_mh=48GDnZrzh9L0L71QYQe9RHV7INgvIpqOtZbHqRblemk; sso_auth_status=5ac2453cbbb4e7711ec74d4525109405; sso_auth_status_ss=5ac2453cbbb4e7711ec74d4525109405; sso_uid_tt=23bd5aa65e9bf83cf5d1da0295dab814; sso_uid_tt_ss=23bd5aa65e9bf83cf5d1da0295dab814; toutiao_sso_user=e17ba4d3ba02f5112b43bf87f6ebcf82; toutiao_sso_user_ss=e17ba4d3ba02f5112b43bf87f6ebcf82; sid_ucp_sso_v1=1.0.0-KDkzMjFjN2Q2NzM2YTlkZDA5ZDQ3NThiMzNlZDlhZjFlM2U4ZDhhNTIKHwjX-IDEvvXbAxDohOahBhjvMSAMMIKS-v0FOAJA8QcaAmxmIiBlMTdiYTRkM2JhMDJmNTExMmI0M2JmODdmNmViY2Y4Mg; ssid_ucp_sso_v1=1.0.0-KDkzMjFjN2Q2NzM2YTlkZDA5ZDQ3NThiMzNlZDlhZjFlM2U4ZDhhNTIKHwjX-IDEvvXbAxDohOahBhjvMSAMMIKS-v0FOAJA8QcaAmxmIiBlMTdiYTRkM2JhMDJmNTExMmI0M2JmODdmNmViY2Y4Mg; odin_tt=c4d2b5e57715bbf9f03692fd068425eda4129913fbb28d6c1c1287a19e2203d77a66deb3279cb017d3bc28e0e451f475ca24d947928720cc9b5762f8aedd9ea6; passport_auth_status=a7ce1e07f923c0f2f1c214dd3a228ba0%2Cc53255e0ba344f56a27077246b056268; passport_auth_status_ss=a7ce1e07f923c0f2f1c214dd3a228ba0%2Cc53255e0ba344f56a27077246b056268; uid_tt=2750b133aa1926c33be64dbd3cd2ff92; uid_tt_ss=2750b133aa1926c33be64dbd3cd2ff92; sid_tt=310d75ea30feab567b26cc6cb5972446; sessionid=310d75ea30feab567b26cc6cb5972446; sessionid_ss=310d75ea30feab567b26cc6cb5972446; publish_badge_show_info=%220%2C0%2C0%2C1681490545371%22; LOGIN_STATUS=1; store-region=cn-zj; store-region-src=uid; sid_guard=310d75ea30feab567b26cc6cb5972446%7C1681490547%7C5183992%7CTue%2C+13-Jun-2023+16%3A42%3A19+GMT; sid_ucp_v1=1.0.0-KDdiN2I2MWM2N2IzYmFhYmRiODNiMTlhMDJiNmI0ZGUyZDZjZTQ4Y2MKGwjX-IDEvvXbAxDzhOahBhjvMSAMOAJA8QdIBBoCaGwiIDMxMGQ3NWVhMzBmZWFiNTY3YjI2Y2M2Y2I1OTcyNDQ2; ssid_ucp_v1=1.0.0-KDdiN2I2MWM2N2IzYmFhYmRiODNiMTlhMDJiNmI0ZGUyZDZjZTQ4Y2MKGwjX-IDEvvXbAxDzhOahBhjvMSAMOAJA8QdIBBoCaGwiIDMxMGQ3NWVhMzBmZWFiNTY3YjI2Y2M2Y2I1OTcyNDQ2; download_guide=%223%2F20230415%22; SEARCH_RESULT_LIST_TYPE=%22single%22; my_rd=1; s_v_web_id=verify_lghtat20_3RFiWIRj_x930_45U0_BZ3H_uaRjGNXAso9X; ttcid=08ead2e071f34a49a4e20a80c33afd4f42; FOLLOW_LIVE_POINT_INFO=%22MS4wLjABAAAAxMM2c6KNNNHvRluZ2KTOB7UJeBxyCmzUXWp4TliKXZ_wSxAmrY0IkUK4pwbGPM7g%2F1681574400000%2F0%2F1681553160083%2F0%22; FOLLOW_NUMBER_YELLOW_POINT_INFO=%22MS4wLjABAAAAxMM2c6KNNNHvRluZ2KTOB7UJeBxyCmzUXWp4TliKXZ_wSxAmrY0IkUK4pwbGPM7g%2F1681574400000%2F0%2F0%2F1681554392542%22; msToken=AjdH_77aAG1sC-0U-MaMQBD3QT95XjiZP1e4e5JJYpBnimVxKqDUU10RT2MgbZWKVfyTaxM09vdszhneWinYQNztXdYjJmQxVrp-phFdeimKvdCLmEP8uf3XbhPt4qI=; tt_scid=N0mdcnXLcnZ0sRc48a2X5KXeTgh11VQsoMIIH7tamef--JVlvaRFUjPP8LOViFHJ8ae2; VIDEO_FILTER_MEMO_SELECT=%7B%22expireTime%22%3A1682160805638%2C%22type%22%3A1%7D; msToken=fvm1KRAKqcE7dnf6sC2JpB9vNqVP3TloBQ4vGEQeljq2Ly5ypnjz_iUbBl3q2wq_ISn2uUhS4_XncTkCQQEsNQX63mFUzjeDdrx9yOh2ERFmUkGvQEHhgw==; home_can_add_dy_2_desktop=%221%22'
}

response = requests.get(url, headers=head)
# print(response.text)

# 通过json提取数据,通过观察可得json最外层是字典格式
data_dict = json.loads(response.text)
data_list = data_dict['aweme_list']     # vedeo在这个标签下,一共是主页的12个视频
# print(len(data_list))   # 12

# 'aweme_list'是一个字典的关键字,它的键值是一个长为12的列表,列表的每个元素又是字典
for i in data_list[:3]:
    v_title = i['desc']
    v_url = i['video']['play_addr']['url_list'][0]
    print(v_title, v_url)        # 拿到每一个视频文件的标题、url
    res = requests.get(v_url, headers=head)
    with open(f"./LiuGH/{v_title}.mp4", "wb") as f:
        f.write(res.content)

猜你喜欢

转载自blog.csdn.net/phoenixFlyzzz/article/details/130170792
今日推荐