一、requests库的几个常用方法:
方法 | 解释 |
---|---|
requests.request() | 构造一个请求,支撑以下个方法的基础方法 |
requests.get() | 获取HTML的主要方法,对应于HTTP的GET |
requests.head() | 获取网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向网页提交删除请求,对应于HTTP的DELETE |
二、requests解析:
1.方法解析
r = requests.request(url,params=None,**kwargs)
url: 网页链接
params: 在url中增加的额外参数(字典、参数、字节流格式),为可选输入
**kwargs:12个控制访问的参数,也是可选的
例如,get方法其实是request方法的封装,如下:
def get(url, params, **kwargs):
kwargs.setdefault('allow redirects', True)
return request('get', url, params=params, **kwargs)
同理,requests库的其他几个常用方法皆是以request方法封装而成,所以,归根结底,request方法的理解是十分必要的。
2.request方法解析:
r = requests.request(method, url, **kwargs)
其中:
method: GET/PUT/POST/PATCH/delete/OPTIONS七个方法
url: 网页链接
**kwargs: 13个控制访问参数。
3.13个控制访问参数:
(1)params:字典或字节序列,作为参数增加到url中
例:
import requests
kv = {'key1':'value1', 'key2':'value2'}
r = requests.request('GET', 'http://python123.io/ws', params=kv)
print(r.url)
运行结果:
result:https://python123.io/ws?key2=value2&key1=value1
(2)data:字典或字节序列或文件对象,作为Request的内容
例:
# -*- coding: utf-8 -*-
import requests
kv = {'key1':'value1', 'key2':'value2'}
r = requests.request('POST', 'http://python123.io/ws', data=kv)
body = '主体内容'
r = requests.request('POST', 'http://python123.io/ws', data=body)
(3)json:JSON格式的数据,做为Requests的内容
例:
kv = {'key1':'value1', 'key2':'value2'}
r = requests.request('POST', 'http://python123.io/ws', json=kv)
(4)headers:字典,HTTP定制头
例:
hd = {'user-agent': 'Chrome/10'} #模拟Chrome/10向服务器发起访问
r = requests.request('POST', 'http://python123.io/ws', headers=hd)
(5)cookie:字典或CookieJar,Request中的cookie
(6)auth:元组,支持HTTP认证功能
(7)files:字典类型,传输文件
例:
fs = {'file':open('data.xls', 'rb')}
r = requests.request('POST', 'http://python123.io/ws', files=fs)
(8)timeout:设定的超时时间,秒为单位
(9)proxies:字典类型,设定访问代理服务器,可以增加登录认证
例:
pxs = {'http': 'http://user:pass@10.10.10.1:1234'
'https': 'https://10.10.10.1:4321'}
r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)
(10)allow_redirects:True/False,默认为True,重定向开关
(11)stream:True/False,默认为True,获取内容立即下载开关
(12)verify:True/False,默认是True,认证SSL证书开关
(13)cert:本地SSL证书路径
4.Response对象的5个属性:
如:
r = requests.get(url)
上述代码中,
requests: Response,返回一个包含服务器资源的Response对象
get: Request,构造一个向服务器请求资源的Request对象
下面则是关于response对象属性及其解释:
Response对象属性 | 属性解释 |
---|---|
r.status_coding | HTTP请求的返回状态,200表示连接成功,404表示连接失败(除了200,基本就已经失败了) |
r.text | HTTP响应内容的字符串形式,即url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式,通常设置‘utf-8’ |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
注意:如果header中不存在charset,则自动认为编码为ISO-8859-1
5.requests库的6中常见异常:
异常 | 解析 |
---|---|
requests.ConnectionError | 网络连接错误异常 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
6.Response库异常的解决办法:
方法 | 解析 |
---|---|
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError(自动判断异常) |
三.爬取网页的通用代码框架:
def getHTMLText(url):
try:
r = requests.get(url, timeout=30) #get方法调用
r.raise_for_status() #状态码检查,正确则继续,错误则停止
r.encoding = r.apparent_encoding #编码方式转换,将现有编码方式转换为备用编码
return r.text #返回文本
except: #错误处理
return 'Error!!!!'
上面定义的方法就是获取网页HTML的通用代码框架,当然,不可能每个网页的爬取都是直接复制这个getHTMLText方法来完成,我们的目的是精析它,然后灵活应用。
百度HTML页面爬取示例:
调用上述框架:
# -*- coding: utf-8 -*-
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return 'Error!!!!'
if __name__ == '__main__':
url = 'http://www.baidu.com'
print(getHTMLText(url))
或者直接写代码:
# -*- coding: utf-8 -*-
import requests
try:
url = 'http://www.baidu.com' #百度页面的url
r = requests.get(url,timeout=30) # requests库的get方法,设置30秒为响应超时
r.raise_for_status() # 状态码判断,为200时正确,其他的错误
r.encoding = r.apparent_encoding # 设置网页编码方式为百度页面的备用编码方式
print('百度页面HTML:\n' + r.text) # 打印
except: # 错误处理
print('爬取失败!!')
是不是特别简单呢,hiahiahia…
新手发文,有错请指出!!!
本文是学习mooc平台视频的学习笔记,链接:https://www.icourse163.org/course/BIT-1001870001