爬虫(三):Network、XHR、json

什么是Network

F12 ---> Network

Network的功能:记录当前页面发生的所有请求。

用requests.get()所获得的请求,只是模拟了这些请求的第一个请求,

点击第一个请求:search.html。然后再来点击Response,在下方的内容是用requests.get()获取到的网页源代码。

如何使用Network

  • 第1行的左侧,红色的圆钮是启用Network监控(一般浏览器默认是打开的,用高亮显示),灰色圆圈是清空面板上的信息。右侧勾选框Preserve log,它的作用是“保留请求日志”。如果不点击这个,当发生页面跳转的时候,记录就会被清空。所以,我们在爬取一些会发生跳转的网页时,会点亮它。

  • 第3行,是对请求进行分类查看。最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第1个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体文件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体;而理解WS和Manifest,需要网络编程的知识。

    分类查看 说明
    ALL 查看全部
    XHR 不需要刷新网页就可以进行数据传输的对象
    Doc Document,网页的第一个请求
    Img 只查看图片
    Media 只查看媒体文件
    Other 其他
    JS和CSS JS是前脚本语言,CSS是页面样式文件
    Font 字体
    WS和Manifest 暂时不需要了解
  • 时间轴

    名称 说明
    name 名字
    status 请求的状态码
    type 请求类型,例如XHR和Img
    size 数据大小
    time 请求所花的时间
    waterfail 描述每个请求的起止时间
  • 图的最下方,可以看到一个统计:有多少个请求,一共多大,花了多长时间。

什么是XHR

  • Ajax技术:使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
  • Ajax技术在工作的时候,会创建一个XHR(或是Fetch)对象,然后利用XHR对象来实现,服务器和浏览器之间传输数据。

当 我们要的数据不在网页源码里,也不是图片、媒体文件,自然只是会在XHR里。
Headers:标头(请求信息)、Preview:预览、Response:原始信息、Timing:时间。

什么是Json

  • json是一种特殊的字符串,它是用列表/字典写成的
    c= '[1,2,3,4]'

  • json 则是另一种组织数据的格式,长得和python中得列表/字典非常像。他和html一样,常用来做网络数据传输。

  • 在XHR看到的列表/字典,严格来说不是列表/字典,是json。

为什么不直接用列表/字典,而要用字符串来表示呢?因为不是所有的编程语言都能读懂Python里的数据类型(如:列表/字符串),但是所有的编程语言,都支持文本(在Python中,文本就是用字符串类型来表示的)

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

解析jsons数据

import requests
res = requests.get(url)
res.json()    #使用json()方法,将response对象,转为列表/字典
import json
a = [1,2,3,4]
b = json.dumps(a)
# 使用dumps()函数,将列表a转换为json格式的字符串,赋值给b
c = json.loads(b)
# 使用loads()函数,将json格式的字符串b转为列表,赋值给c。

拿到五月天得歌单

url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=72022276580872684&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E4%BA%94%E6%9C%88%E5%A4%A9&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0"
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
res = requests.get(url=url,headers=headers)
print(type(res))         # <class 'requests.models.Response'>
try:
   if res.status_code == 200:
       #只有请求状态码为200,才代表请求成功,才能获得相应得数据,解析数据
       list_ = res.json()
       print(type(list_))   #<class 'dict'>
       music_list = list_['data']['song']['list']      
       #不能直接['name'],因为列表list的索引必须是整数或者切片,而不能是字符串类型。
       print(type(music_list))   #<class 'list'>
       for music in music_list:
           music_name = music['name']
           print(music_name)
except Exception as error:
    print(error)

posted @ 2021-07-06 23:03  突然跳舞的咸鱼  阅读(1411)  评论(0)    收藏  举报