1 发起网络请求
1.1 Get请求
response = requests.get('http://www.baidu.com')
1.2 Post请求
response = requests.post('http://www.baidu.com',data = {'key':'value'})
1.3 put请求
response = requests.put('http://www.baidu.com',data = {'key':'value'})
1.4 delete请求
response = requests.delete('http://httpbin.org/delete')
1.5 Head请求
response = requests.head('http://httpbin.org/get')
1.6 options
response = requests.options('http://httpbin.org/get')
2 网络请求的响应内容
2.1 文本
文本的响应内容一般用于获取网页源码
response = requests.get('http://www.baidu.com')
response.text #文本
2.2 二进制
二进制响应内容一般用于下载图片,视频等二进制资源
response = requests.get('http://www.baidu.com')
response.content #二进制
2.3 Json
json响应内容一般用于请求web接口
response = requests.get('http://www.baidu.com')
response.json() #json
2.4 原始响应内容
response = requests.get('http://www.baidu.com')
response.raw
3 requests的可传递参数详解
- url:请求的网络地址
- params:要发送的元祖或者字节列表
- data:要发送的字典,元祖,字节列表
- json:要发送的json对象
- headers:Http请求头
- cookies:与请求一起发送的cookies
- file:传递一个文件,该参数为字典
- auth:用于Http验证
- timeout:等待服务器发送数据的描述,超时设置
- allow_redirects:开启或者静止options/post/get/put/patch/delete/head重定向,默认为True
- proxies:代理url,字典形式传递
- verify:是否验证服务器的TLS证书或者字符串,默认为True
- stream:如果为False,响应内容立即被下载
- cert:如果为String,则为ssl客户端证书文件.pem的路径,如果是元祖,则为(“证书”,“秘钥”)
4 示例应用
4.1 Post请求传递数据
4.1.1 Post请求传递表单(字典)
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
4.1.2 Post请求传递表单(元组)
payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)
4.1.3 Post请求传递json
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}r = requests.post(url, data=json.dumps(payload))
4.1.4 Post请求传递文件
一:
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
二:
url = 'http://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)
三:
url = 'http://httpbin.org/post'
files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
r = requests.post(url, files=files)
流式上传
with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)
4.2 使用代理
4.2.1 Http或者Https代理
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
4.2.2 Socket代理
安装第三方依赖
pip install requests[socks]
import requests
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
requests.get("http://example.org", proxies=proxies)
4.3 超时设置
为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着 timeout 参数。在默认情况下,除非显式指定了 timeout 值,requests 是不会自动进行超时处理的。如果没有 timeout,你的代码可能会挂起若干分钟甚至更长时间。
4.3.1 一个超时参数
r = requests.get('https://github.com', timeout=5)
如果只是传递一个超时参数,则这个超时参数将作为connect和read二者的超时参数
4.3.2 两个超时参数
r = requests.get('https://github.com', timeout=(3.05, 27))
如果传入一个元祖,则分别代表connect和read的超时参数
4.3.3 永久等待
如果远端服务器很慢,你可以让 Request 永远等待,传入一个 None 作为 timeout 值
r = requests.get('https://github.com', timeout=None)
谨慎使用。
4.4 Get请求传递参数
4.4.1 直接使用请求接口链接,拼接?号携带参数
import requests
url = 'http://www.baidu.com/s?wd=python' # 使用?携带参数
r = requests.get(url)
print(r.url)
4.4.2 使用字典传参
import requests
url = 'http://www.baidu.com/s'
params = {'wd': 'python'} # 也可以将携带的参数传给params
r = requests.get(url, params=params)
print(r.url)
5 响应内容属性
r = requests.get('http://www.baidu.com')
那么我们可以获取响应内容的一些属性:
- r.status_code:响应状态码
- r.raw:原始响应体,使用r.raw.read()读取
- r.content:字节方式的响应体,需要进行解码
- r.text:字符串方式的响应体,会自动更具响应头部的字符编码进行解码
- r.headers:以字典对象储存服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在,则返回None
- r.json():request中内置的json解码器
- r.raise_for_status():请求失败(非200响应),抛出异常
- r.url:获取请求的url
- r.cookies:获取请求后的cookies
- r.encoding:获取编码格式
6 异常
- requests.exceptions.HTTPError:HTTP错误
- requests.exceptions.ConnectionError:连接错误
- requests.exceptions.ProxyError:代理错误
- requests.exceptions.SSLError:SSL错误
- requests.exceptions.Timeout:请求超时错误,包含requests.exceptions.ConnectTimeout和requests.exceptions.ReadTimeout
- requests.exceptions.ConnectTimeout:尝试连接到远程服务器时错误
- requests.exceptions.ReadTimeout:服务器未在分配的时间内发送任何数据
- requests.exceptions.URLRequired:url格式错误
- requests.exceptions.TooManyRedirects:过多的重定向
- requests.exceptions.MissingSchema:网址架构(例如http或https)丢失。
- requests.exceptions.InvalidSchema:无效的架构
- requests.exceptions.InvalidURL:无效的url
- requests.exceptions.InvalidHeader:无效的请求头
- requests.exceptions.InvalidProxyURL:无效的代理链接
- requests.exceptions.ChunkedEncodingError:服务器声明了分块编码,但发送了无效的分块。
- requests.exceptions.ContentDecodingError:解码响应内容失败
- requests.exceptions.StreamConsumedError:该响应的内容已被占用
- requests.exceptions.RetryError:自定义重试逻辑失败
- requests.exceptions.UnrewindableBodyError:尝试快退正文时,请求遇到错误
7 requests.status_code(同Http请求状态码)
1xx:请求收到,继续处理
2xx:操作成功收到,分析、接受
3xx:完成此请求必须进一步处理
4xx:请求包含一个错误语法或不能完成
5xx:服务器执行一个完全有效请求失败
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——客户端发起的请求错误,如语法错误
401——请求授权失败,需要身份认证
402——保留有效ChargeTo头响应
403——服务端理解客户端的请求,但是拒接此请求(你说气不气?)
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址,410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器内部发生错误,无法完成请求响应
501——服务器不支持请求的功能
502——充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503——服务器过载或处于维护状态,暂停服务
504——充当网关或代理的服务器,未及时从远端服务器获得请求
505——服务器不支持或拒绝请求头中指定的HTTP版本
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:Python3爬虫 – requests库
原文链接:https://www.stubbornhuang.com/633/
发布于:2020年01月10日 16:36:04
修改于:2023年06月27日 9:36:06
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52