Requests 库入门
1 Requests 库的安装
Win 平台:“以管理员身份运行” cmd,执行 pip install requests,等待安装
Requests 库的安装小测
Python IDLE2 Requests 库的 get() 方法
get 方法response n. 响应;反应;回答
Response 对象包含服务器返回的所有信息,也包含请求的 Request 信息
r = requests.get( url , params=None , **kwargs )
//---url:拟获取页面的 url 链接
//---params:url 中的额外参数,字典或字节流格式,可选
//---**kwargs:12 个控制访问的参数
[补充]:参考 get 方法的文档可以看出 get 方法使用了 request 方法进行封装,也就是说 request 库一共提供 7 常用方法,除了第一个 request 方法外,其它的 6 个方法都是通过调用 request 方法实现的。其实也可以这样认为 requests 库其实只有一个方法,就是 request 方法,但是为了让大家编写程序更方便,提供了额外 6 个方法。
Requests 库的 2 个重要对象
Response 对象Response 对象的属性:
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态, 200表示连接成功, 404表示失败 |
r.text | HTTP响应内容的字符串形式,即, url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
!r.status_code:只要不是200其实都是连接失败的
在使用 get 方法获取网上资源的基本流程:
理解 Response 的编码:
- r.encoding:编码方式是从 http 的 heder 中的 charset 字段获得的,如果 header 中不存在 charset,则默认认为编码为 ISO-8859-1,这样的编码不能解析中文。r.text 根据 r.encoding 显示网页内容
- r.apparent_encoding:根据 http 的内容部分,而不是头部分,去分析内容中出现文本可能的编码形式。即根据网页内容分析出的编码方式, 可以看作是 r.encoding 的备选
为什么将 r.apparent_encoding 解析出来的编码方式赋给 r.encoding 后,网页中的中文就可以分析出来,难道 r.text 是以 r.encoding 的方式进行编码的吗?为什么头部分析出来的编码方式会与内容解析出来的不同?
答:r.text 是以 r.encoding 的方式进行编码
3 爬取网页的通用代码框架
在介绍爬取网页的通用代码框架之前,我们需要理解 Requests 库的异常
r.raise_for_status():在方法内部判断 r.status_code 是否等于 200,不需要增加额外的 if 语句,该语句便于利用 try-except 进行异常处理,如果状态码不是200,产生异常 requests.HTTPError。
import requests
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
# print(r.status_code)
return "产生异常!"
if __name__=="__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
4 HTTP 协议及 Requests 库方法
HTTP,HyperText Transfer Protocol,超文本传输协议。是一个基于 “请求与响应” 模式的、无状态的应用层协议。无状态指的是第一次请求与第二次请求之间并没有相关的关联。HTTP 协议采用 URL 作为定位网络资源的标识。
URL 格式如下:http://host[:port][path]
host:合法的 Internet 主机域名或 IP 地址
port:端口号,缺省端口为 80
path:请求资源的路径
HTTP 实例:http://www.bit.edu.cn
http://220,181,111,188/duty
URL 是通过 HTTP 协议存取资源的 Internet 路径,它就像我们电脑里边的一个文件的路径一样,只不过这个文件不在电脑里,在 internet 上,那每一个 URL,对应了 internet 上的一个数据资源。
HTTP 协议对资源的操作
理解 PATCH 和 PUT 的区别
假设 URL 位置有一组数据 UserInfo,包括 UserID、UserName 等20个字段
需求:用户修改了 UserName,其他不变。
⿻采用 PATCH,仅向 URL 提交 UserName 的局部更新请求。
⿻采用 PUT,必须将所有 20 个字段一并提交到 URL,未提交字段被删除。
PATCH 的最主要好处:节省网络带宽(当 URL 对应的资源是很庞大资源的时候)
HTTP 协议与 Requests 库
Requests 库的 head() 方法
- r.headers : 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回 None
Requests 库的 post() 方法
向 URL POST 一个字典,自动编码为 form(表单)
向 URL POST 一个字符串,自动编码为 data
Requests 库的 put() 方法
5 Requests 库主要方法解析
Requests 库的 7 个主要方法:
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交PUT请求的方法,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
requests.request(method, url, **kwargs)
- method:请求方式,对应get/put/post等七种
r = requests. request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPTIONS', url, **kwargs)
- OPTIONS:向服务器获取一些服务器跟客户端能够打交道的参数,并不与获取资源直接相关。
- url:拟获取页面的url链接
- **kwargs:控制访问的参数,共 13 个
- params:字典或字节序列,作为参数增加到ur1中
- data:字典、字节序列或文件对象,作为Request的内容
- json:JSON格式的数据,作为Request的内容
- headers:字典,HTTP定制头
- cookies:字典或CookieJar,Request中的cookie
- auth:元组,支持HTTP认证功能
- files:字典类型,传输文件
- timeout:设定超时时间,秒为单位
- proxies:字典类型,设定访问代理服务器,可以增加登录认证
- redirects:True/False,默认为 True,重定向开关
- stream:True/False,默认为 True,获取内容立即下载开关
- verify:True/False,默认为 True,认证 SSL 证书开关
- cert:本地 SSL 证书路径
使用示例:
import requests
kv = {'key1':'value1','key2':'value2'}
r = requests.request('GET','http://python123.io/ws',params=kv)
print(r.url)
# https://python123.io/ws?key1=value1&key2=value2
这两种方法是等价的:
r = requests.request("get", "http://www.baidu.com")
r = requests.get("http://www.baidu.com")
fs = {'file':open('data.x1s','rb')}
r = requests.request('pOST','http://python123.io/ws',files=fs)
pxs = { 'http':'http://user:pass@10.10.10.1:1234'
'https':'https://1e.10.10.1:4321' }
r = requests.request('GET','http://www.baidu.com',proxies=pxs)
http 协议中,向某一个 url 提交资源的功能在服务器上是严格受控的,因为这存在很大的安全问题。
网络爬虫的尺寸:
小规模,数据量小 | 中规模,数据规模较大 | 大规模,搜索引擎 |
---|---|---|
爬取速度不敏感 | 爬取速度敏感 | 爬取速度关键 |
Requests 库 | Scrapy 库 | 定制开发 |
爬取网页、玩转网页 | 爬取网站、爬取系列网站 | 爬取全网 |