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网页提交局部修改请求,对应于HTTP的PATCH |
| requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
与HTTP协议一一对应
简单的使用
1 | import requests |
重要方法 : requests.request()
原型 : requests.request(method,url,**kwargs)
method : 对应http的七种请求方法:get,post,put,delete等
url : 请求的url链接
**kwargs : 控制访问的参数
当查看其它方法,如get()、post()的源代码时,可以发现它们其实都是对request()方法的封装。
常用方法 : get() , head() , post()
因为安全的原因,一般不会支持对url资源的操作,所以像put,delete,patch,option请求都不常用。
requests.get()
原型 : requests.get(url,params=None,**kwargs)
url : 请求的url链接
params : url中的额外参数,字典或字节流格式,可选
**kwargs : 控制访问的参数
get请求方式因为参数是显式存在于url上所有传参可以这样写
方法一:
1 | url = "https://www.baidu.com/s?wd=python" |
方法二:
1 | url = "https://www.baidu.com/s" |
两种方法执行结果都是
https://www.baidu.com/s?wd=python
requests.post()
原型 : requests.post(url,data=None, json=None, **kwargs)
url : 请求的url链接
data : 请求的内容,可以是字典,字节序列或文件
json : JSON格式数据,也是请求的内容
**kwargs : 控制访问的参数
当POST字典时
1 | url = ... |
会自动编码成form表单
当POST字符串时
1 | url = ... |
会自动编码成data
requests.head()
原型 : requests.head(url, **kwargs)
url : 请求的url链接
**kwargs : 控制访问的参数
只要header时使用
控制访问参数
| 参数 | 说明 |
|---|---|
| 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证书路径 |
headers选项
自定义head头
1 | hd = {'user‐agent': 'Chrome/10'} |
cookies选项
带cookies访问
1 | ck = {'user': 'admin'} |
proxies选项
设置代理
1 | pxs = { |
Response对象
可以在交互式窗口使用dir(object)查看对象的属性和方法
1 | >>>r=requests.get("https://www.baidu.com") |
常用属性
| 属性 | 说明 |
|---|---|
| r.headers | HTTP响应头 |
| r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
| r.text | HTTP响应内容的字符串形式,即url对应的页面内容 |
| r.encoding | 从HTTP header中猜测的响应内容编码方式 |
| r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
| r.content | HTTP响应内容的二进制形式 |
编码问题
爬取中文页面时特别注重编码问题
r.encoding是从charset中判断编码,若头中没有则认为编码是ISO‐8859‐1
r.apparent_encoding则是从内容中分析出编码方式
所以一般都可以这么写
1 | r.encoding = r.apparent_encoding |
当然也可以自己指定
1 | r.encoding = 'utf-8' |
异常
Requests异常
| 异常 | 说明 |
|---|---|
| requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
| requests.HTTPError | HTTP错误异常 |
| requests.URLRequiredURL | 缺失异常 |
| requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
| requests.ConnectTimeout | 连接远程服务器超时异常 |
| requests.Timeout | 请求URL超时,产生超时异常 |
Response异常
r.raise_for_status()
当状态码不是200时都会产生requests.HTTPError异常
处理
爬网页应该是准确的,所以来个302跳转都不行
而且”网络连接有风险,异常处理很重要”
1 | try: |
通用爬取框架
1 | import requests |