Python-走进Requests库

标签: python二三事

慕课网学习笔记
requests中文文档: http://cn.python-requests.org/zh_CN/latest/


    • 第1章 走进Requests库
      • 课程路线图
      • 认识Requests类库
      • 学好Requests库的意义
      • 环境准备
    • 第2章 HTTP协议原理简介
      • 了解HTTP协议
      • 了解HTTP - Response
      • 简单小程序
    • 第3章 发送请求
      • 3-1 Requests库-请求方法
      • 带参数的请求
      • 3-3 Requests库-请求异常处理
      • 自定义Request
    • 第4章 处理响应
      • HTTP状态码
      • 4-1 Requests库-响应基本api
      • 下载图片
      • 事件钩子 Event Hooks
    • 第5章 进阶话题
      • Http认证
      • proxy代理
      • Session和Cookie
    • 用户指南
      • 简介
      • 安装
      • 快速上手
      • 高级用法
      • 身份认证


第1章 走进Requests库

课程路线图

    1. 总体介绍
  • HTTP基本原理
  • 发送请求(Request)
  • 接收响应(Response)
  • 进阶话题

认识Requests类库

  • 文档地址:
    英文文档:http://www.python-requests.org/en/master/
    中文文档:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
    github:https://github.com/kennethreitz/requests/

学好Requests库的意义

  • 这是一个Web的时代
  • 爬虫利器
  • 服务端编程基础(Restful API)
  • …………

环境准备

  • requests
  • 安装本地测试服务器 pip install gunicorn httpbin
  • 启动服务端 gunicorn httpbin:app
  • 访问localhost:8000

第2章 HTTP协议原理简介

了解HTTP协议

  • HyperText Transfer Protocol 超文本传输协议
  • 关于HTTP协议,一篇就够了
  • RFC7230
  • urllib和urllib2的区别

  • curl命令

    • 文档 https://curl.haxx.se/docs/httpscripting.html
    • CURL常用命令

下载单个文件,默认将输出打印到标准输出中(STDOUT)中

curl http://www.centos.org

通过-o/-O选项保存下载的文件到指定的文件中:
-o:将文件保存为命令行中指定的文件名的文件中
-O:使用URL中默认的文件名保存文件到本地

# 将文件下载到本地并命名为mygettext.html
curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

# 将文件保存到本地并命名为gettext.html
curl -O http://www.gnu.org/software/gettext/manual/gettext.html

同样可以使用转向字符”>”对输出进行转向输出

同时获取多个文件

curl -O URL1 -O URL2

若同时从同一站点下载多个文件时,curl会尝试重用链接(connection)。

通过-L选项进行重定向
默认情况下CURL不会发送HTTP Location headers(重定向).当一个被请求页面移动到另一个站点时,会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上。
例如:访问google.com时,会自动将地址重定向到google.com.hk上。

curl http://www.google.com
<HTML>
<HEAD>
   <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>302 MovedTITLE>
 HEAD>
 <BODY>
    <H1>302 MovedH1>
     The document has moved
     <A HREF="http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1379402837567135amp;usg=AFQjCNF3o7umf3jyJpNDPuF7KTibavE4aA">hereA>.
 BODY>
HTML>

上述输出说明所请求的档案被转移到了http://www.google.com.hk。

这是可以通过使用-L选项进行强制重定向

# 让curl使用地址重定向,此时会查询google.com.hk站点
curl -L http://www.google.com

断点续传

通过使用-C选项可对大文件使用断点续传功能,如:

# 当文件在下载完成之前结束该进程
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
##############             20.1%

# 通过添加-C选项继续对该文件进行下载,已经下载过的文件不会被重新下载
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
 ###############            21.1%

对CURL使用网络限速
通过–limit-rate选项对CURL的最大网络使用进行限制

# 下载速度最大不会超过1000B/second

curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

在访问需要授权的页面时,可通过-u选项提供用户名和密码进行授权

curl -u username:password URL

# 通常的做法是在命令行只输入用户名,之后会提示输入密码,这样可以保证在查看历史记录时不会将密码泄露
curl -u username URL

保存与使用网站cookie信息

# 将网站的cookies信息保存到sugarcookies文件中
curl -D sugarcookies http://localhost/sugarcrm/index.php

