找回密码
 会员注册
查看: 26|回复: 0

pythonrequests最全使用指南

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-9-5 13:52:21 | 显示全部楼层 |阅读模式
文章目录前言安装ReuqestsHTTP简介什么是HTTPHTTP工作原理HTTP的9种请求方法HTTP状态码requests快速上手requests发起请求的步骤requests发起请求的两种方式请求参数发起GET请求发起POST请求requests实战登录接口的测试获取用户信息接口的测试对响应结果的处理(序列化和反序列化)关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包+项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道前言Requests是一个Python的一个第三方库,通过发送HTTP请求获取响应数据,一般应用于编写网络爬虫和接口测试等。相比urllib库,它语法简单,更容易上手。官方中文文档地址:Requests:让HTTP服务人类离线文档下载地址:Requestsdocumentdownload安装Reuqestspipinstallrequests12HTTP简介在使用requests模拟发送网络请求之前,先来简单学习一下HTTP和常见的请求方式。什么是HTTPHTTP(HyperTextTransferProtocol,超文本传输协议)是一个简单的请求/响应协议。即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到请求后,给予相应的响应信息。HTTP工作原理1.客户端与服务器端建立连接2.客户端向服务器端发起请求3.服务器接受请求,并根据请求返回相应的内容4.客服端与服务器端连接关闭客户端和服务器端之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭,下次请求再重新建立连接。这样做的好处就是让服务器不会处于一个一直等待的状态,及时释放连接可极大提高服务器的执行效率。HTTP是一种无状态协议,意思就是服务器不保留与客户端连接时的任何状态。这减轻了服务器的记忆负担,从而保持较快的响应速度。HTTP的9种请求方法每种请求方式规定了客户端和服务器端之间不同的信息交换方式。请求方法描述GET请求指定的页面信息,并返回实体主体。POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。HEAD类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头PUT从客户端向服务器传送数据取代指定的文档的内容。PATCH是对PUT方法的补充,用来对已知资源进行局部更新DELETE请求服务器删除指定的页面OPTIONS允许客户端查看服务器的性能TRACE回显服务器收到的请求,主要用于测试或诊断CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器请求方法GET和POST的区别:GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.POST方法是把提交的数据放在HTTP包的Body中GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码HTTP状态码状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:分类分类描述1**指示信息–服务器收到请求,需要请求者继续执行操作2**成功–操作被成功接收并处理3**重定向–需要进一步的操作以完成请求4**客户端错误–请求包含语法错误或无法完成请求5**服务器错误–服务器在处理请求的过程中发生了错误常见的状态码:状态码含义200OK客户端请求成功400BadRequest客户端请求有语法错误,不能被服务器理解401Unauthorized请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用403Forbidden服务器收到请求,但是拒绝服务404NotFound请求资源不存在,eg:输入了错误的URL500InternalServerError服务器发生不可预期的错误503ServerUnavailable服务器当掐你不能处理客户端的请求,一段时间后可能恢复requests快速上手requests发起请求的步骤使用requests的流程大致可以分为以下三步:填写methodurlparams等参数➡发起请求➡查看响应结果requests发起请求的两种方式使用requests发起请求有两种方式,以发起post请求为例:importrequests#方式一:r=requests.request("post","https://www.baidu.com")print(r.text)#方式二:r=requests.post("https://www.baidu.com")print(r.text)12345678910requests.request(method,url,...)的request是requests封装好根据method传参的不同而调用对应的请求方法。method参数的值可以是get/post/put/delete/head/patch/options等,对应我们上一节的HTTP请求方法。上面的示例代码中方式一和方式二达到的效果都是一样的,但是推荐使用方式一,因为在后面的接口自动化测试中便于参数化,如下:importrequestsmethod="get"url="https://www.baidu.com"r=requests.request(method=method,url=url)print(r.text)12345678请求参数requests发起请求时,支持传递的参数列表:method:请求的类型,格式为字符串。值可以是get\post\put\delete\files\head\patch\optionsurl:请求的接口地址,格式为字符串。此参数必传params:get类型的接口请求的数据,格式为字典data:form-data一般用于post类型的接口请求的数据,格式为字典/json/字符串json:json格式的参数,格式为字典headers:请求头,格式为字典cookies:格式为字典files:上传文件,格式为字典timeout:请求超时时间,floatallow_redirects:是否支持重定向,格式为booleanverify:是否忽略http协议的证书错误,boolean:True不忽略在接下来的案例我们会逐一对上面的参数进行详细讲些。发起GET请求使用Requests模拟发送GET请求,以请求百度首页为例:#导入requests库importrequests#要请求的地址url="http://www.baidu.com"#发起GET请求,并将响应结果存储在res中,res是一个responses对象res=requests.get(url) print(res.request.headers) #查看请求头信息print(res.request.body) #查看请求正文print(res.request.url) #查看请求urlprint(res.request.method) #查看请求方法print(res.content) #响应结果的字节码格式,一般用于图片,视频数据等print(res.encoding) #查看响应正文的编码格式print(res.text) #响应结果的字符串格式,非字节码print(res.status_code) #响应结果状态码,200表示成功print(r.reason) #响应状态码的描述信息,如OK,NotFound等print(res.cookies) #获取cookiesprint(res.headers) #查看响应的响应头print(res.url) #查看响应的url1234567891011121314151617181920212223如果响应内容中文显示是乱码,在此提供2种解决方案:importrequestsurl="http://www.baidu.com"res=requests.get(url)#方案1:res.encoding="utf-8" #如果res.text中有中文乱码,修改编码格式为"utf-8"print(res.text)#方案2:res.content.decode("utf-8") #将响应结果的字节码格式转换为"utf-8"格式print(res.text)123456789101112131)发起携带参数的GET请求来看一下Request中get方法的定义:defget(url,params=None,**kwargs):returnrequest("get",url,params=params,**kwargs)123这意味着发起GET请求时,允许我们使用params关键字参数,参数的类型为字典(dict)。接下来看一个案例:慕课网(https://www.imooc.com/)首页搜索“python”,按F12-->点击NetWork抓包获取其接口。我们得到的接口部分信息如下:请求方式:get请求url:https://www.imooc.com/search/coursesearchconditions?words=python123?words=python问号后面的word=python就是我们在发起get请求时的要提供的参数,接下来使用requests来发起请求:importrequests#慕课网首页课程查询接口url="https://www.imooc.com/search/coursesearchconditions"#查询时携带的参数payload={'words':'python'}res=requests.get(url,params=payload) #发起携带参数的get请求print(res.json()) #响应内容是json格式的字符串,我们使用res.json()方法进行解码123456789101112132)定制请求头如果你想为请求添加HTTP头部,只需要传递一个字典(dict)给headers参数即可。例如,我们发起请求时要传递一个UA(User-Agent)。User-Agent中文名为用户代理,是Http协议中的一部分。它可以向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。为什么要添加UA?在使用Python的Requests模拟浏览器向服务器发送Http请求时,于某些网站会设置对User-Agent反爬虫机制,因此我们发送Http请求时有必要的加上User-Agent来将爬虫程序的UA伪装成某一款浏览器的身份标识。importrequestsurl="https://www.imooc.com/search/coursesearchconditions"headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/110.0.0.0Safari/537.36'}#查询时携带的参数payload={'words':'python'}res=requests.get(url,params=payload,headers=headers)print(res.json()) #响应内容是json格式的字符串,我们使用res.json()方法进行解码print(res.request.headers)#查看请求头123456789101112131415发起POST请求1)传递data参数当我们要向网页上的一些表单(form)传递数据时,经常需要发起post请求。使用requests发起post请求的方法也非常简单,只需要传递一个字典给data参数。importrequestsurl='http://httpbin.org/post'payload={'name':'joy','phone':'400-7865-6666'}r=requests.post(url=url,data=payload)print(r.text)12345678运行结果:{..."form":{"key2":"value2","key1":"value1"},...}123456789还可以为data参数传入一个元组列表。例如表单中多个元素使用同一个key时,可以像下面这样做:importrequestsurl='http://httpbin.org/post'payload=(('course','Python'),('course','Java'))r=requests.post(url=url,data=payload)print(r.text)12345678响应结果:{..."form":{"course":["Python","Java"]},...}1234567891011当你想用data参数去接收json格式的数据,那么需要把请求的数据转换成json格式,并且要将请求头设置为application/json。importrequests,jsonurl='https://api.github.com/some/endpoint'data=json.dumps({"some":"data"})headers={"Content-Type":"application/json"}r=requests.post(url,data=data,headers=headers)print(r.text)12345678910112)传递json参数可以使用json参数直接传递,然后它就会被自动编码importrequests,jsonurl="http://119.45.233.102:6677/testgoup/test/json"data={'name':'jay','age':23}r=requests.post(url,json=data)print(r.text)12345678910这里科普一下json和dict(字典)的区别:(1)字典是一种数据结构,是python中的一种数据类型;它是一种可变类型,可以存储任意类型的数值,以key:value的形式存储数据,但是key可以是任意可hash的对象,在一个字典中不允许出现两个相同的key值,如果出现,后面一个key值会覆盖前面的key值。(2)Json是一种打包的数据格式,本质上是字符串,也是按照key:value来存储数据,key只能时字符串,且可以有序、重复;必须使用双引号作为key或者值的边界符,不能使用单引号,使用单引号或者不使用引号会使解析错误。可以被解析为字典或者其他形式。(3)json.loads函数的使用,将字符串转化为字典importjsona={'a':'1','b':'2','c':'3'}print(type(a))#输出b=json.loads('{"age":"12"}')#参数是str行,loads之后,变成dict字典了print(b)#输出{'age':'12'}print(type(b))#输出123456789101112(4)json.dumps()函数的使用,将字典转化为字符串importjson#json.dumps()函数的使用,将字典转化为字符串dict1={"age":"12"}json_info=json.dumps(dict1)print("dict1的类型:"+str(type(dict1)))print("通过json.dumps()函数处理:")print("json_info的类型:"+str(type(json_info)))1234567893)传递from-data参数:注意,requests默认是不支持from-data的请求数据的格式的。所以我们要传from-data格式,我们需要安装一个requests的插件:pipinstallrequests_toolbelt-ihttps://pypi.douban.com/simple12importrequestsfromrequests_toolbelt.multipart.encoderimportMultipartEncodermethod="post"url="http://119.45.233.102:6677/testgoup/test/data"data=MultipartEncoder({"name":"张三","age":"23"})headers={"Content-Type":data.content_type}r=requests.request(method,url,data=data,headers=headers)print(r.text)123456789101112134)传递auth参数auth是一种对接口进行鉴权的方式,和cookies和token的作用差不多的。格式:元组,比如“账号”,“密码”)importrequestsurl="http://119.45.233.102:6677/testgoup/test/auth"method="post"auth=("admin","123456")r=requests.request(method,url,auth=auth)print(r.text)12345675)传递timeout参数timeout用于控制响应的时间,如果超过了timeout规定的时间,那么会直接抛出连接失败的错误信息。timeout格式是整数,单位是秒。importrequestsmethod="post"url="http://119.45.233.102:6677/testgoup/test/json"data={"name":"张三","age":23}r=requests.request(method,url,json=data,timeout=10)print(r.text)12345678910116)传递allow_redirects参数是否允许接口重定向。格式:布尔值7)传递proxies参数在编写爬虫程序时,同一个IP频繁对网站进行访问,可能会被封IP,为了避免这种情况我们就需要用到proxies参数来设置代理。proxies参数可以将代理地址替换为你的IP地址,隐藏自身IP。proxies参数类型proxies={'协议':'协议://IP:端口号'}proxies={'http':'http://IP:端口号','https':'https://IP:端口号',}123456可以去网上搜索免费的代理IP网站中查找免费代理IP(注意:如果获取到的免费IP地址无效就会报错):#使用免费普通代理IP访问测试网站:http://httpbin.org/getimportrequestsurl='http://httpbin.org/get'headers={'User-Agent':'Mozilla/5.0'}#定义代理,在代理IP网站中查找免费代理IPproxies={'http':'http://182.116.239.37:9999','https':'https://182.116.239.37:9999'}html=requests.get(url,proxies=proxies,headers=headers,timeout=5).textprint(html)12345678910111213这里推荐几个免费代理网站,可自行尝试:http://www.66ip.cn/https://www.kuaidaili.com/free/inha8)传递verify参数当我们请求https协议的接口的时候,如果它的证书过期了,我们就可以使用这个参数verify,设置为Fasle不检查证书,忽略证书的问题,继续请求。requests实战登录接口的测试TGU登录接口测试,登录接口信息如下:地址:http://119.45.233.102:2244/testgoup/login类型:post请求头:application/json请求参数:{"phone":"133********","password":"e10adc3949ba59abbe56e057f20f883e","type":1}返回值:{"code":1,"data":{"nickName":"liuyanzu666","token":"eyJ..."},"message":"登录成功!"}1234567891011121314151617使用requests测试登录接口:importrequestsloginUrl='http://119.45.233.102:2244/testgoup/login'method='post'data={"phone":"133********","password":"e10adc3949ba59abbe56e057f20f883e","type":1}r=requests.request(method=method,url=loginUrl,json=data)print(r.text)123456789101112获取用户信息接口的测试由于需要登录后才能获取到用户信息,在获取用户信息时需要传入登录后返回的token。完整代码如下:importrequestsloginUrl='http://119.45.233.102:2244/testgoup/login'method='post'data={"phone":"133********","password":"e10adc3949ba59abbe56e057f20f883e","type":1}#登录接口r=requests.request(method=method,url=loginUrl,json=data)#print(r.text)token=r.json()['data']['token']#获取用户信息接口userinfoUrl='http://119.45.233.102:2244/testgoup/user/getUserInfo'headers={'token':token}r=requests.request(method='get',url=userinfoUrl,headers=headers)print(r.text)123456789101112131415161718192021上述实战代码均在TestGoUp网站开展测试,并对账号进行了加密,可自行注册获取自己的账号进行测试。对响应结果的处理(序列化和反序列化)上面代码中的token=r.json()['data']['token']里有一个细节这里要展开叙述一下。来看一下登录接口返回的响应结果,也就是print(r.text)的值:{"code":1,"data":{"nickName":"liuyanzu666","token":"eyJhbGci..." #token太长了,这里删掉部分数据},"message":"登录成功!"}123456789咋一看这是一个python字典类型的数据,有的同学可能说这是json类型的数据。到底是字典还是json类型的数据,我们使用type()方法对r.text进行判断即可。print(type(r.text)) #返回结果是12返回结果居然是str类型的数据。现在我们要从r.text中获取token值,如果我们将它从str类型转换成字典类型,那么就可以通过token键获取对应的toekn值了。这里就引出了我们要讲的知识点:Python序列化和反序列化序列化:将Python中字典类型的数据转换成json格式的字符串,以便进行存储和传输。反序列化:将json格式的字符串转换成Python的字典类型数据,便于对其分析和处理。我们可以使用json模块来实现序列化和反序列化:importjson#字典类型的数据data={"name":"张三","age":18}#使用json.dumps()进行序列化:字典-->字符串res=json.dumps(data)print(res)#输出结果:{"name":"\u5f20\u4e09","age":18}print(type(res))#输出结果:#使用json.loads()进行反序列化:字符串-->字典res2=json.loads(res)print(res2)#输出结果:{'name':'张三','age':18}print(type(res2))#输出结果:123456789101112131415161718上面阐述了使用python进行序列化和反序列化的方法,但是在登录接口中获取token值的时候,我们并没有使用json.loads()进行反序列化,而是使用``token=r.json()[‘data’][‘token’],也就是r.json()`方法。也就是说在上面的代码中,获取token我们可以使用两种方法:...r=requests.request(method=method,url=loginUrl,json=data)方法一:token=json.loads(r.text)['data']['token']方法二:token=r.json()['data']['token']... 1234567891011关于Python技术储备学好Python不论是就业还是做副业赚钱都不错,但要学会Python还是要有一个学习规划。最后给大家分享一份全套的Python学习资料,希望提供给想学习Python的小伙伴们一点帮助!保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】一、Python所有方向的学习路线Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。二、Python基础学习视频②路线对应学习视频还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述③练习题每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!因篇幅有限,仅展示部分资料三、精品Python学习书籍当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。四、Python工具包+项目源码合集①Python工具包学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!②Python实战案例光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!③Python小游戏源码如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!五、面试资料我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。六、Python兼职渠道而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 06:27 , Processed in 0.955621 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表