😀前言

requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,requests是Python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib简洁很多。


📕往期知识点

📕往期内容回顾

💡 【python】 字典使用教程(超级详细)不看 你怎么够别人卷
💡【python教程】保姆版教使用pymysql模块连接MySQL实现增删改查
💡 selenium自动化测试实战案例哔哩哔哩信息至Excel
💡舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL

今天介绍一个库Requests
这是request的中文官网


在这里插入图片描述

😀request库的安装

(1) 直接安装的方法

安装语法:

pip install requests

要安装 Requests,只要在你的终端中运行这个简单命令即可,因为我这里已经安装过了会显示已经存在了,首次安装的会话出现successful则证明安装成功。
在这里插入图片描述

(2) pycharm安装的方法

如果使用的是pycharm,安装方法见下图(顺序为按照箭头的方向操作),我这安装过了。
在这里插入图片描述
如果安装完成,导入模块验证一下是否成功即可,这样是没问题的。
在这里插入图片描述

😀request基本用法

(1) 请求方法

常见的请求方法如下:

  • GET:请求页面,数据包含在URL里面
  • POST:大多用于提交表单或者上传文件,数据包含在请求体中
  • HEAD:类似GET请求,不过响应报文没有具体的内容,用于获取报头
  • PUT:用客户端传送的数据取代指定的内容
  • DELETE:请求服务器删除指定的页面
  • CONNECT:把服务器当作跳板,让服务器代替客户端访问其他网页
  • OPTIONS:允许客户端查看服务器的性能
  • TRACE:回显服务器收到的请求,主要用于测试或者诊断

不过我们见到和使用的大多数都是GET和POST请求

(1) 发送请求

使用 Requests 发送网络请求非常简单。如果我们要发起一个GET请求,直接调用requests库里的GET方法即可,如下

我们在pyCharm中从导入 Requests 模块开始:

>>> import requests

获取某个网页:

import requests
r = requests.get('https://www.baidu.com')
print("类型",type(r))  # 对象的类型
print("状态码",r.status_code)    # 打印对象的响应状态码
print("编码格式",r.encoding)       # 打印编码
print("cookie信息",r.cookies)        # 打印cookie信息

运行结果,r为Response对象。我们可以从这个对象中获取所有我们想要的信息
在这里插入图片描述

POST请求

要实现发送表单形式的数据,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

import requests

playload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=playload)
print(r.text)

运行结果
在这里插入图片描述

各种请求方式Requests 简便的 API 意味着所有 HTTP 请求类型都是简便。例如:

import 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')

(2) 传递url参数

你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 允许你使用 params关键字参数,以一个字符串字典来提供这些参数。

例如:如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.text)   # 获取文本
print(r.url)    # URL

通过打印输出该 URL和r的文本信息,你能看到 URL 已被正确编码,还有我们传递的数据在了text里面:
在这里插入图片描述
注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
你还可以将一个列表作为值传入:

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.text)
print(r.url)

结果
在这里插入图片描述

(3) 响应

当我们发起请求之后,如果一切正常,就会得到相应的响应。我们的最终目的,就是要获取返回的数据,所以对返回的数据进行处理是非常重要的。

读取服务器响应的内容

import requests
r = requests.get('https://github.com/timeline.json')
print(r.text)

服务器返回的内容
在这里插入图片描述
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
读取json响应的内容:

import requests
r = requests.get('https://api.github.com/events')
print(r.json())

运行结果
在这里插入图片描述
读取原始的响应内容:
你想获取来自服务器的原始响应,你可以访问 r.raw。 初始请求中设置了 stream=True。

import requests
r = requests.get('https://github.com/timeline.json', stream=True)

print(r.raw)

运行结果
在这里插入图片描述

(4) 定制请求头

请求头,一般是传送服务器需要的一些附加信息,其中比较重要的就是User-Agent,Referer,Cookie等,常用的请求有说明如下:

  • Accept: 请求报头域,用于指定客户端可接受哪些类型的信息
  • Accept-Language: 指定客户端可接受的语言类型
  • Accept-Encoding: 指定客户端可接受的编码
  • Host:用于指定资源主机的IP和端口号,其内容为请求URL的原始服务器或网关的位置
  • Cookie:网站为了辨别用户进行会话跟踪而存储在用户本地的数据,它的主要功能是维持当前访问会话。
  • Referer: 用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做资源统计防盗链接处理等。
  • User-Agent: 可以是服务器识别客户端使用的操作系统及版本,浏览器及版本信息等。所以在做爬虫时要加上此信息,可以伪装浏览器;不加的话很容易被识别为爬虫。
  • Conten-Type:互联网媒体类型,用来表示具体请求中媒体类型信息;如text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型

