Python爬虫中,除了urlib()外,还有一个使用的比较多的HTTP请求库——requests。这个库也是常用于HTTP请求模块,它使用Python语言编写,可以方便的对网页进行爬取,是学习Python比较好的HTTP请求模块。
Python3中没有默认安装requests库,在前一篇文章中,已经介绍了requests的安装。其中,requests库的pip安装命令为 pip install requests 。
接下来,我们来看看requests库的7个主要方法,如下表所示:
方法 | 解释 |
requests.request() | 构造一个请求,支持以下各种方法 |
requests.get() | 获取HTML的主要方法 |
requests.head() | 获取HTML头部信息的主要方法 |
requests.post() | 向HTML网页提交POST请求的方法 |
requests.put() | 向HTML网页提交PUT请求的方法 |
request.patch() | 向HTML提交局部修改请求 |
request.delete() | 向HTML提交删除请求 |
1. requests.get()
requests.get()方法时常用方法之一,用户获取HTML。我们可以通过该方法链接其他方法,格式如下:
1 res = requests.get(url , params ,**kwargs)
参数说明见下表:
参数 | 描述 |
url | 需要爬取的网站地址 |
params | URL中的额外参数,字典或字节流格式,为可选参数。 |
**kwargs |
控制访问参数,具体详见下表。 |
参数名称 | 描述 |
params | 字典或字节列,作为参数增加到url中,使用这个参数可以把一些键值对以?key=value1&key2=value2的模式增加到url中。 |
data | 字典、列表或元组的字节的文件,作用是向服务器提交资源,作为requests的内容。与params不同的是,data提交的数据并不放在URL链接中,而是放在URL链接对应位置的地方作为数据存储。它也可以接受一个字符串对象。 |
json |
JSON格式的数据,json是HTTP中经常使用的数据格式,作为内容部分可以向服务器提交。例如: 1 kv= {'key1':'value1'} 2 r = requests.request('POST',"http://python123.io/ws",json=kv) |
headers |
字典是HTTP的相关语,对应了向某URL访问时发起的HTTP的头字段,可以用字段来定义HTTP访问的HTTP头,可以用来模拟任何想模拟的浏览器对URL发起访问。例如: 1 hd = {'user-agent':'Chrome/10'} 2 r = requests.requests('POST','http://python123.io/ws',headers=hd) |
cookies | 字典或CookieJar,指的是从HTTP中解析Cookie。 |
auth | 元组,用来支持HTTP认证功能 |
files |
字典,是用来向服务器传输文件时使用的字段。例如 fs = {'files':open('data.txt','rb')} |
timeout | 用于设定超时时间,单位为秒,当发起一个GET请求时可以设置一个timeout时间,如果timeout时间内请求内容没有返回,将产生一个timeout的异常。 |
proxies | 字典,用来设置访问代理服务器。 |
allow_redirects | 开关,表示是否允许对URL进行重定向,默认为True |
stream | 开关,指是否对获取内容进行立即下载,默认为True。 |
verify | 开关,用于认证SSL证书,默认为True。 |
cert | 用于设置保存本地SSL证书路径。 |
前面的示例代码是构造一个服务器请求requests,返回一个包含服务器资源的Response对象。其中Request对象有以下属性,如表3-3所示。
属性 | 说明 |
status_code | HTTP请求的返回状态,若为200表示请求成功 |
text | HTTP响应内容的字符串形式,即返回的页面内容 |
encoding | 从HTTP header中猜测的相应内容编码方式 |
apparent_encoding | 从内容中分析 |
content | HTTP响应内容的二进制形式 |
示例代码如下:
1 import requests; 2 3 url = 'https://www.baidu.com/'; 4 r = requests.get(url); 5 print(r.status_code) 6 print(r.encoding) 7 print(r.apparent_encoding) 8 print(r.text)
运行结果如下图:
2.requests库的异常
requests库有时会产生异常,如网络连接错误、HTTP错误异常、重定向异常、请求URL超时异常等。这里可以利用r.raise_for_status()语句来捕捉异常,该语句在方法内部判断r.status_code是否等于200,如果不等于,则抛出异常,示例代码如下。
1 import requests 2 3 url = 'https://www.baidu.com/'; 4 try: 5 r = requests.get(url , timeout=30) # 请求超时时间为30s 6 r.raise_for_status() # 如果状态不是200则引发异常 7 r.encoding = r.apparent_encoding # 配置编码 8 print(r.text) 9 print(1) 10 except: 11 print("产生异常")
3. requests.head()
通过requests.head()方法,可以获取地址的header头部信息,示例代码如下:
1 import requests 2 3 url = 'https://www.baidu.com/'; 4 r = requests.head(url) 5 print(r.headers)
4. requests.post()
requests.post()反复一般用于表单提交,向指定URL提交数据,可提交字符串、字典、文件等数据,示例代码如下:
1 import requests 2 3 # 向url post 一个字典 4 payload = {"key1":"value1","key2":"value2"} 5 r = requests.post("http://httpbin.org/post",data=payload) # 这里的url 并非真实的请求 6 print(r.text) 7 8 # 向url post 一个字符串,自动编码为data 9 r = requests.post("http://httpbin.org/post",data="hello") # 这里的url 并非真实的请求 10 print(r.text)
5. requests.put()和requests.patch()
requests。patch()和reques.put()类似,两者不同的是:当patch时,仅需提交修改的字段,但put时,必须将20个字段一起提交到URL,未提交的字段将会删除;patch的优点是节省网络带宽,示例代码如下:
1 import requests 2 3 # requests.put 4 payload = {"key1":"value1","key2":"value2"} 5 r = requests.put("http://httpbin.org/put",data=payload) # 这里的url 并非真实的请求 6 print(r.text) 7 8 # requests.post 9 payload = {"key1":"value1","key2":"value2"} 10 r = requests.patch("http://httWpbin.org/patch",data=payload) # 这里的url 并非真实的请求 11 print(r.text)