# 使用上次保存的cookie信息
curl -b sugarcookies http://localhost/sugarcrm/index.php

传递请求数据

默认curl使用GET方式请求数据,这种方式下直接通过URL传递数据
可以通过 –data/-d 方式指定使用POST方式传递数据

………………

了解HTTP - Response

  • header
  • body
  • status code

简单小程序

  • python自带的原生的urllib,urllib2,urlib3
  • urllib和urllib2是相互独立的模块
  • requests库使用了urllib3(多次请求重复使用一个socket)
# -*- coding: utf-8 -*-
import requests

URL_IP = 'http://localhost:8000/ip'
URL_GET = 'http://localhost:8000/get'

def use_simple_requests():
    response = requests.get(URL_IP)
    print '>>>>Response Headers:'
    print response.headers
    print '>>>>Response body:'
    print response.text

def use_params_requests():
    params = {'param1': 'hello', 'param2': 'world'}
    response = requests.get(URL_GET, params=params)
    print '>>>>Response Headers:'
    print response.headers
    print '>>>>Status Code:'
    print response.status_code
    print '>>>>Reason:'
    print response.reason
    print '>>>>Request body:'
    print response.text

if __name__ == '__main__':
    print '>>>Use simple requests:'
    use_simple_requests()
    print ''
    print '>>>Use params requests:'
    use_params_requests()

第3章 发送请求

3-1 Requests库-请求方法

  • GET: 查看资源
  • POST: 增加资源
  • PUT: 修改资源
  • DELETE:删除资源
  • HEAD: 查看相应头
  • OPTIONS:查看可用请求方法

用法:requests.method

github developer: https://developer.github.com/guides/getting-started/

带参数的请求

  • url参数 params 字典
  • 表单参数提交 data 字典
  • json参数提交 json

3-3 Requests库-请求异常处理.

  • 请求超时处理

自定义Request

  • simple is better than complex.

第3章 代码

# -*- coding: utf-8 -*-
import json
import requests
from requests import exceptions

URL = 'https://api.github.com'


def build_uri(endpoint):
    return '/'.join([URL, endpoint])


def better_print(json_str):
    return json.dumps(json.loads(json_str), indent=4)


def request_method():
    response = requests.get(build_uri('user/emails'), auth=('imoocdemo', 'imoocdemo123'))
    print better_print(response.text)


def params_request():
    response = requests.get(build_uri('users'), params={'since': 11})
    print better_print(response.text)
    print response.request.headers
    print response.url


def json_request():
    # response = requests.patch(build_uri('user'), auth=('imoocdemo', 'imoocdemo123'), json={'name': 'babymooc2', 'email': '[email protected]'})
    response = requests.post(build_uri('user/emails'), auth=('imoocdemo', 'imoocdemo123'), json=['[email protected]'])
    print better_print(response.text)
    print response.request.headers
    print response.request.body
    print response.status_code


def timeout_request():
    try:
        response = requests.get(build_uri('user/emails'), timeout=10)
        response.raise_for_status()
    except exceptions.Timeout as e:
        print e.message
    except exceptions.HTTPError as e:
        print e.message
    else:
        print response.text
        print response.status_code


def hard_requests():
    from requests import Request, Session
    s = Session()
    headers = {'User-Agent': 'fake1.3.4'}
    req = Request('GET', build_uri('user/emails'), auth=('imoocdemo', 'imoocdemo123'), headers=headers)
    prepped = req.prepare()
    print prepped.body
    print prepped.headers

    resp = s.send(prepped, timeout=5)
    print resp.status_code
    print resp.request.headers
    print resp.text

if __name__ == '__main__':
    hard_requests()

第4章 处理响应