在对页面发起请求的时候不加请求头的话容易被禁止访问,例如访问知乎https://www.zhihu.com/ 如下

import requests
res1 = requests.get('https://www.zhihu.com/')
print(res1.text)
for i in res1.request.headers.items():
    print(i)

结果
在这里插入图片描述
上面看见了,如果我们不构造请求头headers的话,容易被禁止访问,因为浏览器有反爬措施。
结果返回403(禁止访问),因为浏览器会通过User-Agent参数了解到我们的电脑系统以及浏览器等信息,上面不带headers时,默认User-Agent为python-requests/2.22.0,这服务器一看就知道是脚本,那肯定就会禁止访问。这时就需要重新构造请求头,伪装成浏览器访问,如下

在这里插入图片描述
将上面的user-agent值用代码传送,如下

# 伪造头
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'}
res1 = requests.get('https://www.zhihu.com/',headers=headers)
print(res1.status_code)
for i in res1.request.headers.items():
    print(i)

运行结果
在这里插入图片描述
如上,重新构造请求头传了user-agent参数后,请求就成功了,user-agent也是我们传进去的值。

(6) 上传文件

Requests 使得上传文件变得很简单:

# 上传文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
print(r.text)

结果
在这里插入图片描述

(7) 超时

你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:

import requests
respone = requests.get('http://github.com', timeout=0.001)
print(respone)

注意:
timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)

😀 高级用法


(1) 会话对象

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie,因为如果没有使用会话对象,每一次请求都相当于新的请求,类似于不同浏览器单独打开请求,如下面的请求:

import requests
q = requests.get('http://httpbin.org/cookies/set/sessioncookie/123456')
print(q)

r = requests.get('http://httpbin.org/cookies')
print(r.text)

运行结果
在这里插入图片描述
使用会话对象后,创建对象实例s = requests.Session(),通过s去请求,结果如下:

import requests
s = requests.Session()
e = s.get('http://httpbin.org/cookies/set/sessioncookie/123456')
print(e.text)

r = s.get('http://httpbin.org/cookies')
print(r.text)

运行结果
在这里插入图片描述

(2) SSL 证书验证

Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError:

requests.exceptions.SSLError: HTTPSConnectionPool(host=‘www.12306.cn’, port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(“bad handshake: Error([(‘SSL routines’, ‘tls_process_server_certificate’, ‘certificate verify failed’)],)”,),))

证书验证设置

import requests
from requests.packages import urllib3
 
urllib3.disable_warnings()  #从urllib3中消除警告
response = requests.get('https://www.12306.cn',verify=False)  #证书验证设为FALSE
print(response.status_code)

(4) 代理

什么是代理?
代理IP是一个ip ,指的是一个代理服务器。

要晓得正向代理和反向代理是啥?
知不知道服务器的地址做为判断标准:知道就是正向代理,不知道就是反向代理。

在这里插入图片描述
代理ip的分类(常见有两大分类依据:匿名度&&协议)

①匿名度:

透明代理 :目标服务器可以通过代理找到你的ip;

匿名代理 :两者之间;

高匿代理 :在爬虫中经常使用,目标服务器无法获取你的ip。

②协议:(根据网站使用的协议不同,需要使用响应的协议代理服务)

http代理:目标的url为http协议;

https代理:目标url为https协议;

socks代理 :只是简单的传递数据包,不关心是何种协议,比http和HTTPS代理消耗小, 可以转发http和https的请求。

为何使用代理?
(1)让服务器以为不是同一个客户端在请求;
(2)防止我们的真实地址被泄露,防止被追究。

用法:
  当我们需要使用代理时,同样构造代理字典,传递给proxies参数。
  在这里插入图片描述

🍁结语

到此这篇关于Python之requests库基本介绍到这了,其实学习这件事很容易,不局限于编程,学习是一件持久的事情,从始至终,有句话说得好,知之者不如好之者,好之者不如乐之者。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