Requests库是Python的第三方库,是公认的最好的网络爬取的库。本文将对Requests库的学习(MOOC中国大学课程)做一个总结,对Requests库做一个全面的解释。以下的讲解按照如下的目录顺序进行,所有内容在不断的学习和更新中。
1.Requests库的功能介绍
2.Requests库的安装
3.Requests库的7种常用方法
3.1最基础的方法—request()方法
3.1.1 method访问请求方法
3.1.2 **kwrgs控制访问参数类型
3.2最常用的方法—get()方法
3.3其他的常用5种方法
按照我个人的理解,Requests库是Python的一个第三方库,主要的功能是让人们可以提取网页的内容,通过HTTP协议获取网络上的资源,侧重点在于获取资源和提交资源。该库本身不包含对资源的解析和应用。更多资料可以参考Reuqests库的官方网址。
在完成Python的安装之后,Python的安装可以参照【Python安装详细步骤】
即可使用pip快读进行Python各个库的安装,在开始按钮中搜索cmd,并用用管理员身份打开cmd命令行窗口
使用如下的pip安装命令完成Requests库的安装
pip install requests
requests.request(method,url,**kwargs)
其中
method是请求方法,对应get/put、post等7种
URL是拟获取页面的链接
**kwargs是访问控制参数,共13个
以下分别做介绍
method的7中请求方法与HTTP协议的7中访问方式对应,分别是GET、HEAD、POST、PUT、PATCH、delete、OPTIONS.
r = requests.request('GET',url,**kwrgs)
r = requests.request('HAED',url,**kwrgs)
r = requests.request('POST',url,**kwrgs)
r = requests.request('PUT',url,**kwrgs)
r = requests.request('PATCH',url,**kwrgs)
r = requests.request('DELETE',url,**kwrgs)
r = requests.request('OPTIONS',url,**kwrgs) #向服务器获取客户端和服务器间通信的相关参数
为了更好的理解method访问请求方法,我们需要首先理解HTTP协议,因为HTTP协议的访问请求方法与此处的method请求方法基本一致。
HTTPHypertext Transfer Protocol超文本传输协议:它是一种基于“请求与响应”模式的、无状态的应用层协议。用户发起请求,服务器做相应的响应,无状态是指前一次请求和后一次请求没有关联。HTTP协议分为两个主要部分:①URL,②HTTP协议对资源的操作方法。简单来说,HTTP其实就是请求资源与获得资源的过程,其中URL是起到定位资源的作用,而②提供对资源的操作方法。①和②结合起来就能组成HTTP协议的主要结构。
①HTTP协议规定URL格式http://host[:port][path]。host是合法Internet主机域名或IP地址;port是端口号,可以省略,默认为80;path是服务器上包含的内部路径。例如http://10.3.8.211/duty
②HTTP协议对资源共有6种操作方法,分别是GET、HEAD、POST、PUT、PATCH、DELETE
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源
控制访问参数共有13个,他们分别是params、data、json、headers、cookies、auth、files、timeout、proxies、allow_redirects、stream、verif和cert。他们均为可选项,下面进行逐一的介绍。
① params:字典或字节序列,作为参数增加到URL中。可以将键值对的内容加到URL中,例如下面的例子,将params等于键值对kv,则在最后输出的URL中发现,多了一个问号,而且在问号之后有之前设置的键值对。>>> kv = {'key1':'value1','key2':'value2'}
>>> r = requests.request('GET','http://python123.io/ws',params=kv)
>>> print(r.url)
http://www.baidu.com/ws?key1=value1&key2=value2
② data:字典、字节序列或文件对象,作为Requests的内容,和params的区别就在于params将内容加到URL中,而data是将内容传送到URL对应的服务器中。
>>> kv = {'key1':'value1','key2':'value2'}
>>> r =requests.request('POST','http://www.baidu.com",data=kv)
>>> body = '主体内容'
>>> r =requests.request('POST',"http://www.baidu.com',data=body)
③ json:JSON格式的数据,作为Request的内容。与data比较像,也是将内容提交到URL对应的服务器中,而且是提交到对应服务器的JSON域。
>>> kv = {'key1':'value1'}
>>> r = requests.request('POST','http://www.baidu.com',json=kv)
④ headers:字典,HTTP定制头,用这个字段定义访问请求的header。该功能主要应用在请求的头定制。
>>> hd = {'user-agent':'Chrome/10'}
>>>r = requests.request('POST','http://www.baidu.com',headers=hd)
⑤ cookies:字典或CookieJar,Request中的Cookie
⑥ auth:元组,支持HTTP认证功能。auth和cookies都是request方法中比较高级的属性。
⑦ files:字典类型,向服务器传输文件时的方法属性,向某一个链接提交某一个文件。
>>> fs ={'file':'data.xls','rb')
>>> r = requests.request('POST','http://www.baidu.com',files=fs)
⑧ timeout:设定超时时间,单位为秒
⑨ proxies:字典类型,设定访问代理服务器,再访问对应的URL时使用代理服务器的IP地址,而隐藏自身真实的IP地址
>>> pxs = { 'http':"http://user:[email protected]:1234','https://10.10.10.1:4321'}
>>>r = requests.request('GET','http://www.baidu.com',proxies=pxs)
当在访问百度时,所使用的IP就是就是代理服务器的IP地址,可以隐藏爬取源的IP地址,有效防止逆追踪
⑩allow_redirects :True/False,默认为True,重定向开关
⑾stream: True/False,默认为True,获取内容立即下载开关
⑿verif: True/False,默认为True,认证SSL证书开关
⒀ cert:本地SSL证书路径
这四个字段分别对应的都是相应的高级功能
r=requests.get(URL,params,**kwargs)
URL: 是拟获取页面的URL链接
params: URL中可选的额外参数,字典或字节流格式,与requests中的params对应
**kwargs: 12个控制访问的参数,与requests中的对应
该方法构造一个向服务器请求资源的Requests对象,返回一个包含服务器资源的Response对象
#Response对象的属性
r.status_code #HTTP请求的返回状态,200表示连接成功,404及其他均表示失败
r.text #HTTP响应内容的字符串形式,即URL对应的页面内容
r.encoding #从HTTP header中猜测的响应内容编码方式
r.apparent_encoding #从内容分析出的响应内容编码方式
r.content #HTTP响应内容的二进制形式
*说明:recoding是从HTTP header中猜测相应内容的编码方式,如果header中不存在charset字段,则会默认为编码为ISO-8859-1。因此有时候由该方法获得的编码方式不一定正确。而apparent_encoding是从响应的内容中分析出来的编码方式,其准确性更高,在使用text属性查看返回内容出现乱码时,可以考虑是否是编码方式猜测错误造成,利用r.encoding= r.apparent_encoding即可完成编码转换,然后即可看到显示正常的页面内容。
get()方法的使用常常按照下面的步骤进行:首先利用status_code属性检查是否连接成功,如果返回200则说明连接成功,下面进行编码设定等操作。
Requests库的剩余5种方法如下,他们各自有各自的功能。
requests.get(url,params=None,**kwrgs)
requests.post(url,data=None,json=None,**kwargs)
requests.put(url,data=None,**kwargs)
requests.patch(url,data=None,**kwargs)
requests.delete(url,**kwargs)