requests 模块
一, 发送请求
向某个 url 发送 get 请求
requests.get("https://www.baidu.com")
发送一个 post 请求
requests.post("https://www.baidu.com",data={"name":"zhuyu"})
发送其他类型的请求也都可以
二, 传递 url 参数
get 请求传递参数
- arg = {
- "name":"zhuyu","password":"123"
- }
- requests.get("www.baidu.com",params=ars)
post 请求传递参数
- data = {
- "key":"value"
- }
- requests.post("www.baidu.com",data=data)
三, 响应内容
获取响应的内容
- response = requests.get("www.baidu.com")
- html = response.text # HTML 就是网站的源码
- url = response.url # 请求的 url
二进制响应内容
response.content # 返回的是二进制数据
JSON 响应内容
- response.JSON
- # 如果响应的是 JSON 格式, 它会自动帮你处理 JSON 数据, 如果不能转换的话, 会抛出异常
- # 注意有的服务器在失败的响应也会返回 JSON 对象, 请使用 raise_for_status() 或者 status_code 进行校验
四, 指定请求头
- url = "www.baidu.com"
- headers = {
- "user-agent":"xixi"
- }
- response = requests.get(url=url,headers=headers)
五, 复杂的 post 请求
传递类似 HTML 表单的数据
- url = "www.baidu,com"
- data = {
- "name":"zhuyu"
- }
- requests.post(url=url,data=data)
传递 JSON 格式数据
- import JSON
- url = "www.baidu,com"
- data = {
- "name":"zhuyu"
- }
- # 方式一:
- requests.post(url=url,data=JSON.dumps(data))
- # 方式二:
- requests.post(url=url,JSON=data)
六, 上传文件
- url = "www.baidu,com"
- files = {
- "file":open("a.txt","rb")
- }
- requests.post(url=url,files=files)
七, 响应状态码
- response = requests.get("www.baidu.com")
- status_code = response.status_code # 获取状态码
- # 如果返回一个 400,500 的状态码, 可以通过 raise_for_status() 来抛出异常
八, 响应头
response.headers # 这是响应的头部信息
九, cookie 信息
获取响应头的 cookie 信息
cookie = response.cookie #获取到 cookie 的字典
为 requests 设置 cookie 信息
- # cookie 它是 RequestsCookieJar 的对象
- cookies = requests.cookoes.RequestsCookieJar()
- cookies.set("name","zhuyu")
- cookies.set("password":"123")
- requests.get(url,cookies=cookies)
十, 重定向与请求历史
history 方法
这是 response 对象里的一个方法或者属性, 它是一个对象列表, 按照从最老到最近的请求进行排序的
allow_redirects 参数, 模式为 True 的
- response = requests.get(url=url,allow_redirects=False)
- # 上面代码是禁止了重定向
十一, 超时
你可以告诉 reuqests 在经过 timeout 参数设定的秒数时间之后停止等待响应
requests.get(url=url,timeout=5)
十二, 错误与异常
错误 | 异常 |
---|---|
遇到网络问题 | Requests 会抛出 ConnectionError 异常 |
返回了不成功的状态码 | Response 会抛出 raise_fir_status 异常 |
请求超时 | 抛出 Timeout 异常 |
若请求超过了设定的最大重定向次数 | 抛出 TooManyRedirects 异常 |
十三, 会话对象
会话对象让你在能够跨请求保持某些参数
- # 拿到一个会话对象, 这个会话同样能实现 requests 中的方法
- session = requests.Session()
- # 通过会话对象发送一个 get 请求到 url
- session.get(url=url)
- ------------------------------------------------------
- # 会话也可用来为请求方法提供数据
- session = requests.Session()
- session.headers.update({
- "name":"zhuyu"
- })
- session.get(url,headers={
- "age":22
- })
- # 此时在本次请求的请求中有 name:"zhuyu"&age:22, 这两对键值对
- ------------------------------------------------------
- # 上面这个只是在会话层面, 如果在方法层面呢? 参数是不会被跨请求保持的
- session = requests.Session()
- session.get(url=url,cookies={
- "name":"zhuyu"
- })
- # 此时发送的 get 请求是带上 "name"="zhuyu" 这是 cookie 的
- # 下面还是同一个 session 对象, 我再发一个 get 请求, 此时我没有写 cookies 这个参数
- session.get(url=url)
- # 结果: 你会发现本次请求没有带上 cookie
十四, 请求与响应对象
- response = requests.get(url=url)
- # 列举下这行代码做了那几步
- # 1, 生成了一个 Request 的对象, 里面包含着所携带的数据, 将该对象发送到某个服务器去请求
- # 2, 一旦响应之后, 就会产生一个 Response 的对象, 这个对象包含着服务器传来的数据
- # 3, 最后将这个 Response 对象赋值给了 response 这个变量
- ------------------------------------------------------------------------
- response.headers # 就是响应的请求头
- response.request.headers # 就是请求的请求头
十五, 准备的请求 (Prepared Request)
- import requests
- response = requests.get(url)
- # 其实请求最终还是以 session 对象发送的,
- session.send(Request 对象,**kwargs)
- -------------------------------------
- from requests import Request,Session
- session = Session()
- req = Request("GET",url)
- request=PreparedRequest(req)
- # 官方文档说, 我们可以在 session 对象 send 之前, 对 PreparedRequest 对象再进行一些操作
- response = session.send(request,
- stream=strean,
- verify=verify,
- proxies=proxies,
- cert=cert,
- timeout=timeout)
- print (response.status_code)
十六, SSL 证书验证 (verify)
Requests 可以为 HTTPS 请求验证 SSL 证书, SSL 验证默认是开启的, 验证失败的话会抛出 SSLError 异常
- # 设置证书路径
- # 方式一:
- request.get(url=url,verify = 路径)
- # 方式二:
- session = requests.Session()
session.verify = 路径
# verify 对应: SSL 证书路径
十七, 客户端证书 (cret)
- # cert : 指定证书的路径
- requests.get(url=url,cert = 路径)
- session = requests.Session()
session.cert = 路径
十八, CA 证书
requests 默认附带了一套它信任的证书, 如果系统中装了 certifi 包, requests 会试图使用它里面的证书, 这样用户就不需要在修改代码的情况下更新他们信任的证书, 所以我们经常更新 certifi 包
十九, 响应体内容工作流
- # stream: 控制响应体内容的下载
- response = requests.get(url,stream=True)
二十, 流式上传 (stream)
- # requests 可以上传文件
- with open("a.txt","rb") as f:
- requests.post(url,data=f)
- # 注意: 传送的数据也就是文件, 应该是一个文件对象
- # 强烈建议建议使用二进制
二十一, post 上传多个分块编码的文件
files = []
二十二, 事件挂钩 (hooks)
- '''
- 可用的钩子: response, 从一个请求产生的响应
- 用法: 传递一个字典给 hooks 这个变量 {hook_name:callback_function}
- 这个 callback_function 会接收一个数据块作为它的第一个参数
- hooks = dict(response=print_url)
- '''
- def print_url(response,*args,**kwargs):
- pass
二十三, 代理 (proxies)
- import requests
- proxies = {
- "http":"http://10.10.1.10:3128",
- "https":"https://10.10.1.10:1080"
- }
- response = requests.get(url=url,proxies=proxies)
来源: http://www.bubuko.com/infodetail-3034988.html