美文网首页
第4关 json

第4关 json

作者: 夕颜00 | 来源:发表于2020-07-09 18:41 被阅读0次

1、Network

1-1、什么是 Network

Network 的功能是:记录在当前页面上发生的所有请求。Network记录的是实时网络请求。现在网页都已经加载完成,所以不会有东西。(刷新后可弹出)

  • 【windows】:在网页的空白处点击右键,然后选择“检查”(快捷方式是ctrl+shift+i),再在 Elements 页面按 ctrl+f;
  • 【mac】:在网页的空白处点击右键,然后选择“检查”(快捷键 command + option + I(大写i));
image.png

1-2、Network 怎么用

image.png
  • 第1行,是对请求进行分类查看。我们最常用的是:ALL(查看全部)/XHR(仅查看XHR,我们等会重点讲它)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体文件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体;而理解WS和Manifest,需要网络编程的知识。
image.png
  • 夹在第2行和第1行中间的,是一个时间轴。记录什么时间,有哪些请求。而第2行,就是各个请求,你可以看下面这张表来理解(读,但不需要记忆)。
image.png
  • 第3行,是个统计:有多少个请求,一共多大,花了多长时间。

2、XHR

2-1、什么是 XHR

在Network中,有一类非常重要的请求叫做XHR(当你把鼠标在XHR上悬停,你可以看到它的完整表述是XHR and Fetch)。Ajax技术工作的时候,会创建一个XHR(或是Fetch)对象,实现服务器和浏览器之间传输数据。

2-2、XHR 怎么请求

蓝框里面的内容,从左往右分别是:Headers:标头(请求信息)、Preview:预览、Response:原始信息、Timing:时间。

image.png

在Network,有非常重要的一类请求是XHR(或Fetch),因为有它的存在,人们不必刷新/跳转网页,即可加载新的内容。随着技术发展,XHR的应用频率越来越高,我们常常需要在这里找我们想要的数据。

XHR的功能是传输数据,其中有非常重要的一种数据是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,在Python语言当中,我们把它称为字符串。我们能够非常轻易地将json格式的数据转化为列表/字典,也能将列表/字典转为json格式的数据。

3、json

3-1、json 是什么?

Python语言当中,json是一种特殊的字符串,这种字符串特殊在它的写法——它是用列表/字典的语法写成的。我们可以将json格式的数据转化为列表/字典,也能将列表/字典转为json格式的数据。

a = '1,2,3,4'

# 这是字符串

b = [1,2,3,4]

# 这是列表

c = '[1,2,3,4]'

# 这是字符串,但它是用json格式写的字符串

3-2、json 数据如何解析?

image.png

而如果你想在Python语言中,实现列表/字典转jsonjson转列表/字典,则需要借助json模块。json模块不在我们的教学范围之内,所以不做展开。你可阅读它的官方文档来了解,地址在这里:https://docs.python.org/3/library/json.html

import json

a = [1,2,3,4]

b = json.dumps(a)     # 使用dumps()函数,将列表a转换为json格式的字符串,赋值给b。
print(b)   
#[1, 2, 3, 4]
print(type(b))  
#<class 'str'>
c = json.loads(b)   # 使用loads()函数,将json格式的字符串b转为列表,赋值给c。
print(c)
# [1, 2, 3, 4]
print(type(c))
# <class 'list'>

4、项目:寻找周杰伦

4-1、确定目标

(1)目标网站:https://y.qq.com/

(2)网站协议:https://y.qq.com/robots.txt(目标网站 + robots.txt 可查看目标网站的页面爬取许可);

(3)项目目标:爬取周杰伦的歌曲。

4-2、过程分析

(1)确定数据位置

image.png
import requests

from bs4 import BeautifulSoup

res_music = requests.get('https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC%A6')

# 请求html,得到response

bs_music = BeautifulSoup(res_music.text,'html.parser')

# 解析html

list_music = bs_music.find_all('a',class_='js_song')

# 查找class属性值为“js_song”的a标签,得到一个由标签组成的列表

print(list_music)

# 打印它

结果为空,打印源代码后发现歌曲名不存在与 html 页面。

(2)XHR 中查找请求文件

image.png

(3)数据在 client_search_cp?... 请求文件 ['data']['song']['list'] 中

image.png

4-3、代码实现

4-3-1、获取请求地址

image.png
import requests

# 引用requests库

res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0')

# 调用get方法,下载这个字典

4-3-2、解析数据

json() 将获取到的 Response 对象转换为字典,再根据歌曲名的位置,我们用字典取值的方式找到页面上的歌曲名信息。

import requests

# 引用requests库

res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0')

# 调用get方法,下载这个字典

json_music = res_music.json()

# 使用json()方法,将response对象,转为列表/字典

list_music = json_music['data']['song']['list']

# 一层一层地取字典,获取歌单列表

for music in list_music:

# list_music是一个列表,music是它里面的元素

 print(music['name'])

 # 以name为键,查找歌曲名

4-3-3、下载歌曲名、所属专辑、播放时长,以及播放链接

就是这样一个代码,它能拿到周杰伦在QQ音乐上,前20个歌曲的名单。

事实上,如果对这个程序稍加延展,它就能拿到:歌曲名、所属专辑、播放时长,以及播放链接。因为这些信息都在那个XHR里,认真观察分析,如果有必要的话还可以配合翻译软件。最终,你可以用同样的方法把它们提取出来。就像这样:

import requests
# 引用requests库
res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0')
# 调用get方法,下载这个字典
json_music = res_music.json()
# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
# 一层一层地取字典,获取歌单列表
for music in list_music:
# list_music是一个列表,music是它里面的元素
    print(music['name'])
    # 以name为键,查找歌曲名
    print('所属专辑:'+music['album']['name'])
    # 查找专辑名
    print('播放时长:'+str(music['interval'])+'秒')
    # 查找播放时长
    print('播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n')
    # 查找播放链接

相关文章

网友评论

      本文标题:第4关 json

      本文链接:https://www.haomeiwen.com/subject/tevscktx.html