设为首页 收藏本站
查看: 1342|回复: 0

[经验分享] (转)python requests 高级用法

[复制链接]

尚未签到

发表于 2015-4-26 10:24:33 | 显示全部楼层 |阅读模式
  我在使用requests访问某个https网站时出现错误



error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
  找到这篇文章 http://python.codemach.com/pythonrequests-gao-ji-yong-fa.html
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  Session Objects会话对象
  
  Session对象在请求时允许你坚持一定的参数。此外,还坚持由Session实例的所有请求的cookie。
  
  让我们坚持在请求时使用
  
  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"}}'
  
  会话也可以用于提供默认的数据的请求的方法。这是通过提供的数据会话对象的属性:
  
  s = requests.Session()
  s.auth = ('user', 'pass')
  s.headers.update({'x-test': 'true'})
  
  # both 'x-test' and 'x-test2' are sent
  s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
  
  任何字典将被合并session级别的设置的值传递给请求方法。方法级别的参数覆盖会话参数。
  
  从一个字典参数中取值
  
  如果你想在一个session中删除一个参数,那么你只需要设置它为none,他便自动被删去。
  
  
  在一个session中的所有值都包含直接提供给你。参阅Session API文档了解更多信息。
  
  请求和响应对象
  
  >>> r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
  
  查看
  
  >>> r.headers
  {'content-length': '56170', 'x-content-type-options': 'nosniff','x-cache':
  'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet','content-encoding':
  'gzip', 'age': '3080', 'content-language': 'en', 'vary':'Accept-Encoding,Cookie',
  'server': 'Apache', 'last-modified': 'Wed, 13 Jun 2012 01:33:50 GMT',
  'connection': 'close', 'cache-control': 'private, s-maxage=0, max-age=0,
  must-revalidate', 'date': 'Thu, 14 Jun 2012 12:59:39 GMT', 'content-type':
  'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT fromcp1006.eqiad.wmnet:3128,
  MISS from cp1010.eqiad.wmnet:80'}
  
  但是,如果我们想要得到我们的服务器发送的报头,我们只需访问请求,然后请求标头:
  
  >>> r.request.headers
  {'Accept-Encoding': 'identity, deflate, compress, gzip',
  'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
  
  准备请求
  
  当你在API呼叫或会话呼叫收到一个Response对象,请求属性实际上是PreparedRequest使用。在某些情况下,发送请求之前,你不妨做一些额外的工作,身体或头(或任何其他真的)。这个简单的配方如下:
  
  from requests import Request, Session
  
  s = Session()
  prepped = Request('GET',  # or any other method, 'POST', 'PUT', etc.
  url,
  data=data
  headers=headers
  # ...
  ).prepare()
  # do something with prepped.body
  # do something with prepped.headers
  resp = s.send(prepped,
  stream=stream,
  verify=verify,
  proxies=proxies,
  cert=cert,
  timeout=timeout,
  # etc.
  )
  print(resp.status_code)
  
  既然你没有做什么特别的请求对象,你准备立即修改的PreparedRequest的对象。然后,您可以发送您所要发送的请求的其他参数。*或Sesssion中。*。
  
  SSL证书验证
  
  请求可以验证SSL证书的HTTPS请求,就像一个网络浏览器。检查主机的SSL证书,您可以使用校验参数:
  
  >>> requests.get('https://kennethreitz.com', verify=True)
  requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn't matcheither of '*.herokuapp.com', 'herokuapp.com'
  
  我没有对这个域的SSL设置,所以它的失败。好极了 Github上虽然没有:
  
  >>> requests.get('https://github.com', verify=True)
  
  
  您也可以通过验证一个私人证书CA_BUNDLE文件的路径。您还可以设置环境变量的REQUESTS_CA_BUNDLE。
  
  如果你设置验证设置为False,也可以忽略验证SSL证书。
  
  >>> requests.get('https://kennethreitz.com',cert=('/path/server.crt', '/path/key'))
  
  
  如果指定了错误的路径或无效的证书:
  
  >>> requests.get('https://kennethreitz.com',cert='/wrong_path/server.pem')
  SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSLroutines:SSL_CTX_use_PrivateKey_file:PEM lib
  
  主体内容工作流程
  
  默认情况下,当你提出一个请求时,机体的反应是立即下载。您可以重写此行为,并推迟下载响应的身体,直到您访问Response.content,与流参数的属性:
  
  tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
  r = requests.get(tarball_url, stream=True)
  
  仅在这一点上已下载的响应头和连接保持打开状态,从而使我们能够使内容检索条件:
  
  if int(r.headers['content-length']) < TOO_LONG:
  content = r.content
  ...
  
  您可以进一步控制的使用的Response.iter_content和Response.iter_lines方法的工作流程,或从基本的urllib3 urllib3.HTTPResponse在Response.raw阅读。
  
  保持活动
  
  需要注意的是发布的连接会回到池会重用所有以读取的数据:
  确保为设置数据流false或阅读Response对象的内容属性。
  
  流上传
  
  请求支持它允许你发送大量的没有读取到内存的流或文件流上传,。要流和上传,只需为你的身体提供了一个类似文件的对象:
  
  with open('massive-body') as f:
  requests.post('http://some.url/streamed', data=f)
  
  块编码请求:
  
  还请支持分块传输编码传出和传入的请求。要发送一个数据块编码的请求,只是提供一个生成器(或任何没有长度的迭代器)为您的BODY:
  
  def gen():
  yield 'hi'
  yield 'there'
  
  requests.post('http://some.url/chunked', data=gen())
  
  事件钩子:
  
  请求有一个钩子,系统,你可以用它来处理申请过程中的部分或信号事件的处理。
  
  您可以指定一个钩子函数在每个请求的基础上,通过一个{hook_name:callback_function}字典的钩请求参数:
  
  hooks=dict(response=print_url)
  
  那CALLBACK_FUNCTION将收到的数据块作为第一个参数。
  
  >>> requests.get('http://httpbin.org',hooks=dict(response=print_url))
  http://httpbin.org
  
  
  自定义身份验证
  
  这callback_function将收到一大块的数据作为第一个参数。
  
  from requests.auth import AuthBase
  
  class PizzaAuth(AuthBase):
  """Attaches HTTP Pizza Authentication tothe given Request object."""
  def __init__(self, username):
  # setup any auth-related datahere
  self.username = username
  
  def __call__(self, r):
  # modify and return the request
  r.headers['X-Pizza'] =self.username
  return r
  
  Then, we can make a request using our Pizza Auth:
  
  >>> requests.get('http://pizzabin.org/admin',auth=PizzaAuth('kenneth'))
  
  
  
  代理
  
  import requests
  
  proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
  }
  
  requests.get("http://example.org", proxies=proxies)
  
  您还可以配置代理服务器环境HTTP_PROXY and HTTPS_PROXY.
  
  $ export HTTP_PROXY="http://10.10.1.10:3128"
  $ export HTTPS_PROXY="http://10.10.1.10:1080"
  $ python
  >>> import requests
  >>> requests.get("http://example.org")
  
  To use HTTP Basic Auth with your proxy, use the http://user:password@host/syntax:
  
  proxies = {
  "http":"http://user:pass@10.10.1.10:3128/",
  }
  
  遵守:
  
  要求是为了符合相关的规范和RFC的合规性,不会造成困难,为用户。这受到关注,可能会导致一些看似寻常的行为,可能对那些不熟悉有关规范。
  
  编码:
  
  如果没有明确的字符集是在HTTP头中的Content-Type头中包含文本。在这种情况下,RFC 2616指定默认的字符集必须是ISO-8859-1
  
  HTTP动词
  
  要求提供访问几乎是全方位的HTTP动词:GET,OPTIONS,HEAD,POST,PUT,PATCH和DELETE。下面提供了详细的例子,使用这些不同的动词在请求中,使用GitHub的API。
  
  >>> import requests
  >>> r =requests.get('https://api.github.com/repos/kennethreitz/requests/git/commits/a050faf084662f3a352dd1a941f2c7c9f886d4ad')
  
  
  因此,GitHub的返回JSON。我们可以使用r.json的方法来解析为Python对象。
  
  >>> commit_data = r.json()
  >>> print commit_data.keys()
  [u'committer', u'author', u'url', u'tree', u'sha', u'parents', u'message']
  >>> print commit_data[u'committer']
  {u'date': u'2012-05-10T11:10:50-07:00', u'email': u'me@kennethreitz.com',u'name': u'Kenneth Reitz'}
  >>> print commit_data[u'message']
  makin' history
  
  请求可以很容易地使用各种形式的认证,包括很常见的基本身份验证。
  
  >>> from requests.auth import HTTPBasicAuth
  >>> auth = HTTPBasicAuth('fake@example.com','not_a_real_password')
  >>> r = requests.post(url=url, data=body, auth=auth)
  >>> r.status_code
  201
  >>> content = r.json()
  >>> print content[u'body']
  Sounds great! I'll get right on it.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60804-1-1.html 上篇帖子: 像职业选手样编码:地道Python 下篇帖子: 转:eclipse+pydev+django+python+mysql+python-dateutil+pil+setuptools安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表