requests模块
Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
1.安装requests模块
pip install requests
#常用属性
#response = requests.get(url)
#response.text
#response.content
#response.encoding
#response.apparent_encoding
#response.status_code
# 301 永久重定向
# 302 临时重定向
#response.cookies.get_dict()
2.Get请求
没有参数的下载本站的主页
import requests
import codecs
#引入codecs模块是在写入文件设置编码。
ret = requests.get('https://www.benzhu.xyz')
print(ret.url+"\n")
helloFile = codecs.open("G:\\javaio\\demo.html","w",'utf-8')
#下载文件在G:\javaio\
helloFile.write(ret.text)
helloFile.close()
# print(ret.text)
带参数的下载:
import requests
import codecs
payload = {'s':'图床'}
ret = requests.get('https://www.benzhu.xyz/', params=payload)
print(ret.url)
# print(ret.text)
helloFile = codecs.open("G:\\javaio\\demo2.html","w",'utf-8')
#下载文件在G:\javaio\
helloFile.write(ret.text)
helloFile.close()
获取状态:
import requests
response = requests.get("http://www.baidu.com")
#输出reponse的对象类型
print(type(response))
#输出网页的状态码
print(response.status_code)
#输出reponse.text的对象类型
print(type(response.text))
#输出reponse.text的长度
print(len(response.text))
#输出reponse的cookies
print(response.cookies)
#请求头的对象类型
print(type(response.headers))
#关于requests后面跟的text() 与content() 的区别
#requests.text返回的是处理过的Unicode型的数据,而使用r.content返回的是bytes型的原始数据。
# 也就是说,r.content相对于r.text来说节省了计算资源,r.content是把内容bytes返回. 而r.text是decode成Unicode。
# 如果headers没有charset字符集的化,text()会调用chardet来计算字符集。
print(type(response.content))
#请求的URL
print(response.url)
print(response.history)
print(response.reason)
#编码 requests会从服务器返回的响应头的 Content-Type 去获取字符集编码,
# 如果content-type有charset字段那么requests才能正确识别编码,否则就使用默认的 ISO-8859-1.
# 一般那些不规范的页面往往有这样的问题
print(response.encoding)
#编码 apparent_encoding函数, apparent_encoding通过调用chardet.detect()来识别文本编码
print(response.apparent_encoding)
#请求的方式
print(response.request)
3.POST请求
基本的POST实例:
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://httpbin.org/post", data=payload)
print(ret.text)
发送请求头和数据实例:
import requests
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}
#将字典转化为json格式的数据
ret = requests.post(url, data=json.dumps(payload), headers=headers)
print(ret.text)
print(ret.cookies)
4.解析json
获得的数据转为为json格式的数据
import requests
import json
response = requests.get("http://httpbin.org/get")
print(response.json())
print(json.loads(response.text))
5.二进制文件的保存
保存本站的logo
import requests
response = requests.get("https://www.benzhu.xyz/wp-content/uploads/2017/11/QQ截图20170622203553.png")
print(type(response.text))
#保存文件到G:\javaio文件夹中
with open("G:\\javaio\\favicon.png", "wb") as f:
f.write(response.content)
6.文件上传
上传logo案例
import requests
files = {"file": open("G:\\javaio\\favicon.png", "rb")}
response = requests.post("http://httpbin.org/post", files=files)
print(response.status_code)
print(response.text)
7.获取cookies
获取百度的cookies
import requests
response = requests.get("http://www.baidu.com")
print(response.cookies)
for key, value in response.cookies.items():
print("{key} = {value}".format(key=key, value=value))
8.session
session对象可以模拟浏览器请求,保存cookie:
import requests
response = requests.get("http://httpbin.org/cookies/set/number/123456789")
print("第一次请求"+response.text)
# "number": "123456789"
response = requests.get("http://httpbin.org/cookies")
print("第二次请求"+response.text)
#session对象模拟浏览器请求
session = requests.Session()
response = session.get("http://httpbin.org/cookies/set/number/123456789")
print("第一次请求"+response.text)
# "number": "123456789"
response = session.get("http://httpbin.org/cookies")
print("第二次请求"+response.text)
# "number": "123456789"
9.证书验证
import requests
import urllib3
response = requests.get("https://www.12306.cn/")
# CERTIFICATE_VERIFY_FAILED
print(response.status_code)
## 取消验证
urllib3.disable_warnings()
# 消除 warning
response = requests.get("https://www.12306.cn/", verify=False)
# InsecureRequestWarning
print(response.status_code)
# 200
# 指定cert证书
response = requests.get("https://www.12306.cn/", cert="path")
print(response.status_code) # 200
10.使用代理
使用代理进行访问
def foo17():
proxies = {
"http": "http://127.0.0.1:8000",
"https": "https://127.0.0.1:8000"
}
response = requests.get("https://www.12306.cn/", proxies=proxies)
print(response.status_code) # 200
# 使用需要登录的代理
def foo18():
proxies = {
"http": "http://user:password@127.0.0.1:8000"
}
response = requests.get("https://www.12306.cn/", proxies=proxies)
print(response.status_code) # 200
# 使用socks代理
# 安装: pip install requests[socks]
def foo19():
proxies = {
"http": "socks5://127.0.0.1:8000",
"https": "socks5://127.0.0.1:8000",
}
response = requests.get("https://www.12306.cn/", proxies=proxies)
print(response.status_code) # 200
11.超时设置
访问超时设置:
import requests
from requests.exceptions import ConnectTimeout
#超时设置
try:
# response = requests.get("https://www.google.com.hk/", timeout=0.1)
response = requests.get("https://www.benzhu.xyz/", timeout=0.1)
print(response.status_code)
except ConnectTimeout as e:
print("链接超时")
12.登陆验证
def foo21():
from requests.auth import HTTPBasicAuth
response = requests.get("http://www.goole.com/",
auth=HTTPBasicAuth("user", "password"))
print(response.status_code)
# 也可以
def foo22():
response = requests.get("http://www.goole.com/",
auth=("user", "password"))
print(response.status_code)
13.异常处理
import requests
from requests.exceptions import ConnectTimeout, Timeout, RequestException
try:
response = requests.get("http://www.google.com/", timeout=0.1)
print(response.status_code)
except ConnectTimeout: # 子类异常
print("ConnectTimeout")
except Timeout: # 父类异常
print("Timeout")
except RequestException: # 基类异常
print("RequestException")
14.requests库下载大文件
当使用requests的get下载大文件/数据时,建议使用使用stream模式。
当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足。
当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。
iter_content:一块一块的遍历要下载的内容
iter_lines:一行一行的遍历要下载的内容
使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。
import requests
r = requests.get("https://www.benzhu.xyz/wp-content/uploads/2017/02/DJ-Siesta-Another-Day-纯音乐版-5.mp3", stream=True)
# chunk是指定每次写入的大小,每次只写了512byte
with open("G:\\javaio\\纯音乐.mp3", "wb") as f:
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
15.使用requests报错
错误内容: .virtualenvs/py3/lib/python3.6/site-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
解决办法:
#在文件顶部加上以下语句就不报错了
import urllib3
urllib3.disable_warnings()
评论