鱼C论坛

 找回密码
 立即注册
查看: 1168|回复: 5

[已解决]爬虫:如果导出json文件里嵌套字典和列表的层次结构

[复制链接]
发表于 2022-5-1 16:04:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
halo 各位大神们

关于爬虫这边,我这边已经把B站里的html 转换成json了 ,但是按照小甲鱼的课程导出来了字典类的数据结构,但是经过我子集不断尝试发现:我们需要的数据 视频标题藏在result 里,而result是一个列表,然后列表里的[data]的字典里的 字典里 如图: 捕获.JPG
实际要到下面这一层才能找到我们需要的所有数据的字典data = soup['data']['result'])[-1]['data']  ##定位到数据结构层,这还是我试了好多次的。。。

有没有办法跟小甲鱼一样显示所有非字符串的迭代结构都显示出来啊。。。  要不然太难找到title这个对应在哪个层次下面了?


##下面是为了直接显示 嵌套字典的层次关系
import requests
import json
import re

def get_space_end(level):   ##无子集
    return '  ' * level + '-'

def get_space_expand(level): ##可以继续扩展
    return '  ' * level + '+'


def find_keys(tar ,level):##tar 是一个嵌套字典
    keys = iter(tar)  ## 利用迭代器将字典的键拿出来
   
    for each in keys:
        if (type(tar[each]) is not (dict)): ## 设置退出条件,如果字典的值不是另字典,则退出递归
            print (get_space_end(level) + each)
        else:
            next_level = level + 1
            print(get_space_expand(level) + each)
            find_keys(tar[each], next_level) ## 如果字典的值是另外一个字典,继续将这个值调用函数 进行递归
            
def get_res(url):
    headers = {
        'uesr-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
        }

   
    res = requests.get(url, headers = headers )
    res_json = json.loads(res.text)
    find_keys(res_json, 1)




def main():
    keywords = '编程'
   
    url = f'https://api.bilibili.com/x/web-interface/search/all/v2?__refresh__=true&_extra=&context=&page=1&page_size=42&order=&duration=&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword={keywords}&preload=true&com2co=true'

    get_res(url)

        
if __name__ =='__main__':
    main()

最佳答案
2022-5-1 22:09:41
Victor0321 发表于 2022-5-1 21:58
啊哈。。 那个我自己瞎找的确找到了。。。 但是我就是好奇想找到有没有办法可以快速的找到,因为第一眼我 ...

你可以看一下这个:
https://www.cnblogs.com/xingdian/p/7411832.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-1 21:00:25 | 显示全部楼层
#!/usr/bin/env python3
import requests


def main():
    url = 'https://api.bilibili.com/x/web-interface/search/all/v2?__refresh__=true&_extra=&context=&page=1&page_size' \
          '=42&order=&duration=&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword={' \
          'keywords}&preload=true&com2co=true '
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    data = r.json()['data']['result'][-1]['data']
    for item in data:
        print(item['title'])


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 21:58:26 | 显示全部楼层

啊哈。。 那个我自己瞎找的确找到了。。。 但是我就是好奇想找到有没有办法可以快速的找到,因为第一眼我就定位到了肯定是title的那个列表里。。。然后往上找就根本看不出结构。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 22:09:41 | 显示全部楼层    本楼为最佳答案   
Victor0321 发表于 2022-5-1 21:58
啊哈。。 那个我自己瞎找的确找到了。。。 但是我就是好奇想找到有没有办法可以快速的找到,因为第一眼我 ...

你可以看一下这个:
https://www.cnblogs.com/xingdian/p/7411832.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-2 10:22:39 | 显示全部楼层
Victor0321 发表于 2022-5-1 21:58
啊哈。。 那个我自己瞎找的确找到了。。。 但是我就是好奇想找到有没有办法可以快速的找到,因为第一眼我 ...

从最内往最外层逐层看,遇到逗号就是列表用序号索引,遇到冒号就是字典就用键索引,有那么难吗?
浏览器自带格式化,一眼就能看到结构了。
不行就pycharm或vscode都在了自动格式化功能,就算没有IDLE,用notepad++ 加上 json viewer也能格式化json。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-2 13:18:20 | 显示全部楼层
suchocolate 发表于 2022-5-2 10:22
从最内往最外层逐层看,遇到逗号就是列表用序号索引,遇到冒号就是字典就用键索引,有那么难吗?
浏览器 ...

自己找 感觉眼睛要看瞎掉。。

还是用notepad++ 吧。。。。 感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 12:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表