首页 / PYTHON / Python:requests库
Python:requests库
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:requests库,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10792字,纯文字阅读大概需要16分钟。
内容图文
一、requests库
requests是第三方库,需要独立安装:pip install requests。requests是基于urllib编写的,并且使用起来非常方便,个人推荐使用requests。
官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
学习之前推荐一个非常好的http测试网站:http://httpbin.org,提供非常非常完善的接口调试、测试功能~
访问baidu,获取一些基本信息:
import requests response = requests.get("https://www.baidu.com")# 打开网页获取响应 print('response:', type(response))# 打印响应类型 print('status_code:', response.status_code)# 打印状态码
print('cookie:', response.cookies)# 打印cookie
print(type(response.text)) # 打印字符串形式的json响应体的类型
print('text:', response.text) # 打印字符串形式的响应体
print('二进制content:', response.content) print('content:', response.content.decode("utf-8"))
请求后得到的是requests.models.Response对象,需要处理后才能得到我们需要的信息
- Response_get.text: 得到的是str类型
- Response_get.content :得到的是bytes类型,需要进行解码Response_get.content.decode(),相当于Response_get.text
- Response_get.json(): 得到的是JSON数据类型
response: <class 'requests.models.Response'>
status_code: 200
cookie: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
< class 'str'>
text: <!DOCTYPE html><!--STATUS OK--><html>>ç?»å½...?</html>
二进制content: b'<!DOCTYPE html>\r\n<!--STATUS OK--><html>\xe7\x99\xbb\xe5\xbd\x95... </html>\r\n'
content: <!DOCTYPE html><!--STATUS OK--><html> 登录... </html>
其实使用requset.text避免乱码的方式还有一个,就是发出请求后,获取内容之前使用response.encoding属性来改变编码,例如:
response =requests.get("http://www.baidu.com") #设置响应内容的编码方式为utf-8 response.encoding="utf-8" print(response.text)
requests支持http的各种请求,比如:
- GET: 请求指定的页面信息,并返回实体主体。
- HEAD: 只请求页面的首部。
- POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
- PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE: 请求服务器删除指定的页面。
- OPTIONS: 允许客户端查看服务器的性能。
1.最基本的get请求
1).一个带参数的get请求:
import requests #将参数写在字典里,通过params传入,params接受字典或序列 data = { "name": "hanson", "age": 24 } response = requests.get("http://httpbin.org/get", params=data) #发出一个get请求,获得响应 print(response.url) #打印url print(response.text) #打印响应内容结果为:
http://httpbin.org/get?name=hanson&age=24
{
"args": {
"age": "24",
"name": "hanson"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e71bb9d-79cfc9e0195befa018426f20"
},
"origin": "218.106.132.130",
"url": "http://httpbin.org/get?name=hanson&age=24"
}
2).响应json的解析
示例:
import requests import json # 发出一个get请求 response = requests.get("http://httpbin.org/get") # text响应类型 print(type(response.text)) # 直接解析响应json(成字典) print(response.json()) # 获取响应内容后json进行解析(成字典) print(json.loads(response.text)) # 直接解析后的相应内容类型 print(type(response.json()))
控制台打印结果:
<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '124.74.47.82', 'url': 'http://httpbin.org/get'}
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '124.74.47.82', 'url': 'http://httpbin.org/get'}
< class 'dict'>
发现其实requests里的json方法就是封装了json.loads方法,非常Nice~
3).添加头信息headers
和urllib模块一样,某些网站是无法直接访问的,访问知乎:
import requests response =requests.get("https://www.zhihu.com") print(response.text)
打印如下错误:
<html>
< head><title>400 Bad Request</title></head>
< body bgcolor="white">
< center><h1>400 Bad Request</h1></center>
< hr><center>openresty</center>
< /body>
< /html>
我们需要为之添加头部信息:
ps:chrome查看头部信息:谷歌浏览器里输入chrome://version,就可以看到用户代理
部分结果:
Google Chrome 72.0.3626.96 (正式版本) (64 位)
修订版本 84098ee7ef8622a9defc2ef043cd8930b617b10e-refs/branch-heads/3626@{#836}
操作系统 Linux
JavaScript V8 7.2.502.25
Flash 32.0.0.142 /home/hanson/.config/google-chrome/PepperFlash/32.0.0.142/libpepflashplayer.so
用户代理 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36
命令行 /usr/bin/google-chrome-stable --flag-switches-begin --flag-switches-end
添加头信息后重新访问:
import requests # 添加头部信息 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" } # 发送请求 response = requests.get("https://www.zhihu.com", headers=headers) # 打印响应 print(response.text)
2.最基本的post请求
和get请求类似,带参的请求写在字典里携带,不过post是由data参数携带:
import requests #参数写在字典里 data = { "name": "hason", "age": 23 } #请求时将字典参数赋给data参数 response = requests.post("http://httpbin.org/post", data=data) #打印响应 print(response.text)打印结果:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "23",
"name": "zhaofan"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "19",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.4"
},
"json": null,
"origin": "124.74.47.82, 124.74.47.82",
"url": "https://httpbin.org/post"
}
可以通过response响应获得很多属性:
import requests response = requests.get("http://www.baidu.com") # 响应状态码 print(type(response.status_code), response.status_code) # 响应头信息 print(type(response.headers), response.headers) # cookie print(type(response.cookies), response.cookies) # url print(type(response.url), response.url) # 网络 响应历程 print(type(response.history), response.history)打印结果:
<class 'int'> 200
< class 'requests.structures.CaseInsensitiveDict'> {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 18 Feb 2019 08:37:19 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:24 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
< class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
< class 'str'> http://www.baidu.com/
< class 'list'> []
补充:requests的状态码判断:Requests还附带了一个内置的状态码查询对象
3.文件上传
需要用到请求参数里的file参数:
import requests # rb,以只读的方式打开二进制文件 files = {"files": open("a.jpg", "rb")} # 发送post请求携带文件 response = requests.post("http://httpbin.org/post", files=files) # 响应内容 print(response.text)
响应结果:
{
"args": {},
"data": "",
"files": {
"files": ""
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "145",
"Content-Type": "multipart/form-data; boundary=75c9d62b8f1248a9b6a89741143836b5",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.4"
},
"json": null,
"origin": "124.74.47.82, 124.74.47.82",
"url": "https://httpbin.org/post"
}
4.获取cookie
import requests #发送请求 response = requests.get("http://www.baidu.com") #打印cookie print(response.cookies) for key, value in response.cookies.items(): print(key + "=" + value)
5.session会话维持
会话对象requests.Session能够跨请求地保持某些参数,比如cookies,即在同一个Session实例发出的所有请求都保持同一个cookies,而requests模块每次会自动处理cookies,这样就很方便地处理登录时的cookies问题。
import requests #创建session对象 s = requests.Session() #使用session访问并设置number参数 s.get("http://httpbin.org/cookies/set/number/123456") #session对象再次访问,获取响应内容 response = s.get("http://httpbin.org/cookies") print(response.text)
6.证书验证
现在的很多网站都是https的方式访问,所以这个时候就涉及到证书的问题
例如访问12306:
import requests response = requests.get("https:/www.12306.cn") print(response.status_code)
会报错,证书错误
解决:加上verify=false(默认是true)
import requests #from requests.packages import urllib3 #urllib3.disable_warnings() response = requests.get("https://www.12306.cn", verify=False) print(response.status_code)
7.代理设置
proxies
8.超时时间
timeout,单位:毫秒
9.重定向
allow_rediects
还有几个访问参数介绍:
auth:认证,接受元祖
import requests response = requests.get("http://120.27.34.24:9001/",auth=("user","123")) print(response.status_code)
stream:是否下载获取的内容
cert:保存本地SSL证书路径
10.异常处理
所有的异常都是在requests.excepitons中:
示例:
import requests from requests.exceptions import ReadTimeout,ConnectionError,RequestException try: response = requests.get("http://httpbin.org/get",timout=0.1) print(response.status_code) except ReadTimeout: print("timeout") except ConnectionError: print("connection Error") except RequestException: print("error")
测试可以发现,首先被捕捉的异常是timeout超时异常,当把网络断掉就会捕捉到ConnectionError连接异常,如果前面异常都没有捕捉到,最后也可以通过RequestExctption捕捉到。
二、requests库和urllib包对比
1、使用urllib.request
import urllib.parse import urllib.request url = "https://api.douban.com/v2/event/list" params = urllib.parse.urlencode({'loc':'108288','day_type':'weekend','type':'exhibition'}) print(">>>>>>request params is:") print(params) # 发送请求 response = urllib.request.urlopen('?'.join([url, params])) # 处理响应 print(">>>>>>Response Headers:") print(dict(response.info())) print(">>>>>>Status Code:") print(response.getcode()) print(">>>>>>Response body:") print(response.read().decode())
2、使用requests库
import requests url = "https://api.douban.com/v2/event/list" params = {'loc':'108288','day_type':'weekend','type':'exhibition'} print(">>>>>>request params is:") print(params) # 发送请求 response = requests.get(url=url,params=params) # 处理响应 print(">>>>>>Response Headers:") print(response.headers) print(">>>>>>Status Code:") print(response.status_code) print(">>>>>>Response body:") print(response.text)
区别:
- 构建参数:在构建请求参数时,第一种需要将请求参数使用urllib库的urlencode方法进行编码预处理,非常麻烦。
- 请求方法:发送get请求时,第一种使用的urllib库的urlopen方法打开一个url地址,而第二种直接使用requests库的get方法,与http请求方式是对应的,更加直接、易懂。
- 请求数据:第一种按照url格式去拼接一个url字符串,显然非常麻烦,第二种按顺序将get请求的url和参数写好就可以了。
- 处理响应:第一种处理消息头部、响应状态码和响应正文时分别使用.info()、.getcode()、.read()方法,第二种使用.headers、.status_code、.text方法,方法名称与功能本身相对应,更方便理解、学习和使用。
- 连接方式:看一下返回数据的头信息的“connection”,使用urllib库时,“connection”:“close”,说明每次请求结束关掉socket通道,而使用requests库使用了urllib3,多次请求重复使用一个socket,“connection”:“keep-alive”,说明多次请求使用一个连接,消耗更少的资源。
- 编码方式:requests库的编码方式Accept-Encoding更全。
内容总结
以上是互联网集市为您收集整理的Python:requests库全部内容,希望文章能够帮你解决Python:requests库所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。