《开发哲学》
- Beautiful is better than ugly.(美丽优于丑陋)
- Explicit is better than implicit.(直白优于含蓄)
- Simple is better than complex.(简单优于复杂)
- Complex is better than complicated.(复杂优于繁琐)
- Readability counts.(可读性很重要)
一、安装Requests
命令行窗口cmd
pip install requests
二、requests库的7个主要方法
方法
|
说明
|
requests.requests()
|
构造一个请求,支撑一下个方法的基础方法
|
requests.get()
|
获取HTML网页的主要方法,对应与HTTP的GRT |
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
|
1、requests的get()方法
HTTP的常用请求是GET和POST,Requests对此区分两种不同的请求方式。GET请求有两种形式,分别是不带参数和带参数,以百度为例:
#不带参数
https://www.baidu.com/
#带参数wd
https://www.baidu.com/s?wd=python
判断URL是否带有参数,可以对符号“?”判断。一般网址末端(域名)带有“?”就说明URL是带有参数的,反之则不带有参数。GET参数说明如下:
- wd是参数名,参数名由网站(服务器)规定。
- python是参数值,可由用户自行设置。
- 如果一个URL有多个参数,参数之间用“&”连接。
Requests实现GET请求,对于带参数的URL有两种请求方式:
import requests
#第一种方式
r=requests.get('https://www.baidu.com/s?wd=python')
#第二种方式
url='https://www.baidu.com/s'
params={'wd':'python'}
#左边params在GET请求中表示设置参数
r=requests.get(url,params=params)
#输出生成的URL
print(url)
get ()方法的返回值是一个Response对象,Response作为服务器对get()响应的结果,具有自己的属性和方法。
Response对象的主要属性如下:
属性 | 说明 |
status_code | HTTP请求的返回状态码,200表示链接成功,404表示失败 |
text | HTTP响应内容的字符串形式,即URL对应页面内容 |
encoding | HTTP响应的编码方式 |
content | HTTP响应内容的二进制形式 |
headers | 返回一个字典,内容是服务器的响应头 |
url | 返回请求的URL |
apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
encoding和apparent_encoding的区别
encoding:如果header中不存在charset,则认为编码为ISO-8859-1
apparent_encoding根据网页内容分析出的编码方式
apparen_encoding更为准确
2、requests的post()方法
Post请求是我们常说的提交表单,表单的数据内容就是POST的请求参数。Requests实现POST请求需设置请求参数data,数据格式可以是字典,元组,列表和JSON格式,不同的数据格式有不同的优势。代码如下:
# 字典类型 data = { 'key1': 'value1', 'key2': 'value2' } # 元组组成列表 ({'key1','value1','key2','value2'}) # JSON import json data = {'key1': 'value1', 'key2': 'value2'} # 将字典转换JSON data = json.dumps(data) # 发送POST请求 r = requests.post('https://www.baidu.com/', data=data) print(r.text)
可以看出,左边的data是POST方法的参数,右边的data是发送请求到网站(服务器)的数据,值得注意的是,Requests的GET和POST方法的请求参数分别是params和data,别混淆两者的使用要求。
当向网站(服务器)发送请求时,网站会返回相应的响应(response)对象,包含服务器响应的信息。Requests提供以下方法获取响应内容:
- r.status_code 响应状态码
- r.raw 原始响应体,使用r.raw.read()读取
- r.content 字节式的响应体,需要进行解码。
- r.text 字符串式的响应体,会自动根据响应头部的字符编码进行解码。
- r.headers 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写, 若键不存在,则返回None。
- r.json() Requests中内置的JSON解码器。
- r.raise_for_status() 请求失败(非200响应),抛出异常。
- r.url 获取请求链接。
- r.cookies 获取请求后的cookies。
- r.eccoding 获取编码格式。
二、理解requests库的异常
异常
|
说明
|
requests.ConnectionError |
网络连接错误异常,如DNS查询失败,拒绝连接等
|
requests.HTTPRrror | HTTP连接错误异常 |
requests.URLRrror
|
URL缺失异常 |
requests.TooManyRedirecrs
|
超过最大重定向次数,产生重定向异常
|
requests.ConnectTimeout
|
连接远程服务器超时异常
|
requests.Timeout
|
请求URL超时,产生超时异常
|
三、爬取网页的通用代码框架
import requests def getHTMLText(url): try: r = requests.get(url,timeout=30) r = raise_for_status() #如果状态不是200,引发HTTPError异常 r.encoding = r.apparent_encoding return r.text except: return '产生异常' url = "http://www.baidu.com" print(getHTMLText(url))