深入理解 Python 网络请求库 Requests:一文读懂【建议收藏】

在编写代码过程中,我们通常需要大量数据进行测试。手动创建数据既费时又费力,因此使用 Python 的第三方库 Faker 来生成各种测试数据可以事半功倍。Faker 提供了自动生成测试数据的功能,让数据生成变得更加高效。

图片[1]-深入理解 Python 网络请求库 Requests:一文读懂【建议收藏】-山海云端论坛

一、requests安装

pip install requests

二、requests库的七个主要方法

方法描述
requests.delete()发送 DELETE 请求到指定 url
requests.get()发送 GET 请求到指定 url
requests.head()发送 HEAD 请求到指定 url
requests.options()发送OPTIONS 请求到指定 url
requests.post()发送 POST 请求到指定 url
requests.put()发送 PUT 请求到指定 url
requests.request()向指定的 url 发送指定的请求方法

三、requests发送请求

<code>import requests</code><code>r = requests.get('https:<em>//api.github.com/events')#发送get请求</em></code><code>r = requests.post('http:<em>//httpbin.org/post', data = {'key':'value'}#发送post请求,并传递数据</em></code><code>r = requests.put('http:<em>//httpbin.org/put', data = {'key':'value'})#发送put请求,并传递数据</em></code><code>r = requests.delete('http:<em>//httpbin.org/delete')#发送delete请求</em></code><code>r = requests.head('http:<em>//httpbin.org/get')#发送head请求</em></code><code>r = requests.options('http:<em>//httpbin.org/get')#发送options请求</em></code><code>r = requests.get('http:<em>//httpbin.org/get', params=payload)#发送传参请求</em></code><code>r = requests.post('http:<em>//httpbin.org/post', files={'file': open('report.xls', 'rb')})#发送post请求,上传文件</em></code><code></code>

四、requests发送请求响应结果

<code>import requests</code><code>url='https://www.baidu.com/'</code><code>response = requests.get(url=url)</code><code>print(response.status_code)<em># 获取响应的状态码</em></code><code>print(response.encoding)<em># 获取编码方式</em></code><code>print(response.text)<em>#查看响应的内容</em></code><code>print(response.content)<em># content获取的是response对象中的二进制(byte)类型的页面数据</em></code><code>print(response.json())<em>#json响应内容</em></code><code>print(response.status_code)<em># 返回一个响应状态码</em></code><code>print(response.headers)<em># 返回响应头信息</em></code><code>print(response.url)<em># 获取请求的url</em></code><code>print(response.history)<em>#追踪重定向</em></code>

五、设置请求头

