一、Requests库的基本说明
引入Rquests库的代码如下
import requests
库中支持REQUEST, GET, HEAD, POST, PUT, PATCH, DELETE共7个方法。其中REQUEST方法为基础方法,其它六种方法均通过调用REQUEST方法实现。为了编写程序的便利性,提供了这额外6个方法。我们首先看一下这6个方法的含义,及其在库中对应的函数:
- GET:请求指定的页面信息,对应requests.get()
- HEAD:只请求页面的头部,对应requests.head()
- POST:请求服务器接收所指定的文档作为对所标识的URI的新的从属实体,对应requests.post()
- PUT:从客户端向服务器取代指定的文档的内容,对应requests.put()
- PATCH:与PUT功能类似,不同之处在于PUT提交信息的方式是截断的,而PATCH可以进行局部更新。因此与PUT相比,在某些情况下,PATCH可以节省网络带宽。对应requests.patch()
- DELETE:请求服务器删除指定页面,对应requests.delete()
Requests库支持以下6种访问异常:
- ConnectionError:网络连接错误异常,如DNS查询失败、拒绝连接等
- HTTPError:HTTP错误异常
- URLRequired:URL缺失异常
- TooManyRedirects:超过最大重定向次数,产生重定向异常
- ConnectTimeout:连接远程服务器超时异常
- Timeout:请求URL超时,产生超时异常
二、HTTP协议简介
HTTP(Hypertext Transfer Protocol),指超文本传输协议。这一一种基于“请求与相应”模式的无状态的应用层协议(工作在TCP协议之上)。所谓“无状态”,是指多次请求之间并没有关联。HTTP协议采用URL作为定位网络资源的标识,其格式如下:
http://host[:port][path]
- host:合法的Internet主机域或IP地址
- port:端口号,缺省为80
- path:请求资源的路径
HTTP协议对资源的操作方法即为Requests库支持的6个方法(GET, HEAD, POST, PUT, PATCH, DELETE)。
三、Requests库函数详解
3.1 requests.request()
request()函数接受的参数如下:
requests.request(method, url, **kwargs)
其中method为请求方式,对应为'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'delete', 'OPTIONS'七种方式。
**kwargs为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证书路径
通过几段运行实例来理解控制访问参数:
params:字典或字节序列,可以作为参数增加到url中。
data的格式为字典、字节序列或文件对象,作为Request的内容。
headers格式为字典,可以为HTTP定制头。
files为字典类型,可用于传输文件。
proxies为字典类型,设定访问代理服务器,可以增加登录认证。
掌握了request(),对接下来的封装函数的理解就十分简单了。
3.2 requests.get()
此方法最为常用。最简单的用法即为
r=requests.get(url)
此处,get()构造了一个向服务器请求资源的Request对象(在Requests库内部生成)。函数返回一个包含服务器所有相关资源的Response对象。
get()函数完成的参数列表如下
requests.get(url, params = None, **kwargs)
- url:逆获取页面的url链接
- params:在url中增加的额外参数,格式为字典或者字节流,此参数是可选的
- **kwargs:其它12个控制访问的参数,也是可选的
正如前文所述,从get()的如下封装源代码可以看出,它是调用request()来封装的。
def get(url, params = None, **kwargs): kwargs.setdefault('allow_redirects', True) return request('get', url, params = params, **kwargs)
下面我们来看一段运行实例。
其中,status_code是Response对象的属性之一。Response对象比较重要的几项属性罗列如下:
- status_code:HTTP请求的返回状态,e.g.200表示成功,404表示失败
- text:HTTP相应内容的字符串形式,即url对应的页面内容
- encoding:从HTTP header中猜测响应内容的编码方式
- apprent_encoding:从内容分析出的响应内容编码方式(备选编码)
- content:HTTP响应内容的二进制形式
基于此,我们给出爬取网页的一个通用代码框架:
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 "exception detected" if __name__ == "__main__": url = "http://www.baidu.com" print(getHTMLText(url))
其中,raise_for_status()方法可以判断返回的Response对象是否出现异常。如果返回状态不是200,产生requests.HTTPError。
3.3 requests.head()
head()的参数列表如下:
requests.head(url, **kwargs)
其中**kwargs为13个控制访问参数,同request()。
head()的含义如前所述,通过一段运行实例可以更好地理解。
从实例中看到,运用head()爬取了百度首页的头部信息。但是如果我们想要得到网页文本内容,返回值则为空。
3.4 requests.post()
post()参数列表如下:
requests.post(url, data = None, json = None, **kwargs)
其中,**kwargs为其余11个控制访问参数。
下面来比较两段运行实例:
事实上,当下我们向URL post一个字典时,会自动被编码为form(表单)。
3.5 requests.put()
requests.put(url, data=None, **kwargs)
其中,**kwargs为其余12个控制访问参数。
下面是一段运行实例:
3.6 requests.patch()
requests.patch(url, data=None, **kwargs)
**kwargs为其余12个控制访问参数。
3.7 requests.delete()
requests.delete(url, **kwargs)
url为拟删除页面的ur链接。**kwargs为13个控制访问参数。
相关内容为笔者根据中国大学MOOC网站嵩天教授的python爬虫课程所撰写的学习笔记,感谢中国MOOC学习平台提供的学习资源与嵩老师的授课。