Requests库的使用
1.requests库概述
??requests库是一个简洁且简单的处理HTTP请求的第三方库,它的最大优点是程序编写过程更接近正常URL访问过程。这个库建立在Python 语言的 urllib3库的基础上,类似这种在其他函数库之上再封装功能、提供更友好函数的方式在Python语言中十分常见。在Python生态圈里,任何人都有通过技术创新或体验创新发表意见和展示才华的机会。requests库支持非常丰富的链接访问功能,包括国际域名和URL获取、HTTP长连接和连接缓存、HTTP会话和Cookie保持、浏览器使用风格的SSL验证、基本的摘要认证、有效的键值对Cookie记录、自动解压缩、自动内容解码、文件分块上传、HTTP(S)代理功能、连接超时处理、流数据下载等。
2.requests库解析
??网络爬虫和信息提交只是requests库能支持的基本功能,本节重点介绍与这两个功能相关的一些常用函数。其中,与网页请求相关的函数如表所示。
????requests库中的网页请求函数(共6个)
函数 | 描述 |
---|
get(url [, timeout=n]) | 对应于HTTP的GET方式,获取网页最常用的方法,可以增加timeout=n参数,设定每次请求超时时间为n秒 | post(url, data = (‘key’:‘value’)) | 对应于HTTP的POST方式,其中字典用于传递客户数据 | delete(url) | 对应于 HTTP的 DELETE方式 | head(url) | 对应于HTTP的HEAD方式 | options(url) | 对应于HTTP的OPTIONS方式 | put(url, data = (‘key’:‘value’)) | 对成于HTTP的PUT方式,其中字典用于传递客户数据 |
??get()是获取网页最常用的方式,在调用requests.get()函数后,返回的网页内容会保存为一个Response对象,其中,get()函数的参数url链接必须采用HTTP或HTTPS方式访问,例如:
>>>import requests
>>>r = requests.get("http://www.baidu.com") #使用get方法打开百度链接
>>>>type(r)
<class 'requests.models.Response'> #返回Response对象
??从爬虫应用角度来看,只需要掌握get()函数即可获取网页。和浏览器的交互过程一样,requests.get()代表请求过程,它返回的Response对象代表响应。返回内容作为一个对象更便于操作,Response对象的属性如表所示。
函数 | 描述 |
---|
status_code | HTTP请求的返回状态,整数,200表示连接成功,404表示失败 | text | HTTP响应内容的字符串形式,即url对应的页面内容 | encoding | HTTP响应内容的编码方式 | content | HTTP响应内容的二进制形式 |
??status_code属性返回请求HTTP后的状态,在处理数据之前要先判断状态情况,如果请求未被响应,需要终止内容处理。text属性是请求的页面内容,以字符串形式展示。encoding属性非常重要,它给出了返回页面内容的编码方式,可以通过对encoding属性赋值更改编码方式,以便于处理中文字符。content属性是页面内容的二进制形式。例如:
>>>r = requests.get("http://www.baidu.com")
>>>r.status_code #返回状态
200
>>>r.text #观察返回的内容,中文字符是否能正常显示
>
>>>r.encoding #默认的编码方式是ISO-8859-1,所以中文是乱码
'ISO-8859-1'
>>> r.encoding = 'utf-8' #更改编码方式为utf-8
>>> r.text #更改完成,返回内容中的中文字符可以正常显示了
??除了属性,Response对象还提供一些方法。
??Response对象的方法(共2个)
函数 | 描述 |
---|
json() | 如果HTTP响应内容包含JSON格式数据,则该方法解析JSON数据 | raise_for_status() | 如果不是200,则产生异常 |
??json()方法能够在HTTP响应内容中解析存在的JSON数据,这将带来解析HTTP的便利。raise_for_status()方法能在非成功响应后产生异常,即只要返回的请求状态status_code不是200,这个方法会产生一个异常,用于try-except语句。使用异常处理语句可以避免设置一堆复杂的f语句,只需要在收到响应时调用这个方法,就可以避开状态字200以外的各种意外情况。
??requests会产生几种常用异常。当遇到网络问题时,如DNS查询失败、拒绝连接等,requests会抛出ConnectionError异常:遇到无效HTTP响应时,requests则会抛出HTTPError异常;若请求 url超时,则抛出Timeout 异常;若请求超过了设定的最大重定向次数,则会抛出一个TooManyRedirects异常。
??获取一个网页内容的函数建议采用如下代码的第2到第9行,第10和第11行是测试代码。
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()#如果状态不是200,引发异常
r.encoding='utf-8'#无论原来用什么编码,都改成utf-8
return r.text
except:
return ""
url = "http://www.baidu.com"
print(getHTMLText(url))
??拓展:HTTP的GET和POST
??HTTP协议定义了客户端与服务器交互的不同方法,最基本的方法是GET和POST。顾名思义,GET可以根据某链接获得内容,POST用于发送内容。然而,GET也可以向链接提交内容,与POST的区别如下。
??(1)GET方式可以通过URL提交数据,待提交数据是URL的一部分;来用POST方式,待提交数据放置在HTML HEADER内。
??(2)GET方式提交的数据最多不超过1024字节,POST没有对提交内容的长度限制。
??(3)安全性问题。使用GET时参数会显示在URL中,而POST不会。所以,如果这些数据是非敏感数据,那么使用GET;如果提交数据是敏感数据,建议采用POST方式。
|