requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,requests是Python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib简洁很多。
往期内容回顾
【python】 字典使用教程(超级详细)不看 你怎么够别人卷
【python教程】保姆版教使用pymysql模块连接MySQL实现增删改查
selenium自动化测试实战案例哔哩哔哩信息至Excel
舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL
今天介绍一个库Requests
这是request的中文官网
安装语法:
pip install requests
要安装 Requests,只要在你的终端中运行这个简单命令即可,因为我这里已经安装过了会显示已经存在了,首次安装的会话出现successful则证明安装成功。
如果使用的是pycharm,安装方法见下图(顺序为按照箭头的方向操作),我这安装过了。
如果安装完成,导入模块验证一下是否成功即可,这样是没问题的。
常见的请求方法如下:
不过我们见到和使用的大多数都是GET和POST请求
使用 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')
你也许经常想为 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)
当我们发起请求之后,如果一切正常,就会得到相应的响应。我们的最终目的,就是要获取返回的数据,所以对返回的数据进行处理是非常重要的。
读取服务器响应的内容
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)
请求头,一般是传送服务器需要的一些附加信息,其中比较重要的就是User-Agent,Referer,Cookie等,常用的请求有说明如下:
在对页面发起请求的时候不加请求头的话容易被禁止访问,例如访问知乎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也是我们传进去的值。
Requests 使得上传文件变得很简单:
# 上传文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
print(r.text)
你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:
import requests
respone = requests.get('http://github.com', timeout=0.001)
print(respone)
注意:
timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)
会话对象让你能够跨请求保持某些参数。它也会在同一个 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)
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)
什么是代理?
代理IP是一个ip ,指的是一个代理服务器。
要晓得正向代理和反向代理是啥?
知不知道服务器的地址做为判断标准:知道就是正向代理,不知道就是反向代理。
代理ip的分类(常见有两大分类依据:匿名度&&协议)
①匿名度:
透明代理 :目标服务器可以通过代理找到你的ip;
匿名代理 :两者之间;
高匿代理 :在爬虫中经常使用,目标服务器无法获取你的ip。
②协议:(根据网站使用的协议不同,需要使用响应的协议代理服务)
http代理:目标的url为http协议;
https代理:目标url为https协议;
socks代理 :只是简单的传递数据包,不关心是何种协议,比http和HTTPS代理消耗小, 可以转发http和https的请求。
为何使用代理?
(1)让服务器以为不是同一个客户端在请求;
(2)防止我们的真实地址被泄露,防止被追究。
用法:
当我们需要使用代理时,同样构造代理字典,传递给proxies参数。
到此这篇关于Python之requests库基本介绍到这了,其实学习这件事很容易,不局限于编程,学习是一件持久的事情,从始至终,有句话说得好,知之者不如好之者,好之者不如乐之者。