爬虫二、Network---爬虫必备知识
Network
读: [ˈnetwɜːk] n.网络;网状系统;关系网;
v.将…连接成网络;联播;建立工作关系
打开工发者工具:F12,或右键–检查(ctrl+shift+i)
Network能够记录当前浏览器的所有请求,它记录的是实时网络请求,刷新,浏览器会重新访问网络,这样就会有记录
1、ALL:查看全部。
2、XHR(或Fetch):仅查看XHR,下拉可自动加载网页。XHR的功能是传输数据,其中有非常重要的一种数据是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,在Python语言当中,我们把它称为字符串。我们能够非常轻易地将json格式的数据转化为列表/字典,也能将列表/字典转为json格式的数据。
调用Response类方法将json格式的数据转化为列表/字典 ,例:
res_music = requests.get ('url')#调用get方法,下载这个字典
json_music = res_music.json ()
3、Doc:(Document)第0个请求一般在这里
4、Img:仅查看图片 Media:仅查看媒体文件, Other:其他
5、JS和CSS,则是前端代码,负责发起请求和页面实现;
6、Font是文字的字体;
7、WS和Manifest,需要网络编程的知识,倘若不是专门做这个,不需要了解
左边框框里的是Elements,我们在那里查看网页源代码

Network面板怎么用

第0行的左侧,红色的圆钮是启用Network监控(默认高亮打开),灰色圆圈是清空面板上的信息。右侧勾选框Preserve log,它的作用是“保留请求日志”。如果不点击这个,当发生页面跳转的时候,记录就会被清空。所以,我们在爬取一些会发生跳转的网页时,会点亮它
在Network中,有一类非常重要的请求叫做XHR,它的功能是浏览网页时,下滑自动加载出更多内容,这个,叫做Ajax技术。

从左往右分别是:Headers:标头(请求信息)、Preview:预览、Response:响应、Cookies:Cookies、Timing:时间。
最左侧的Headers,它被分为几个不同的板块

一、General
1、 Requests URL
Requests URL就是我们应该去访问的链接,回到原网址,直接用Preview来看。

利用requests.get()访问这个链接,把这个字典下载到本地。然后去一层一层地读取,使用res.text取到的,是字符串,它不是我们想要的列表/字典,数据取不出来。
json是什么?
json是一种数据交换的语法。对我们来说,它只是一种规范数据传输的格式,形式有点像字典和列表的结合体。
它是另一种组织数据的格式,长得和Python中的列表/字典非常相像。它和html一样,常用来做网络数据传输。刚刚我们在XHR里查看到的列表/字典,严格来说其实它不是列表/字典,它是json。我们总是可以将json格式的数据,转换成正常的列表/字典,也可以将列表/字典,转换成json。
json数据如何解析? 见本文最开头示例。
2、Request Method:GET
3、Status Code: 200
4、Remote Address:
5、Referrer Policy:
二、Response Headers
三、Request Headers—请求头
(查询字符串参数)请求头.每一个请求,都会有一个Request Headers,我们把它称作请求头。它里面会有一些关于该请求的基本信息,比如:这个请求是从什么设备什么浏览器上发出?这个请求是从哪个页面跳转而来?
user-agent(中文:用户代理)会记录你电脑的信息和浏览器版本(如我的,就是windows10的64位操作系统,使用谷歌浏览器)。
origin(中文:源头)和referer(中文:引用来源)则记录了这个请求,最初的起源是来自哪个页面。它们的区别是referer会比origin携带的信息更多,如果我们想告知服务器,我们不是爬虫,而是一个正常的浏览器,就要去修改user-agent。倘若不修改,那么这里的默认值就会是Python,会被服务器认出来。
而对于爬取某些特定信息,也要求你注明请求的来源,即origin或referer的内容。
Requests模块允许我们去修改Headers的值,把要修改的值封装成字典。
每个url都由两部分组成。前半部分大多形如:https://xx.xx.xxx/xxx/xxx
后半部分,多形如:xx=xx&xx=xxx&xxxxx=xx&……
两部分使用?来连接。如豆瓣网址,前半部分是:
https://www.douban.com/search
后半部分则是:q=%E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1(使用utf-8编码的)
它们的中间使用了?来隔开。
这前半部分是我们所请求的地址,它告诉服务器,我想访问这里。而后半部分,就是我们的请求所附带的参数,它会告诉服务器,我们想要什么样的数据。
这参数的结构,会和字典很像,有键有值,键值用=连接;每组键值之间,使用&来连接。
示例 (爬取QQ音乐中的周杰伦歌曲信息):
import requests
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
headers = {
'origin':'https://y.qq.com',
# 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',
# 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
# 标记了请求从什么设备,什么浏览器上发出
}
# 伪装请求头
params = {
'ct':'24',
'qqmusic_ver': '1298',
'new_json':'1',
'remoteplace':'sizer.yqq.song_next',
'searchid':'59091538798969282',
't':'0',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'flag_qc':'0',
'p':'1',
'n':'20',
'w':'周杰伦',
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}
# 将参数封装为字典
res_music = requests.get(url,headers=headers,params=params)
# 发起请求,填入请求头和参数
一个url由两部分组成,?(有时候是“#”)之前是我们请求的地址,?之后是我们的请求所附带的参数。通常,我们会把参数封装成一个字典,添加进请求中去。
它最大的应用是帮助我们应对“反爬虫”技术,将Python爬虫伪装成真正的浏览器,不为服务器所辨识;同时也可以标记这个请求的来源是什么,最终帮助我们拿到想要的信息。
四、Query String Parameters
Preview栏:(后续再补充)
Response栏:(后续再补充)
requests.get()方法params参数用法示例:
Import requests
# 引用requests模块
url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'
# 请求歌曲评论的url参数的前面部分
字典名 = { 'g_tk':'5381',
'loginUin':'0',
.
.
.
} # 将参数封装为字典,字典里的参数要给他们打引号,让它们变字符串。
变量 = requests.get(url, 字典名=params) #传参
一键添加引号 如何给params直接封装成字典的格式,将headers请求头字符串转为字典
params = dict([line.split(": ",1) for line in a.split("\n")])
举例:
a = ''' nobase64: 1
musicid: 237773700
-: jsonp1
g_tk: 5381
loginUin: 0
hostUin: 0
format: json
inCharset: utf8
outCharset: utf-8
notice: 0
platform: yqq.json
needNewCode: 0'''
params = dict([line.split(": ",1) for line in a.split("\n")])
print(params)
封装为函数:
def get_headers(header_raw):
"""
通过原生请求头获取请求头字典
:param header_raw: {str} 浏览器请求头
:return: {dict} headers
"""
return dict(line.split(": ", 1) for line in header_raw.split("\n") if line != '')
def get_cookies(cookie_raw):
"""
通过原生cookie获取cookie字段
:param cookie_raw: {str} 浏览器原始cookie
:return: {dict} cookies
"""
return dict(line.split("=", 1) for line in cookie_raw.split("; "))
爬取到的数据存哪里?
详见:学习笔记之函数与模块——Python常用模块一、random(随机模块)openpyxl模块CSV模块
小技巧:如何快速找到想要爬取的内容

本学习笔记资料由博主从风变编程学习网站整理而来,风变URL: https://www.pypypy.cn/
