对之前内容的总结和复习
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code)
print(r.headers)
print(r.text)
print(r.encoding) #从header里猜测编码
print(r.apparent_encoding) #从内容中分析出响应内容编码方式(备选编码方式)(解析中文)
r.encoding = 'utf-8'
print(r.text)
print(r.content) #二进制表示
异常处理
对于网页信息获取过程中,我发现一个新的问题:如果在输入网页时没有加上“http://”就会显示错误,所以能够联想到异常处理。
用requests库获得url的相关内容,不一定能连接成功,异常处理很重要。
requests.ConnectionError
#网络连接错误异常,如DNS查询失败,拒绝连接等
requests.HTTPError
#HTTP错误异常
requests.URLRequired
#URL缺失异常
requests.TooManyRedirects
#超过最大重定向次数,产生重定向异常(经常指对一些复杂的连接会出现的错误)
requests.ConnectTimeout
#连接远程服务器超时异常
requests.Timeout
#请求URL超时,产生超时异常(从发出请求到获得整个过程超时)
在运行中可以判断 r 的返回状态(response类型)是否为200
r.raise_for_status()
对于网页信息获取我们可以总结出一种固定的框架
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 "异常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
如果把倒数第二行改成 url = "www.baidu.com",结果就会显示异常。
try中先获取了url并且限制了时间,判断连接是否成功为200,由于是中文网页,可以使用备选编码方式解析中文,最后如果整个过程中都是可以通信完成的,就直接返回html网页的所以内容。
注:关于__name__的用法:
1. 如果模块是被导入,__name__的值为模块名字
2. 如果模块是被直接执行,__name__的值为’__main__’
关于HTTP协议
URL格式 http://host[:port][path]host:合法的Internet主机域名或IP地址
port:端口号,缺省端口为80
path:请求资源路径
HTTP协议对资源的操作
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容