#####################################################################

制定一个目标(爬取周杰伦的歌曲清单);

根据目标,确认一个方案(爬取QQ音乐);

带着方案,去分析它的网站结构;最后去写代码

#####################################################################

什么是Network

调用“检查”(ctrl+shift+i)工具,然后点击Network

记录在当前页面上发生的所有请求。

现在看上去好像空空如也的样子,这是因为Network记录的是实时网络请求。

现在网页都已经加载完成,所以不会有东西。

点击一下刷新,浏览器会重新访问网络,这样就会有记录

浏览器总是在向服务器,发起各式各样的请求。

当这些请求完成,它们会一起组成我们在Elements中看到的网页源代码

一般来说,都是这种第0个请求先启动了

其他的请求才会关联启动,一点点地将网页给填充起来

也有一些网页,直接把所有的关键信息都放在第0个请求里

方法:

先找到哪一个请求当中。再用requests库,去模拟这个请求

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Network怎么用

第一行

ALL(查看全部)/XHR(仅查看XHR,我们等会重点讲它)/Doc(Document,第0个请求一般在这里),

有时候也会看看:Img(仅查看图片)/Media(仅查看媒体文件)/Other(其他)。

最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体;

而理解WS和Manifest,需要网络编程的知识,倘若不是专门做这个,你不需要了解

第二行

是一个时间轴。记录什么时间,有哪些请求

第三行

统计:有多少个请求,一共多大,花了多长时间

############################################################

什么是XHR?

把鼠标在XHR上悬停,你可以看到它的完整表述是XHR and Fetch

#了解即可:Ajax技术 应用这种技术,好处是显而易见的——更新网页内容,而不用重新加载整个网页。又省流量又省时间

工作的时候,会创建一个XHR(或是Fetch)对象,

然后利用XHR对象来实现,服务器和浏览器之间传输数据。

在这里,XHR和Fetch并没有本质区别,只是Fetch出现得比XHR更晚一些,所以对一些开发人员来说会更好用,但作用都是一样的

+++++++++++++++++++++

XHR怎么请求?

列子:

点击XHR按钮。

网页里一共有10个XHR或Fetch,我们要从里面找出带有歌单的那一个(尝试阅读它们的名字client_search)

从左往右分别是:Headers:标头(请求信息)、Preview:预览、Response:原始信息、Timing:时间。

点击Preview按照这样的顺序:data-song-list-0-name,就能看到歌名

#最左侧的Headers,点击它-General-Requests URL-浏览器中打开链接(字典层层嵌套),比较难看

直接看Preview,按照这样的顺序:data-song-list-0-name,歌曲名就在这里,它的键是name

XHR是一个字典,键data对应的值也是一个字典;

在该字典里,键song对应的值也是一个字典;

在该字典里,键list对应的值是一个列表;

在该列表里,一共有20个元素;

每一个元素都是一个字典;在每个字典里,键name的值,对应的是歌曲名。

