URL参数请求:
import requests ''' URL Parameters 请求方式:URL参数 例如: 以get 方式请求http://httpbin.org/get?first_name=hello&last_name=word ''' # params={"first_name":"hello","last_name":"word"} # responds=requests.get("http://httpbin.org/get",params=params) # print(responds.text) # print(responds.url)
表单参数请求:
''' 表单参数提交,注意只更新的是表单数据 Content-Type: application/x-www-form-urlencoded 例如: 以post 方式请求http://httpbin.org/post, 增加的资源为params={"first_name":"hello","last_name":"word"} ''' params={"first_name":"hello","last_name":"word"} headers={"Content-Tpye":"application/x-www-form-urlencoded"} responds=requests.post("http://httpbin.org/post",data=params,headers=headers) print(responds.text) print(responds.url) print(responds.request)
Json 参数数据请求
''' Json数据提交,更新的是数据data Content-Type: application/json 例如: 以post 方式请求http://httpbin.org/post, 增加的资源为params={"first_name":"hello","last_name":"word"} ''' #Python学习交流QQ群:778463939 params={"first_name":"hello","last_name":"word"} headers={"Content-Tpye":"application/json"} responds=requests.post("http://httpbin.org/post",json=params,headers=headers) print(responds.text) print(responds.url) print(responds.request)
额外话题--构建URL
def build_url(URL,endpoint): return "/".join([URL,endpoint]) print(build_url("http://httpbin.org","post"))
二、requests模块的基础知识
1,requests支持的请求方式
requests.get("http://httpbin.org/get") requests.post("http://httpbin.org/post") requests.put("http://httpbin.org/put") requests.delete("http://httpbin.org/delete") requests.head("http://httpbin.org/get") requests.options("http://httpbin.org/get")我们最常用的就是get和post请求,两者的区别就是get请求没有请求体,而post请求有请求体
2,get请求
import requests#这是请求的路径,必须有 url='https://dig.chouti.com/' #这是本次访问携带的参数,发送请求时,它会以?name=hh的形式加在路径后面,不是必须要有 params={'name':'hh'} #这是请求的请求体,它是以键值对的形式存在的,也不是必须要有 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'} #这是访问携带的cookie数据cookies='dshdjdsadhsaghgdasjjdasjdhasdashdjkhskad'res = requests.get(url=url, headers=headers,params=params,cookies=cookies)
3,post请求
post请求和get请求是一样的,只是多了一个请求体数据#data和json都是请求体数据,data是字典类型的,json发送的是json字符串 data={'name':'hh','pwd':'12345'} json={"name":"hh","pwd":"12345"}#请求体是以data形式发的,默认的contentType类型是urlencoded,如果请求体数据是以json形式发的,默认的contentType类型为json res1=requests.post(url='http://httpbin.org/post', data={'name':'yuan'}) res2=requests.post(url='http://httpbin.org/post',json={'age':"22",})对于post请求来说,除了比get请求多一个请求体以外,其他用法一模一样,get请求拥有的参数,post都拥有,比如说params参数,如果在post请求里面加一个params参数,他会和get请求一样,会以?a=1的形式加在请求路径后面
4,response响应对象
4.1 常见属性
import requests respone=requests.get('https://sh.lianjia.com/ershoufang/') respone.text #响应文本,本身是字节类型,但会以一种猜测的编码格式帮你解码成字符串 respone.content #响应文本,字节类型的文本 respone.status_code #响应的状态码 respone.headers #响应头数据 respone.cookies #响应的cookie respone.cookies.get_dict() #响应的字典形式的cookie respone.cookies.items() #响应的元祖形式的cookie respone.url respone.history #如果请求过程中发生了重定向,这会帮你记录过程 respone.encoding #指定text的是用哪种方式解码
4.2 编码问题
刚才上面讲了,res.text会以一种猜测的编码帮你解码,但有时是不正确的编码,所以导致拿到数据编码会有问题,其实我们可以给text指定用哪种编码解码 import requests res=requests.get('http://www.baidu.com') coding=res.apparent_encoding #这才是拿到别人的编码方式 res.encoding=coding #把别人的编码方式赋给text的解码方式 res.text #这样解码后的字符串就不会有问题了
4.3 对于图片、视频等字节类型文件
首先我们直接用res.content就行了,其次是由于文件太大,我们不应该一下就全写进文件里,而是应该一段一段的写进去,于是我们就可以for循环res.iter_content(),然后再一次一次的写入 import requests response=requests.get('http://bangimg1.dahe.cn/forum/201612/10/200447p36yk96im76vatyk.jpg') with open("res.png","wb") as f: # f.write(response.content) # 比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的 for line in response.iter_content(): f.write(line)
4.4针对接收json数据
import requests import json response=requests.get('http://httpbin.org/get') #我们是可以用反序列化自己手动处理json数据,其实这样麻烦了 res1=json.loads(response.text) #别人已经给我们封装好了一个方法res.json()这样就直接帮你完成了反序列化的过程 res2=response.json()
4.5关于重定向
在requests的一些列请求方式中,除了head方式,其他的都会自动处理重定向,上面的属性讲了,可以通过res.history可以查看发送了那些重定向
我们还可以通过allow_redirects参数设置不让他重定向
r = requests.get('http://github.com', allow_redirects=False)
https://docs.python-requests.org/zh_CN/latest/