一、requests库适应情景
requests库的应用:常用于小规模的爬虫。
二、requests库的7种请求方法
requests对服务器发起Requests请求,服务器则返回Response对象requests库有7种对URL操作的方法,与HTTP协议对资源的操作的相对应。
-
HTTP协议对资源的操作方式:
GET:请求获取URL位置的资源
HEAD:请求获取URL位置的资源的响应消息报告,即获取该资源的头部信息
POST:请求向URL位置的资源后附加新的数据
PUT:请求向URL位置的资源存储一个资源,覆盖原来URL位置的资源
PATCH:请求局部更新请求URL位置的资源,即改变该处资源的部分内容
DELETE:请求删除URL位置的资源 -
request库与之对应的方法:
requests.request():构造一个请求,支撑以下各个基础方法
requests.get():获取HTML网页的主要方式,对应HTTP的GET
requests.head():获取HTML网页头部信息,对应HTTL 的HEAD
requests.post():向服务器提交表单
requests.put():向服务器请求提交更新数据,并覆盖原来的数据
requests.patch():向服务器提交局部修改请求
requests.delete():向服务器提交删除请求
三、requests库中请求方法的参数
requests.request(method,url,**kwargs)
必选参数:
method:字符串类型,设置HTTP协议对资源的操作方式,若使用了其他6种请求方法,则不需要设置此参数
url:字符串类型,请求链接
可选参数 kwargs(13个控制访问参数):
- data:字典、字节或文件对象,POST常用请求提交数据的参数
# 参数 data 示例
kv = {'key1: value1','key2: value2'}
r = requests.requests('POST','https://www.baidu.com',data=kv)
或
kv = {'key1: value1','key2: value2'}
r = requests.post('https://www.baidu.com',data=kv)
- cookies:字典、CookieJar类型,提交cookie信息
# 参数 cookies 使用示例
cookie = {'username':'admin','password':'123456'}
r=requests.request('GET','https://passport.baidu.com/v2/?login',cookies=cookie)
- json:JSON格式的数据,作为Resquests的内容
- headers:设置请求头,可模拟任何我们想要模拟的浏览器向服务器发起访问
# 参数 headers 模拟Chrome示例
hd = {'user-agent':'Chrome/10'}
r=requests.request('GET','https://www.baidu.com',headers=hd)
- params:GET请求传递的参数
用此传递参数链接形式为:URL?key1=value1&key2=value2
# 参数 params 示例
kv = {'key1: value1','key2: value2'}
r = requests.requests('GET','https://www.baidu.com',params=kv)
或
kv = {'key1: value1','key2: value2'}
r = requests.get('https://www.baidu.com',params=kv)
- auth:元组类型,支持http的认证功能
- files:字典类型,传输文件
# 参数 files 示例
fs = {'file': open('data.txt', 'rb')}
r = requests.requests('POST','https://baidu.com',files=fs)
- timeout:设置超时时间,秒为单位,
当网站的robots协议设置了禁止一切user-agent进行爬虫时,可使用此参数,模拟人浏览网页
# 参数 timeout 模拟示例
r = requests.requests('GET','https://baidu.com',timeout=30)
- proxies:字典类型,设定访问代理服务器,可以增加登录认证
- allow_redirects:bool型,默认为True 重定向开关
- stream:True/Flase 默认为Ture 获取内容立即下载开关
- verify:bool型,默认为True,认证ssl证书开关
- cert:本地ssl证书路径
四、requests库的6种异常处理
requests库通过 rasie_for_status() 判断状态码,若状态码不是200则引发异常
requests库有6中异常:
requests.ConnectionError:网络连接错误,如DNS查询失败,拒绝连接
requests.HTTPError:HTTP错误
requests.URLRequired:ULR缺失异常
requests.TooManyTedirects:超过最大重定向次数,产生重定向异常
requests.ConnectTimeout:连接远程服务器超时异常
requests.Timeout:请求URL超时,产生超时异常
五、requests库的请求响应内容
r = requests.request(method,url,**kwargs)
r.encoding:获取当前编码,从HTTP头猜测编码方式,如果header中不存在charset,默认编码为ISO-8859-1
# 设置编码为utf-8
r.encoding = 'utf-8'
r.apparent_encoding:根据网页内容分析出编码方式,比上一方式要花费多一点的时间
# 根据网页内容设置编码
r.encoding = r.apparent_encoding
r.text:以encoding解析返回内容,字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.content:以字节形式(二进制)返回,字节方式的响应体,会自动解码 gzip 和 deflate 压缩
r.headers:以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.status_code:响应状态码
r.raw:返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()
r.ok:查看r.ok的布尔值便可以知道是否登陆成功
#特殊方法#
r.json():Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,否则解析出错会抛出异常
r.raise_for_status():失败请求(非200响应),抛出异常
六、requests库网页爬取通用框架:
在爬虫时,最好使用异常处理,即使出现错误,也返回和设定结果相同数据类型的对象,使程序能正常运行
try:
r = requests.get(url,timeout=20)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return 'error'
七、requests库简单爬虫实例
以下为简单下载图片实例,因为获取的是二进制数据,如果URL中的文件扩展名正确,音频和视频文件也基本可以下载
# python requests库 图片爬取
import requests
import os
url = 'http://images.china.cn/attachement/jpg/site1000/20151229/001aa0bce27417ec5dc436.jpg'
root = 'D:/download/'
# 将URL中的图片名设为保存文件的名字,即 001aa0bce27417ec5dc436.jpg
save_path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(save_path):
r = requests.get(url,timeout=30)
r.raise_for_status()
with open(save_path,'wb') as f:
f.write(r.content)
f.close()
print('file be saved successfully')
else:
print('file already exist')
except:
print('error')