一只倔强的笨猪

【Python】requests模块

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()
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注