本文实例讲述了Python requests库用法。分享给大家供大家参考,具体如下:
requests是Python中一个第三方库,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。接下来将记录一下requests的使用:
安装
要使用requests
库必须先要安装:
pip install requests
创建请求
通过requests
库发出一个请求非常简单,首先我们先导入requests
库:
import requests
现在我们尝试创建一个请求,用来获取百度的网页信息:
result = requests.get('http://www.baidu.com/')
现在我们获取到了一个Response对象result,我们可以从这个对象中获得所有我们需要的所有信息。刚刚的栗子是使用的GET请求,接下来将使用requests库进行POST请求:
result = requests.post('http://www.baidu.com/',data={key:value})
很简单对吧?那么其他HTTP请求呢:PUT、DELETE、HEAD和OPTIONS呢?
result = requests.put('http://www.baidu.com/',data={key,value}) result = requests.head('http://www.baidu.com/') result = requests.delete('http://www.baidu.com/') result = requests.options('http://www.baidu.com/')
在URL中传递参数
你经常想要在URL的查询字符串中发送某种数据。如果你手动构建网址,那么这个数据会在问号后作为网址中的键值对,例如https://www.baidu.com/s"color: #0000ff">params关键字参数将这些参数作为字符串字典提供。举个栗子,你想传递name=zhangsan并且age=18到https://www.baidu.com/s,你可以这样写:
data = {"name":"zhangsan","age":18} result = requests.get("https://www.baidu.com/s",params=data)
此时我们打印一下URL,发现该URL已经被正确编码:
print result.url # https://www.baidu.com/s"htmlcode">data = {"name":"zhangsan","favorite":["football","basketball"]} result = requests.get("https://www.baidu.com/s",params=data) print result.url # https://www.baidu.com/s"font-size: medium">响应内容在上面的例子可以知道,我们每次请求之后都会返回一个对象,我们可以从此对象中获取响应内容:
result = requests.get("https://api.github.com/events") print result.text # [{"id":"6924608641","type":"PushEvent",...}]二进制响应内容
print result.content # b'[{"id":"6924656608","type":"CreateEvent",...}]'JSON格式的响应内容,如果解码失败,result.json()将会引发异常
print result.json() # [{"id":"6924608641","type":"PushEvent",...}]请求将自动解码来自服务器的内容。大多数unicode字符集都是无缝解码的。我们也可以根据如下方法获取当前的编码:
print result.encoding如果响应的内容并不是你想要的编码格式,你可以在调用
result.text
之前,对result.encoding
进行赋值,给予新的编码格式。要检查一个请求是否成功,使用
result.raise_for_status()
或者result.status_code
来检查是否你期望的套接字响应
在极少数情况下,你希望从服务器中获得是原始套接字响应,你可以通过
result.raw
来获取。如果你想这样做,确保你设置stream=True
在你的初始请求。一旦你这样操作了,你可以这样:result = requests.get("https://api.github.com/events",stream=True) print result.raw # <urllib3.response.HTTPResponse object at 0x10ce52dd8> print result.raw.read(10) # b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'通常情况下,我们使用如下这种模式来保存正在流式传输的内容:
with open("info.txt","wb") as f: for item in result.iter_content(chunk_size=128): f.write(item)自定义头部
如果你想将自定义请求头添加到请求当中,只需要传递一个字典到headers参数即可。例如,在请求中指定我们的请求代理:
header = {"user-agent":'my_test/0001'} result = requests.get("https://api.github.com/events",headers=header)注意,请求头的值必须是一个字符串,byte类型的字符串或者unicode。虽然允许unicode,但还是避免使用unicode
复杂的post请求
通常情况下,你想要发送一些表单编码数据,就像HTML表单一样。要做到这一点,你只需要将字典传递给data参数即可:
infoDict = {"name":"张三"} result = requests.post('http://127.0.0.1:5000/test/post',data=infoDict)你也可以传递一个元组数据:
tupleInfo = ("name","张三") result = requests.post('http://127.0.0.1:5000/test/post',data=tupleInfo)有时你需要发送一些非编码格式的数据,即你发送的是一个string而不是dict,那么数据将会直接发送:
import json infoDict = {"name":"张三"} result = requests.post('http://127.0.0.1:5000/test/post',data=json.dumps(infoDict))如果你想要发送一个字典数据,你可以通过它使用json参数,它会自动编码:
infoDict = {"name":"张三"} result = requests.post('http://127.0.0.1:5000/test/post',json=infoDict)注意,如果你传递了data参数或者files,那么json将会被忽略
post上传文件
requests上传文件其实很简单:
with open('info.txt','rb') as f: result = requests.post('http://localhost:5000/post',files={"files":f})响应状态码
我们执行完一个请求之后,我们可以使用如下方法查看状态码,检测请求是否成功:
result = requests.get('http://localhost:5000/get') print result.status_code # 200当返回200,表示请求执行成功,我们还可以使用如下方法判断请求是否成功,True为成功,False不成功:
print result.staatus_code == requests.codes.ok # True当我们执行一个错误的请求(4XX客户端错误,5XX服务器错误)时,我们可以以下方法来抛出异常进行检车:
result = requests.get('http://localhost:5000/get') print result.status_code # 404 print result.raise_for_status() # Traceback (most recent call last): ...但是如果我们的请求是执行成功的,即状态码为200,此时
raise_for_status()
的值将会是None响应头
我们可以使用Python字典来查看服务器的响应头文件:
print result.headers # {'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '2', 'Server': 'Werkzeug/0.12.2 Python/2.7.10', 'Date': 'Sun, 03 Dec 2017 14:15:32 GMT'}Cookies
如果响应包含了Cookie,你可以这样快速的访问它:
result = requests.get('http://localhost:5000/get') print result.cookies['userName']或者你需要将自己的Cookie发送给服务器,你可以使用cookies参数:
cookie = {'userName':'zhangsan'} result = requests.get('http://localhost:5000/get',cookies=cookie)RequestCookieJar提供了一个完整的接口,适合在多个域和路径中使用,它将返回一个Cookie,所以它也可以被传入到cookies参数中
c = requests.cookies.RequestsCookieJar() c.set('userName','zhangsan',domain='http://localhost:5000',path='/get') result = requests.get('http://localhost:5000/get',cookies=c)Session对象
Session对象允许你在请求中保存某些参数,它将在所有由会话实例创建的请求中保存Cookie,并将使用urllib3连接池。如果你想同一主机发出多个请求,则会重新使用底层的TCP连接,这将使性能显著提高。Session具有主API的所有请求方法:
s = requests.Session() s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') r = s.get('http://httpbin.org/cookies') print(r.text) # '{"cookies": {"sessioncookie": "123456789"}}'但是请注意,方法级参数不会保存在请求,即使使用一个session。这个栗子只会发送第一个请求的Cookie,不会发送第二个:
result = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'}) print(result.text) # '{"cookies": {"from-my": "browser"}}' result = s.get('http://httpbin.org/cookies') print(result.text) # '{"cookies": {}}'请求和响应对象
每当你发起一个GET请求,你都在做两件事。首先,构造一个
Request
将被发送到服务器的对象来请求或查询某个资源。其次,Response
一旦从服务器中获得响应,就会生成一个对象。该Response
对象包含服务器锁返回的所有信息,并且还包含Request
你最初创建的对象。这是一个简单的请求,从维基百科的服务器获取一些非常重要的信息:result = requests.get('http://en.wikipedia.org/wiki/Monty_Python')现在我们需要获取服务器发送给我们的头文件信息:
print result.headers如果我们需要获取发送给服务器的头文件信息,我们可以这样:
print result.request.headersSSL证书验证
请求将验证HTTPS请求的SSL证书,就像Web浏览器一样。默认情况下,启用SSL验证,如果无法验证SSL证书,将会引发SSLError:
result = reqests.get('https://kyfw.12306.cn/otn/login/init') # requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)为了避免出现这个错误,我们可以将CA证书的CA_BUNDLE文件或目录传递给verify参数里面:
result = reqests.get('https://kyfw.12306.cn/otn/login/init',verify='/path/...')或者使用Session方式存储起来:
s = Session() s.verify='/path/...' result = s.get('https://kyfw.12306.cn/otn/login/init')如果将verify参数设置为False,请求也可以忽略SSL证书:
result = requests.get('https://kyfw.12306.cn/otn/login/init',verify=False)更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]