<code>import requests</code><code>headers = {</code><code> 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0',</code><code> 'my-test':'Hello'</code><code>}</code><code>r = requests.get('http://httpbin.org/get',headers=headers)</code><code>print(r.text)</code>

六、文件上传
requests可以实现文件上传,具体代码如下。

<code>import requests</code><code>files = {'file':open('favicon.ico','rb')}</code><code><em>#进行上传</em></code><code>r = requests.post('http://httpbin.org/post',files=files)</code><code>print(r.text)</code>

也可以流式上传

Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可:

<code>with open('massive-body') as f:</code><code> requests.post('http://some.url/streamed', data=f)</code>

七、SSL证书验证
requests提供了证书验证功能,当发送HTTP请求时使用verify参数检查SSL证书。请求HTTPS网站时,如果该网站的证书没有被CA机构信任,会提示SSL证书验证错误。只需要将verify参数设置为False即可解决。

<code>import requests</code><code>resposne = requests.get('https:<em>//www.12306.cn',verify=False)</em></code><code>print(response.status_code)</code>

也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组。

<code>import requests</code><code>requests.get('https://www.12306.cn', verify='/path/to/certfile')<em>#单个证书</em></code><code><em>#本地需要有crt和key文件(key必须是解密状态,加密状态的key是不支持的),并指定它们的路径,</em></code><code>response = requests.get('https://www.12306.cn',cert('/path/server.crt','/path/key'))</code><code>print(response.status_code)</code>


八、代理设置
对于某些网站,请求几次时能正常获取内容,一旦开始大规模、频繁地爬取可能会弹出验证码或跳转到登录验证页面,更有甚者直接封禁客户端的IP,导致一段时间内无法访问。为了防止这种情况,需要使用代理来解决这个问题。
1。设置代理

<code>import requests</code><code><br></code><code>proxies = {</code><code> <em>#该代理服务器在免费代理网站上得到的,这样的网站有很多</em></code><code> 'http': 'http://161.35.4.201:80',</code><code> 'https': 'https://161.35.4.201:80'</code><code>}</code><code>try:</code><code> response = requests.get('http://httpbin.org/get', proxies=proxies)</code><code> print(response.text)</code><code>except requests.exceptions.ConnectionError as e:</code><code> print('Error', e.args)</code>

2.如果代理需要使用HTTP Basic Auth,可以使用类似http://user:password@host:port这样的语法来设置代理。

<code>import requests</code><code>proxies = {</code><code> "http":"http://user:password@161.35.4.201:80"</code><code>}</code><code>r = requests.get("https://www.taobao.com",proxies=proxies)</code><code>print(r.text)</code>


3。除了基本的HTTP代理外,requests还支持SOCKS协议的代理。首先需要安装socks这个库:pip3 install ‘requests[socks]’

<code>import requests</code><code>proxies = {</code><code> 'http':'socks5://user:password@host:port',</code><code> 'https':'socks5://user:password@host:port'</code><code>}</code><code>request.get('https://www.taobao.com',proxies=proxies)</code>

九、上传Cookie

发送你的cookies到服务器,可以使用 cookies 参数

r = requests.get(url='http://httpbin.org/post', cookies=dict(cookies_are='working'))

Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。
十、回话对象,即保持登录状态方法

会话对象让你能够跨请求保持某些参数。如果向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来性能提升。

<code>s = requests.Session()</code><code>s.get('https://www.baidu.com')</code>

十一、超时设置
在网络状况不好或者服务器网络响应太慢甚至无响应时,可能会等待很久才收到响应,甚至到最后收不到响应而报错。为了应对这种情况可以设置一个超时时间,这个时间是计算机发出请求到服务器返回响应的时间,如果请求超时就抛出错误。这就需要使用timeout参数实现,单位为秒。
1.指定请求总的超时时间

<code>import requests</code><code>#向百度发出请求,如果1秒内没有得到响应,则抛出错误</code><code>r = requests.get('https:<em>//www.baidu.com/',timeout=1)</em></code><code>print(r.status_code)</code>

2.分别指定超时时间。实际上,请求分为两个阶段:连接(connect)和读取(read)。如果给timeout参数指定一个整数值,则超时时 间是这两个阶段的总和;如果要分别指定,就可以传入一个元组,连接超时时间和读取超时时间:

<code>import requests</code><code>#向百度发出请求,如果连接阶段5秒内没有得到响应或读取阶段30秒内没有得到响应,则抛出错误</code><code>r = requests.get('https:<em>//www.baidu.com',timeout=(5,30))</em></code><code>print(r.status_code)</code>


3.如果想永久等待,可以直接timeout设置为None,或者不设置timeout参数,因为它的默认值就是None。

<code>import requests</code><code><em>#向百度发出请求,如果连接阶段5秒内没有得到响应或读取阶段30秒内没有得到响应,则抛出错误</em></code><code>r = requests.get('https://www.baidu.com',timeout=None))</code><code>print(r.status_code)</code>

十二、身份验证

访问某网站时,可能会遇到需要先登录才能访问

1.使用requests自带的身份验证功能HTTPBasicAuth类实现。

<code>import requests</code><code>from requests.auth import HTTPBasicAuth</code><code>r = requests.get('http://localhost/',auth=HTTPBasicAuth('admin','123456'))</code><code>print(r.status_code)</code>

如果用户名和密码正确,返回200状态码;如果不正确,则返回401状态码。也可以不使用HTTPBasicAuth类,而是直接传入一个元组,它会默认使用HTTPBasicAuth类来验证。

<code>import requests</code><code>from requests.auth import HTTPBasicAuth</code><code>r = requests.get('http://localhost/',auth=('admin','123456'))</code><code>print(r.status_code)</code>

2.requests还提供了其他验证方式,如OAuth验证,不过需要安装oauth包,安装命令:

pip3 install requests_oauthlib

使用OAuth验证的方法如下:

<code>import requests</code><code>from requests_oauthlib import OAuth1</code><code>url = 'https:<em>//api.twitter.com/1.1/account/verify_credentials.json'</em></code><code>auth = OAuth1("YOUR_APP_KEY","YOUR_APP_SECRET","USER_OAUTH_TOKEN","USER_OAUTH_TOKEN_SECRET")</code><code>requests.get(url,auth=auth)</code>

十三、错误与异常
遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。
如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。
若请求超时,则抛出一个 Timeout 异常。
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容