requests简介
相比urllib和urllib3,更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便。
Keep-Alive & 连接池
国际化域名和 URL
带持久 Cookie 的会话
浏览器式的 SSL 认证
自动内容解码
基本/摘要式的身份认证
优雅的 key/value Cookie
自动解压
Unicode 响应体
HTTP(S) 代理支持
文件分块上传
流下载
连接超时
分块请求
支持 .netrc
requests库常用模块
|-------------------|----------------------------|
| 模块名称 | 描述 |
| requests.Request | 表示请求对象,用于准备一个请求发送到服务器。 |
| requests.Response | 表示响应对象,其中包含服务器对HTTP请求的响应。 |
| requests.Session | 表示请求会话,提供Cookie持久性、连接池和配置。 |
Request类的对象表示一个请求,它的生命周期针对一个客户端请求,一旦请求发送完毕,该请求包含的内容就会被释放掉。
Session类的对象可以跨越多个页面,它的生命周期同样针对的是一个客户端。
requests库初体验
urllib发送get请求
python
# 导入请求和解析模块
import urllib.request
import urllib.parse
# 请求的URL路径和查询参数
url = "http://www.baidu.com/s"
word = {"wd":"Python网络爬虫"}
# 转换成url编码格式(字符串)
word = urllib.parse.urlencode(word)
# 拼接完整的URL路径
new_url = url + "?" + word
# 请求报头
headers ={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
# 根据URL和headers构建请求
request = urllib.request.Request(new_url, headers = headers)
# 发送请求,并接收服务器返回的文件对象
response = urllib.request.urlopen(request)
# 使用read方法读取获取到的网页内容,使用UTF-8格式进行解码
html = response.read().decode('UTF-8')
print(html)
requests发送get请求
python
# 导入requests库
import requests
# 请求的URL路径和查询参数
url = "http://www.baidu.com/s"
param = {"wd": "Python网络爬虫"}
# 请求报头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/51.0.2704.103 Safari/537.36"
}
# 发送GET请求,返回一个响应对象
response = requests.get(url, params=param, headers=headers)
# 查看响应的内容
print(response.text)
便捷之处:
无须再转换为URL路径编码格式,拼接完整的URL路径。
无须再频繁地为中文转换编码格式。
从发送请求的函数名称,可以很直观地判断发送到服务器的方式。
发送HTTP请求的函数
|--------------------|-------------------------------------|
| 函数 | 功能 说明 |
| 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请求方式 |
这些函数都会做两件事情
1、构建一个Request类的对象,该对象将被发送到某个服务器上请求或者查询一些资源;
2、一旦得到服务器返回的响应,就产生一个Response对象,该对象包含了服务器返回的所有信息,也包括原来创建的Request对象。
requests的response响应
Response类用于动态地响应客户端的请求,控制发送给用户的信息,并且将动态地生成响应,包括状态码、网页的内容等。
|-------------------|-------------------------------|
| 属性 | 说明 |
| status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
| text | HTTP响应内容的字符串形式,即URL对应的页面内容 |
| encoding | 从HTTP请求头中猜测的响应内容编码方式 |
| apparent_encoding | 从内容中分析出的响应编码的方式(备选编码方式) |
| content | HTTP响应内容的二进制形式 |
当请求发出之后,Requests库可以找出它使用了什么编码,并且可以设置encoding 属性进行改变。
python
>>> response.encoding
'utf-8'
>>> response.encoding = 'ISO-8859-1'
再次调用text属性获取返回的文本内容时,将会使用上述设置的新的编码方式。
案例--搜索豆瓣电影
python
# 导入requests库
import requests
# 请求的URL路径和查询参数
#https://search.douban.com/movie/subject_search?search_text=python&cat=1002&start=30
page = 3
url = "https://search.douban.com/movie/subject_search"
param = {"search_text": "Python","start":15*(page-1),"cat":1002}
# 请求报头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/51.0.2704.103 Safari/537.36"
}
# 发送GET请求,返回一个响应对象
response = requests.get(url, params=param, headers=headers)
# 查看响应的内容
print(response.text)
with open("douban.html", "w", encoding="utf-8") as f:
f.write(response.text)