HTTP状态码

  • 维基:HTTP状态码
    • 1xx消息:这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。4 这些状态码代表的响应都是信息性的,标示客户应该采取的其他行动。
    • 2xx成功:这一类型的状态码,代表请求已成功被服务器接收、理解、并接受
    • 3xx重定向:这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。2当且仅当后续的请求所使用的方法是GET或者HEAD时,用户浏览器才可以在没有用户介入的情况下自动提交所需要的后续请求。客户端应当自动监测无限循环重定向(例如:A→B→C→……→A或A→A),因为这会导致服务器和客户端大量不必要的资源消耗。按照HTTP/1.0版规范的建议,浏览器不应自动访问超过5次的重定向
    • 4xx客户端错误:这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。[30]如果错误发生时客户端正在传送数据,那么使用TCP的服务器实现应当仔细确保在关闭客户端与服务器之间的连接之前,客户端已经收到了包含错误信息的数据包。如果客户端在收到错误信息后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端所有还未识别的输入缓冲,以免这些数据被服务器上的应用程序读取并干扰后者。
    • 5xx服务器错误:表示服务器无法完成明显有效的请求。[56]这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。这些状态码适用于任何响应方法

4-1 Requests库-响应基本api

  • Response对象
    • status_code
    • reason
    • headers
    • url
    • history
    • elapsed
    • request
    • encoding
    • raw
    • content
    • text
# -*- coding: utf-8 -*-
import requests
response = requests.get('https://api.github.com')
print "状态码,具体解释"
print response.status_code, response.reason
print "头部信息"
print response.headers
print "URL 信息"
print response.url
print "redirect 信息"
print response.history
print "耗费时长"
print response.elapsed
print "request 信息"
print response.request.method
print '----------------------'
print "编码信息"
print response.encoding
print "消息主体内容: byte"
print response.content, type(response.content)
print "消息主体内容: 解析"
print response.text, type(response.text)
print "消息主体内容"
print response.json(), type(response.json())

下载图片

# -*- coding: utf -*-
import requests
def download_image():
    """demo: 下载图片, 文件
    """
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36'}
    url = "http://img3.imgtn.bdimg.com/it/u=2228635891,3833788938&fm=21&gp=0.jpg"
    response = requests.get(url, headers=headers, stream=True)
    with open('demo.jpg', 'wb') as fd:
        for chunk in response.iter_content(128):
            fd.write(chunk)

def download_image_improved():
    """demo: 下载图片
    """
    # 伪造headers信息
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36'}
    # 限定url
    url = "http://img3.imgtn.bdimg.com/it/u=2228635891,3833788938&fm=21&gp=0.jpg"
    response = requests.get(url, headers=headers, stream=True)
    from contextlib import closing
    with closing(requests.get(url, headers=headers, stream=True)) as response:
        # 打开文件
        with open('demo1.jpg', 'wb') as fd:
            # 每128写入一次
            for chunk in response.iter_content(128):
                fd.write(chunk)

download_image_improved()

事件钩子 (Event Hooks)

# -*- coding: utf-8 -*-
import requests
def get_key_info(response, *args, **kwargs):
    """回调函数
    """
    print response.headers['Content-Type']

def main():
    """主程序
    """
    requests.get('https://api.github.com', hooks=dict(response=get_key_info))

main()

第5章 进阶话题

Http认证

proxy代理

Session和Cookie

用户指南

简介

  • 开发哲学
  • Apache2 协议
  • Requests 协议

安装

  • Pip Install Requests
  • 获得源码

快速上手

  • 发送请求
  • 传递 URL 参数
  • 响应内容
  • 二进制响应内容
  • JSON 响应内容
  • 原始响应内容
  • 定制请求头
  • 更加复杂的 POST 请求
  • POST一个多部分编码(Multipart-Encoded)的文件
  • 响应状态码
  • 响应头
  • Cookie
  • 重定向与请求历史
  • 超时
  • 错误与异常

高级用法

  • 会话对象
  • 请求与响应对象
  • 准备的请求 (Prepared Request)
  • SSL 证书验证
  • CA 证书
  • 响应体内容工作流
  • 保持活动状态(持久连接)
  • 流式上传
  • 块编码请求
  • POST 多个分块编码的文件
  • 事件挂钩
  • 自定义身份验证
  • 流式请求
  • 代理
  • 合规性
  • HTTP动词
  • 响应头链接字段
  • 传输适配器
  • 阻塞和非阻塞
  • Header 排序
  • 超时(timeout)

身份认证

  • 基本身份认证
  • 摘要式身份认证
  • OAuth 1 认证
  • 其他身份认证形式
  • 新的身份认证形式

你可能感兴趣的:(python,二三事)