安装
pip install requests
requests库的七个主要方法
方法 | 说明 |
---|---|
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 |
requests.get()
r = requests.get(url)
r表示的是Response,返回一个包含服务器资源的Response对象
requests.get表示的是Request,构造一个向服务器请求资源的Request对象
requests.get(url, params=None, **kwargs)
- url : 拟获取页面的url链接(最主要的参数)
- params : url中的额外参数,字典或字节流格式,可选
- **kwargs: 12个控制访问的参数
Response对象的属性
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
requests请求中文时出现乱码:
网络上的资源都有它的编码,否则将很难使用有效的方式对其进行解析。r.encoding获得编码是从http headers中charset中获得的,chrset对其编码都是有要求的,这样的编码会获得回来,存在r.encoding中。但是如果requests没有发现http headers中的charset,就会使用默认的IOS-8859-1(也就是我们常说的latin-1,但是我们一般的网页使用的charset其实是utf-8,所以这种格式不能解析中文,反馈的结果中文就会成为乱码)
下面介绍两种编码的区别
属性 | 说明 |
---|---|
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
从上面表格可以得出,r.encoding是从HTTP header中猜测的响应内容编码方式,而r.apparent_encoding是从内容中分析出的响应内容编码方式。对于包含中文的网页,上面已经分析过如果HTTP header中不包含charset,就会默认采用IOS-8859-1,造成中文乱码,r.apparent_encoding则会根据对内容进行判断,输出为utf-8。
r.encoding:如果header中不存在charset,则认为编码为ISO‐8859‐1, r.text根据r.encoding显示网页内容
r.apparent_encoding:根据网页内容分析出的编码方式, 可以看作是r.encoding的备选
爬取网页的通用代码框架
理解requests库的异常
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
r.raise_for_status()在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try‐except进行异常处理
异常 | 说明 |
---|---|
r.raise_for_status() | 如果不是200,产生异常 requests.HTTPError |
爬取网页通用代码框架
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout = 30)
r.raise_for_status() #如果不是200,产生异常 requests.HTTPError
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
运行结果:
通过这个框架可以有效的处理在对网页爬取过程中出现的错误或者是网络不稳定产生的原因等进行判断。
HTTP协议及requests库方法
HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议,HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
http://host[:port][path]
- host: 合法的Internet主机域名或IP地址
- port: 端口号,缺省端口为80
- path: 请求资源的路径
HTTP URL的理解:
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源,与电脑上资源对应路径类似。
HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |