本文基于《Python网络爬虫与信息提取》的学习,参考资料源于“Python网络爬虫与信息提取 北京理工大学:嵩天”,视频链接如下:
学习视频
(学习视频的课程排序不太准确,注意先看某节的简介/介绍,再看内容,最后看总结,【可以参考本文目录顺序】)
视频嵩老师使用python自带的IDLE,而本博客作者使用IDE为pycharm,因此在交互式部分的代码会有出入
导入——课程全局
单元一 Requests库入门
1、HTTP协议及Requests库方法(SHD)
(1)HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议,并采用URL(统一资源定位符)作为定位网络资源的标识。
URL格式 > http://host[:port][path]
host:合法的Internet主机域名或IP地址
port:端口号,缺省(默认)端口为80
path:请求资源的路径
HTTP URL的理解:
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
HTTP协议对资源的操作:
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获取该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
理解PATCH和PUT的区别
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段。
需求:用户修改了UserName,其他不变。
采取PATCH,仅向URL提交UserName的局部更新请求
采取PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络宽带
(2)Requests库的7个主要方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST方法 |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests…delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
对比我们可以看到,HTTP协议与Requests对资源操作一一对应。
下面就Requests中的部分方法进行操作:
import requests
r = requests.head("http://httpbin.org/get")
print(r.headers)
{‘Date’: ‘Fri, 03 Jul 2020 11:09:50 GMT’, ‘Content-Type’: ‘application/json’, ‘Content-Length’: ‘307’, ‘Connection’: ‘keep-alive’, ‘Server’: ‘gunicorn/19.9.0’, ‘Access-Control-Allow-Origin’: ‘*’, ‘Access-Control-Allow-Credentials’: ‘true’}
Requests库的post()方法
import requests
payload = {
"key1" : "value1",
"key2" : "value2"
}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
可以看到,使用post()方法向URL提交一个字典时,网页自动编码到form(表单)中
import requests
r = requests.post("http://httpbin.org/post", data="ABC")
print(r.text)
可以看到,使用post()方法向URL提交一个字符串时,网页自动编码到data中
Requests库的post()方法
import requests
payload = {
"key1" : "value1",
"key2" : "value2"
}
r = requests.put("http://httpbin.org/post", data=payload)
print(r.text)
向URL发送post请求,相当于传递新增数据,而put还会覆盖原有数据。当然,在一些URL中,POST和PUT方法也会不被允许使用,上述例子在我访问的时候已经不被运行使用了。上述例子主要是为了了解使用这些方法后,URL会如何处理这些数据。
2、Requests的get方法
(1)get方法
首先使用get方法发出请求
requests.get(yrl, params = None, **kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数
(2)Requests库的2个对象
注意Requests库的2个重要对象,我们不仅要发出请求,还要得到响应
(3)Response响应
下列就是我们调用响应的方法:
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回请求状态码 |
r.text | HTTP响应页面内容的字符串形式 |
r.encoding | 从HTTP header中猜猜的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
下面我们就访问b站首页并获取响应内容
import requests
r = requests.get("https://www.bilibili.com/")
print(r.status_code)
print(type(r))
print(r.headers)
下面就是一些常见的状态码以及对应的含义:
那么使用request访问基本流程就是这样的:
对于响应内容的编码类型,有两种获取方式,r.encoding是根据HTTP头文件中是否存在charset来判断,而r.apparent_encoding是就返回内容分析,因此从后者中可以更准确了解响应内容的编码格式。
r.encoding : 如果header中不存在charset,则认为编码为ISO-8859-1
r.apparent_encoding : 根据网页内容分析出的编码方式
import requests
r = requests.get("https://www.baidu.com/")
print(r.encoding)
print(r.apparent_encoding)
ISO-8859-1
utf-8
这样就可以便于我们去解析响应内容,如果直接返回原格式相应内容:
下面我们修改解析方式
import requests
r = requests.get("https://www.baidu.com/")
r.encoding = "utf-8"
print(r.text)
这样可以解析中文,使得人眼可读性提高
3、Rquests库主要方法解析
(1)requests库的request方法
requests.request(method, url, **kwargs)
method : 请求方式,对应get / put / post / put / patch / delete / options 7种
url : 拟获取页面的url链接
**kwargs : 控制访问参数,共13个
(2)request方法的13个控制参数
下面介绍 13个访问的控制参数:
参数 | 用途 |
---|---|
params | 字典或字节序列,作为参数增加到url中 |
data | 字典、字节序列或文件对象,作为Request的内容 |
json | Json格式的数据,作为Request的内容 |
headers | 字典,HTTP定制头 |
cookies | 字典或者CookieJar,Request中的cookie |
auth | 元组,支持HTTP认证功能 |
files | 字典类型,传输文件 |
timeout | 设定超时时间,单位为秒 |
proxies | 字典类型,设定访问代理服务器,可以增加登录认证 |
allow_redirects | True/False,默认为True,重定向开关 |
stream | True/False,默认为True,获取内容立即下载开关 |
verify | True/False,默认为True,认证SSL证书开关 |
cert | 本地SSL证书路径 |
SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
(3)requests库的其他方法
下面介绍requests的其他方法:
其中,url : 拟获取页面的url链接, **kwargs : 13个访问参数
在下列这些方法中,有些参数是必须指定的,那么13