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

Python-request库的详细解析

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
73219
发表于 2024-9-4 16:12:23 | 显示全部楼层 |阅读模式
引言在现代网络应用中,与服务器进行通信是一个非常基础且重要的功能。Python的requests库是一个非常强大且易于使用的HTTP库,它允许我们发送HTTP请求,与Web服务进行交互。本文将详细介绍requests库的使用,包括其基本概念、常用功能以及一些高级用法。安装requests库在使用requests库之前,我们需要先安装它。可以通过pip命令来安装:pipinstallrequests1基本概念HTTP请求方法HTTP协议定义了几种请求方法,最常见的有:GET:从服务器获取资源。POST:向服务器提交数据,通常用于创建新资源。PUT:更新服务器上的资源。DELETE:删除服务器上的资源。请求URLURL(UniformResourceLocator)是用于定位资源的字符串。例如:https://api.example.com/data。请求头请求头(Headers)包含了关于请求的元数据,例如内容类型、用户代理等。请求体请求体(Body)通常用于POST和PUT请求,包含要发送的数据。基本用法发送GET请求发送GET请求是最简单的操作之一。以下是一个示例:importrequestsresponse=requests.get('https://api.github.com')print(response.status_code)#打印状态码print(response.text)#打印响应内容12345发送POST请求发送POST请求时,通常需要传递一些数据。以下是一个示例:importrequestsurl='https://httpbin.org/post'data={'key':'value'}response=requests.post(url,data=data)print(response.status_code)#打印状态码print(response.json())#打印JSON格式的响应内容1234567传递请求头有时我们需要在请求中添加自定义的请求头。以下是一个示例:importrequestsurl='https://api.github.com'headers={'User-Agent':'my-app/0.0.1'}response=requests.get(url,headers=headers)print(response.status_code)#打印状态码print(response.text)#打印响应内容1234567处理响应状态码响应的状态码表示请求的结果。常见的状态码有:200:请求成功。404:资源未找到。500:服务器内部错误。响应内容响应内容可以是文本、JSON、二进制数据等。以下是一些示例:importrequestsresponse=requests.get('https://api.github.com')#获取文本内容print(response.text)#获取JSON内容print(response.json())#获取二进制内容print(response.content)123456789101112响应头响应头包含了关于响应的元数据。以下是一个示例:importrequestsresponse=requests.get('https://api.github.com')print(response.headers)1234高级用法详解在掌握了requests库的基本用法之后,我们可以进一步探索其高级功能。这些高级功能可以帮助我们更灵活、更高效地处理复杂的HTTP请求场景。以下是对高级用法的详细说明。1.会话对象(SessionObjects)会话对象允许我们在多个请求之间保持某些参数,例如cookies、headers等。使用会话对象可以简化代码,提高效率。示例:importrequests#创建一个会话对象session=requests.Session()#更新会话的默认headerssession.headers.update({'User-Agent':'my-app/0.0.1'})#发送第一个请求,设置一个cookieresponse1=session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')print(response1.text)#发送第二个请求,获取之前设置的cookieresponse2=session.get('https://httpbin.org/cookies')print(response2.text)123456789101112131415在这个示例中,我们创建了一个会话对象,并在多个请求之间共享了headers和cookies。这样可以确保在多个请求之间保持一致的状态。2.处理重定向(HandlingRedirects)默认情况下,requests库会自动处理重定向。我们可以通过allow_redirects参数来控制是否允许重定向。示例:importrequests#禁止重定向response=requests.get('http://github.com',allow_redirects=False)print(response.status_code)#打印状态码print(response.headers['Location'])#打印重定向的URL123456在这个示例中,我们发送了一个GET请求到http://github.com,并禁止了重定向。响应的状态码为301,表示请求被永久重定向,响应头中的Location字段包含了重定向的目标URL。3.超时设置(TimeoutSettings)在发送请求时,我们可以设置超时时间,以避免长时间的等待。超时时间可以应用于连接阶段和读取阶段。示例:importrequestsfromrequests.exceptionsimportTimeouttry:#设置连接超时和读取超时response=requests.get('https://httpbin.org/delay/10',timeout=(3,5))exceptTimeout:print('Therequesttimedout')12345678在这个示例中,我们设置了一个3秒的连接超时和5秒的读取超时。如果请求在3秒内未能建立连接或在5秒内未能读取到响应数据,就会抛出Timeout异常。4.代理支持(ProxySupport)requests库支持通过代理发送请求。我们可以为不同的协议(HTTP、HTTPS)设置不同的代理。示例:importrequests#设置代理proxies={'http':'http://10.10.1.10:3128','https':'http://10.10.1.10:1080',}response=requests.get('https://httpbin.org/ip',proxies=proxies)print(response.text)12345678910在这个示例中,我们为HTTP和HTTPS请求分别设置了代理。通过代理发送请求可以隐藏客户端的真实IP地址,或者绕过某些网络限制。5.文件上传(FileUploads)requests库支持上传文件。我们可以通过files参数来上传文件。示例:importrequests#准备文件files={'file'pen('report.xls','rb')}#上传文件response=requests.post('https://httpbin.org/post',files=files)print(response.text)12345678在这个示例中,我们上传了一个名为report.xls的文件。服务器会返回上传文件的相关信息。6.流式请求(StreamingRequests)对于大文件或需要实时处理的响应,我们可以使用流式请求。这样可以避免一次性加载大量数据到内存中。示例:importrequests#流式请求response=requests.get('https://httpbin.org/stream/20',stream=True)#逐行读取响应内容forlineinresponse.iter_lines():ifline:print(line)123456789在这个示例中,我们发送了一个流式请求,并逐行读取响应内容。这样可以有效地处理大文件或实时数据流。7.自定义身份验证(CustomAuthentication)requests库支持自定义身份验证。我们可以通过继承requests.auth.AuthBase类来实现自定义的身份验证逻辑。示例:importrequestsfromrequests.authimportAuthBase#自定义身份验证类classTokenAuth(AuthBase):def__init__(self,token):self.token=tokendef__call__(self,r):r.headers['Authorization']=f'Bearer{self.token}'returnr#使用自定义身份验证发送请求response=requests.get('https://httpbin.org/get',auth=TokenAuth('my-token'))print(response.text)123456789101112131415在这个示例中,我们定义了一个名为TokenAuth的自定义身份验证类,并在发送请求时使用了这个类。这样可以灵活地实现各种身份验证逻辑。8.处理Cookiesrequests库提供了方便的方法来处理Cookies。我们可以获取、设置和删除Cookies。示例:importrequests#创建一个会话对象session=requests.Session()#设置一个cookiesession.get('https://httpbin.org/cookies/set/sessioncookie/123456789')#获取所有cookiescookies=session.cookiesprint(cookies)#删除一个cookiecookies.clear_expired_cookies()print(cookies)123456789101112131415在这个示例中,我们通过会话对象设置了一个cookie,并获取和删除了cookies。这样可以方便地管理会话状态。9.处理SSL证书验证requests库默认会验证SSL证书。我们可以通过verify参数来控制是否验证SSL证书。示例:importrequests#禁用SSL证书验证response=requests.get('https://httpbin.org',verify=False)print(response.text)12345在这个示例中,我们禁用了SSL证书验证。这样可以方便地测试不安全的HTTPS站点,但需要注意安全风险。10.自定义适配器(CustomAdapters)requests库允许我们自定义适配器,以实现更复杂的请求逻辑。我们可以通过继承requests.adapters.HTTPAdapter类来实现自定义的适配器。示例:importrequestsfromrequests.adaptersimportHTTPAdapter#自定义适配器classMyAdapter(HTTPAdapter):defsend(self,request,**kwargs):print(f'Sendingrequestto{request.url}')returnsuper().send(request,**kwargs)#创建一个会话对象,并使用自定义适配器session=requests.Session()session.mount('https://',MyAdapter())#发送请求response=session.get('https://httpbin.org/get')print(response.text)12345678910111213141516在这个示例中,我们定义了一个名为MyAdapter的自定义适配器,并在会话对象中使用了这个适配器。这样可以方便地实现自定义的请求逻辑。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 19:50 , Processed in 1.053141 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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