一、GET请求
''' GET请求: 没有请求体 数据不能超过1k 请求的数据会暴露在浏览器的地址栏中 '''
1、基本的get请求:
import requests # 1、基本请求 res=requests.get('http://127.0.0.1:8000/index') print(res.text)
2、带参数的GET请求:
(1) params
# 请求地址中携带数据(两种方式) # 第一种,用urlencode进行编码 from urllib.parse import urlencode,unquote #urlencode是进行url编码,unquote是解码 res=requests.get('https://www.baidu.com/s?wd=斗罗大陆') print(res.url) # 第二种: 用params(推荐用这种,因为它会自动对请求参数进行url编码 res=requests.get('https://www.baidu.com/s',params={'wd':'斗罗大陆'}) print(res.url)
(2)headers
''' header请求头中,通常放有Host,Referer,User-Agent,Cookie等 Host:主机 Referer:主要用来解决防盗链问题(一些网站会根据这个参数来判断请求源是不是来自自身网站) User_Agent: 浏览器标识,主要用来解决检测是否是浏览器发起的问题 Cookie:用来存放用户记录,比如账号登陆后产生cookie,这样浏览器其他页面就可以根据cookie来判断该用户是否登陆了。request模块有单独的参数来处理该字段。 ''' header = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', 'referer':'https://www.baidu.com' } res=requests.get('https://www.baidu.com/s',headers=header)
(3) cookies
# 请求代cookie的两种方式 # 1、放在headers中 header = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', 'cookie':'cookie值' } res=requests.get('https://www.baidu.com/s',headers=header) # 2、用request模块中的cookies参数 # cookies可以是一个字典或者cookiesjar对象 from http.cookiejar import CookieJar # 创建一个cookie对象 cookiejar = CookieJar() res=requests.get('https://www.baidu.com/s',cookies={'key':'value'}) res=requests.get('https://www.baidu.com/s',cookies=cookiejar)
二、POST请求
''' POST请求: 数据不会出现在地址栏中 数据大小没有限制 有请求体 请求体如果有中文或者特殊符号,要使用url编码 '''
#自动携带cookie session=requests.session() res =session.post('https://kao.acmcoder.com/enterprise/loginc',data={'phone': '13927037099','pwd': '12345678'},headers=headers) #这时,再请求该网站的其他页面,不需要带cookies res1=session.get('https://kao.acmcoder.com/index')
# 发送post请求,携带数据(urlencoded和json) # res=requests.post('http://127.0.0.1:8000/index/',data={'name':'hello'}) # print(res.text) # res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},) # print(res.text)
注意:post请求 默认请求头是:application/x-www-form-urlencoed,如果请求头设置成application/json,则可以用json传值给后台,不能用data传值(因为data是urlencode)
三、Response响应
1、response响应对象属性
res=requests.get('https://www.baidu.com/') res.text #响应的文本 res.content #响应体的二进制数据,一般是用来获取响应对象中的文件、图片,视频二进制数据 res.status_code #响应状态码 res.headers #响应头 res.cookies # 获取cookie res.cookies.get_dict() #将cookie转成字店 res.cookies.items() #将cookie数据转化成key,value形式 res.url #获取请求的url res.history #放重定向之前的地址 res.encoding #响应的编码方式 res.iter_content() # 获取图片,视频,大文件数据,循环取出 for line in res.iter_content(): f.write(line) ''' 注意:如果遇到打印出来出现乱码,可以用一下两个方法解决: 方法1: res.encoding='gb2312' 方法2: res.encoding=res.apparent_encoding '''
json数据解析
import json res.json() #等价于 json.loads(res.text)
四、requests的高级用法
1、证书验证问题
# SLL证书的验证问题 # 方法1:verify设置为false,忽略对SLL证书的验证 respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,但是会有警告 #方法2: from requests.packages import urllib3 urllib3.disable_warnings() #关闭警告 respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,也没有警告 # 方法3:添加证书 respone=requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
2、设置代理
response=requests.get('http://127.0.0.1:8000/index',proxies={'http':'代理ip:port','https':}) ''' 高匿和透明代理::高匿代理,后端无论如何拿不到你的ip,透明代理,后端能够拿到你的ip 还可以用代理池,每次请求都随机从代理池中取一个 后端拿到透明代理的ip方法, 后端取参数:X-Forwarded-For '''
3、超时设置:
timeout=0.1 #代表接收数据超时时间 ,float类型超时 timeout=(0.1,0.2) # 第一个参数0.1代表连接超时,第二个参数代表数据接收超时,tuple类型超时 res=requests.get('http://www.baidu.com',timeout=timeout)
4、上传文件
res=requests.post('http:127.0.0.1:8000/index',files={'myfile':open('xx.jpg','rb')})
5、其他设置
# 认证设置(你见不到了) import requests r=requests.get('xxx',auth=('user','password')) print(r.status_code) # 异常处理 import requests from requests.exceptions import * #可以查看requests.exceptions获取异常类型 try: r=requests.get('http://www.baidu.com',timeout=0.00001) except ReadTimeout: print('===:') except Exception as e: print(e)