requests简介
requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多
因为是第三方库,所以使用前需要cmd安装
pip install requests
安装完成后import一下,正常则说明可以开始使用了。
详情见官方文档http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
1.简单用法
#导入requests模块
import requests,pprint,json
# requests.get()用于请求目标网站,尝试获取某个网页
r = requests.get('https://api.github.com/')
print(r.status_code) #响应状态码 200
print(r.content) # 二进制的内容
print(r.text) #字符串
print(r.json()) #dict == print(json.loads(r.text)),JSON对象必须是STR、字节或BytErar
print(r.url) #获取url https://api.github.com/
2.请求头headers
# 请求头:就是客户端在访问url的时候也就是请求服务器时,会把一些request headers请求头信息发送给服务器,服务器就可以接收。
'''
作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,
你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,
服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent
请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
'''
user_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \
'(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
header = {'User-Agent':user_Agent}
r = requests.get('https://www.douban.com/',headers= header)
print(r.text)
3.响应headers
# 服务器收到了客户端提出的要求,现在要把数据返回给客户端,还有一些response Headers信息给客服端,所以客户端也能获取到这些信息。
user_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \
'(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
header = {'User-Agent':user_Agent}
r = requests.get('https://www.douban.com/',headers= header)
pprint.pprint(r.headers) #获取响应头
4.url参数以及请求方式
#以微信公众号开发为例:
appID='wx4880f9bc5144a729'
APPsecret='61dac4640b7d16ff19e9cab1ca8c108b'
url = f'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appID}&secret={APPsecret}'
result = requests.get(url).json()
print(result) #微信会返回下述JSON数据包给公众号
access_token = result.get('access_token')
#另一种方式,与上面效果相同
params = {'grant_type':'client_credential','appid':appID,'secret':APPsecret}
url = 'https://api.weixin.qq.com/cgi-bin/token?'
result = requests.get(url,params=params) #获取到access_token
print(result.url)
result = result.json()
print(result) #微信会返回下述JSON数据包给公众号
access_token = result.get('access_token')
#得到我们的access_token,用post去请求
#这里要注意第一次有可能发送失败会报错,需要我们自己先给公众号发送一条信息
#我这里第一次默认发送的是Hello World,所以不会报错,因为hello world 是开发者的共同语言,如过不是可能会有上述问题
url = f'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}'
req_json = {
"touser":"olrK61Ro4DDxdDeU7f47qnmPsL9U", #发给那个用户 这里我们要扫码关注自己的公众号
"msgtype":"text", #类型
"text":
{
"content":"Hello World,你好帅" #发送内容
}
}
req_date = json.dumps(req_json,ensure_ascii=False) #阻止把我们字符串转换为Unicode \u4e2d\u56fd 防止转换,默认True
json.dumps() #方法返回一个str,内容就是标准的JSON
rsp = requests.post(url,data=req_date.encode('utf-8'))
# 传递的时候只能传递01010
# 如果data是字符串requests会进行encode的操作,而他使用的编码类型不受控制
# 所以我们可以自己制定编码类型,把字符串转换成二进制数据
print(rsp.json())
5.要判断响应的状态码是否异常(非2…非3…)
url1 = 'http://localhost:8080/500'
rsp = requests.get(url1)
rsp.raise_for_status() #会抛出 HTTPError的异常,因为响应状态码是500
print(rsp.status_code) #500
print(rsp.json())
'''
状态码解释,有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--信息不完整需要进一步补充
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
详情见:https://blog.csdn.net/GarfieldEr007/article/details/77984065
'''
6.cookie的处理
#为什么要有Cookie? 因为HTTP协议是无状态的
概念:
简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。
当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,
都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,
就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。
重要:
服务器 响应的headers包含set_cookie, 浏览器根据set_cookie的值存储浏览器缓存中
下一次浏览器再访问的时候,会读取存储的cookie信息,把他放到Cookie的请求头里面
对应服务器就知道你谁谁了
url = 'http://localhost:8080/set/cookie'
r = requests.get(url)
#查看响应设置的cookie
for k,v in r.cookies.items():
print(k,v)
# # 由于http协议是无状态的,这里打印的结果是:没有得到之前设置的cookie
url = 'http://localhost:8080/has/cookie'
r = requests.get(url)
print(r.text) #响应的headers包含set_cookie 这里我们没有加
#针对上述问题,就延伸出会话保持session
session = requests.Session() #存储Cookie
r = session.get('http://localhost:8080/set/cookie')
print(r.text) #设置cookie
for k,v in r.cookies.items():
print(k,v) #username gavin
url = 'http://localhost:8080/has/cookie' #重新请求,得到了之前设置的cookie: gavin,上述打印的是没有得到之前设置的cookie
r = session.get(url)
print(r.text)
7.重定向
# 301是永久重定向,而302是临时重定向
# 浏览器访问http://www.baidu.com/ 地址百度服务器 发现你使用的http,不安全
# 百度告诉 Status Code: 307 Location: https://www.baidu.com/
# Location(重定向到那个网址):应该重定向到 https://www.baidu.com/ 这个地址
# 于是浏览器访问了 https://www.baidu.com/
r = requests.get("http://github.com",allow_redirects = True) #allow_redirects:允许重定向
print(r.url,r.status_code,r.history[0].url) #https://github.com/ 200 [<Response [301]>]
# history:历史访问记录
#重定向到:https://github.com/ 200 历史纪录:http://github.com/
#打印历史纪录
for h in r.history:
print(h.url)
8.timeout 超时的关键字参数
如果你请求服务器,服务器的处理超过你的timeout的参数 那么则会抛出requests.exceptions.ConnectTimeout的异常
from requests.exceptions import ReadTimeout
try:
r = requests.get("http://localhost:8080/", timeout=8)
except ReadTimeout as err:
print(str(err))
else:
print(r.text)
9.代理的设置,通过proxies参数
proxies = {
'http':'http://58.53.128.83:3128',
'https':'https://219.234.5.128:3128'
}
url = 'https://www.baidu.com'
r = requests.get(url,proxies=proxies)
print(r.url)
print(r.text)