XHR{data:{song:{list:[name:{歌曲名}

 import requests

 # 引用requests库

 res = 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¬ice=0&platform=yqq.json&needNewCode=0')

 #URL地址点击XHR --Name--Copy link address 或者复制Request URL

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

 print(res.text)

 # 把它打印出来 结果不是我们想要的列表/字典,数据取不出来

######################################################

json是什么?

json是一种特殊的字符串,这种字符串特殊在它的写法——它是用列表/字典的语法写成的

和html一样,常用来做网络数据传输

json的数据类型是“文本”,在Python语言当中,我们把它称为字符串

不是所有的编程语言都能读懂Python里的数据类型(如,列表/字符串),

但是所有的编程语言,都支持文本(在Python中,用字符串这种数据类型来表示文本)这种最朴素的数据类型

json数据能实现,跨平台,跨语言工作。

json和XHR之间的关系

XHR用于传输数据,它能传输很多种数据,json是被传输的一种数据格式

可以将json格式的数据,转换成正常的列表/字典,也可以将列表/字典,转换成json

+++++++++++++++++++++++++++++++++++++++++++++++++++++

json数据如何解析?

搜索“requests 官方文档”

Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:

>>> import requests

>>> r = requests.get('https://api.github.com/events')

>>> r.json()

[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。

需要注意的是,成功调用 r.json() 并**不**意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。

这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同。

 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¬ice=0&platform=yqq.json&needNewCode=0')

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

 json_music = res_music.json()

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

 print(type(json_music))

 # 打印json_music的数据类型  <class 'dict'>
 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¬ice=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')

     # 查找播放链接

扩展json

 import json

 # 引入json模块

 a = [1,2,3,4]

 # 创建一个列表a。

 b = json.dumps(a)

 # 使用dumps()函数,将列表a转换为json格式的字符串,赋值给b。

 print(b)

 # 打印b。

 print(type(b))

 # 打印b的数据类型。

 c = json.loads(b)

 # 使用loads()函数,将json格式的字符串b转为列表,赋值给c。

 print(c)

 # 打印c。

 print(type(c))

 # 打印c的数据类型。

Python【Network/XHR/json】的更多相关文章

  1. 进击的Python【第十七章】:jQuery的基本应用

    进击的Python[第十七章]:jQuery的基本应用

  2. Python&Selenium 数据驱动【unittest+ddt+json】

    一.摘要 本博文将介绍Python和Selenium做自动化测试的时候,基于unittest框架,借助ddt模块使用json文件作为数据文件作为测试输入,最后生成html测试报告 二.json文件 [ ...

  3. 3.2:pandas数据的导入与导出【CSV,JSON】

    一:CSV数据 一]:导入数据 1)从CSV文件读入数据:pd.read_csv("文件名"),默认以逗号为分隔符 D:\data\ex1.csv文件内容:             ...

  4. 七丶人生苦短,我用python【第七篇】

    模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个 ...

  5. Python【每日一问】14

    问:请介绍一下Python中的 import 机制 答: import 语句结合了两个操作:1.它先搜索指定名称的模块 2.将搜索结果绑定到当前作用域中的名称. 如果指定名称的模块未找到,则会引发 M ...

  6. 进击的Python【第十三章】:Web前端基础之HTML与CSS样式

    进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...

  7. Python【每日一问】24

    问: [基础题1]: 请解释一下 if __name__ == '__main__' :的作用 [基础题2]:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. P ...

  8. Python【每日一问】18

    问: [基础题]:请解释新式类跟经典类,并说明它们的区别[提高题]:请解释Python垃圾回收机制 答: [基础题]:请解释新式类跟经典类,并说明它们的区别 1.新式类都是继承内置 object 对象 ...

  9. 进击的Python【第四章】:Python的高级应用(一)

    Python的高级应用(一) 本章内容: 内置函数 生成器 迭代器 装饰器 JSON和PICKLE的简单用法 软件目录结构规范 一.内置函数 1.数学运算类 abs(x) 求绝对值1.参数可以是整型, ...

随机推荐

  1. Manjaro Linux无备份迁移home目录

    前几天安装了最新的manjaro kde 18.10,速度刚开始非常快,后来几乎每次重启都会出现无法挂在home分区的情况,刚开始以为是分区对齐的问题,但是后来发现根本不是.算了,干脆迁移下home分 ...

  2. A·F·O小记

    看过很多的游记,也看过很多的退役记.回忆录,而当自己真正去面对的那一刻,却又不知道从何说起,也不知道能用怎样的形式和语言,才能把这段珍贵的记忆封存起来,留作青春里的一颗璀璨明珠…… 还是随便写写吧…… ...

  3. ICEM-轴(周期复制网格)

    原视频下载地址:https://yunpan.cn/cqMnfpqQQdZZI  访问密码 802b

  4. Android Handler消息处理顺序分析

    看到Handler中的消息处理函数: public void dispatchMessage(Message msg){...} 这个函数是在Looper的执行消息循环loop()的时候取出Messa ...

  5. 详解JDBC对象

    1. DriverManager (1) 注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 真正注册驱动的是驱动包下 jdbc 文件夹 ...

  6. 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

    TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...

  7. postgresql 计算时间差的秒数、天数

    处理时间时用到了,记录一下. 计算时间差天数 select extract(day FROM (age('2017-12-10'::date , '2017-12-01'::date))); 计算时间 ...

  8. Mybatis xml mapper 特殊写法总结

    项目告一段落,业务代码也写得差不多了,框架仍然用的是 ssm ,为了省去单表数据库操作的代码编写,继续用 mybatis generator 生成单表对应的实体类.dao层映射关联及配置文件,私下还尝 ...

  9. android: Context引起的内存泄露问题

    错误的使用Context可能会导致内存泄漏,典型的例子就是单例模式时引用不合适的Context. public class SingleInstance { private static Single ...

  10. Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考) 1.返回顶部 1. #undef(C# 参考) 2018/06/30 #undef 允许你定义一个符 ...