博客
关于我
爬虫神器Requests: 让 HTTP 服务人类
阅读量:557 次
发布时间:2019-03-09

本文共 3569 字,大约阅读时间需要 11 分钟。

Requests 库简介

Requests 是一个非转基因的 Python HTTP 库,专为安全、高效的网络请求优化而设计。无需手动构建 URL 或处理 POST 数据,它能自动管理 keep-alive 和连接池功能,是现代 web 开发的理想选择。支持 Python 2.6–2.7 和 3.3–3.7,兼容 PyPy。

以下是 Requests 的核心功能:

  • 国际化域名和 URL 支持
  • 自动处理 SSL/TLS 证书验证
  • 基础和摘要式身份认证方法
  • 持久 Cookie 会话支持
  • 自动解压响应内容
  • 支持重定向请求 (.netrc 配置可选)
  • 流式下载和文件上传
  • 自定义请求头设置
  • All-in-one URL 参数传递
  • JSON 数据解码
  • 自动处理 HTTP 方法 (包括 HEAD、PUT 和 DELETE)
  • 支持分块请求和下载

安装 Requests

安装 Requests 只需运行以下命令即可:

pip install requests

该命令也会自动安装其依赖库 urllib3。

发送 HTTP 请求

使用 Requests 发送请求非常简单。以下示例展示了如何获取 GitHub 的公共时间线:

import requestsr = requests.get('https://api.github.com/events')

查看响应状态码和内容类型:

print(r.status_code)  # 200print(r.headers['content-type'])  # application/json; charset=utf-8print(r.encoding)  # utf-8print(r.text)  # JSON 格式的响应内容

处理 URL 参数传递

要向 URL 中传递查询参数,可以使用 `params` 字典参数:

params = {    'q': 'requests framework',    'language': 'en-US'}r = requests.get('https://google.com/search', params=params)print(r.url)  # https://google.com/search?q=requests+framework&language=en-US

如果要传递包含列表的值,Requests 会自动将其编码为多个 URL 参数:

payload = {    'key1': 'value1',    'key2': ['value2', 'value3']}r = requests.get('http://httpbin.org/get', params=payload)print(r.url)  # http://httpbin.org/get?key1=value1&key2=value2&key2=value3

处理 JSON 响应

Requests 提供了内置的 JSON 解码器:

r = requests.get('https://api.github.com/events')data = r.json()  # 解码 JSON 数据print(data)

发送 POST 请求

使用 Dictionary 作为 POST 数据,可以通过 `data` 参数传递:

payload = {    'user': {        'data': {            'name': 'Administrator',            'email': 'admin@example.com'        }    }}r = requests.post('http://httpbin.org/post', data=payload)print(r.text)  # {'form': { 'user': { ... } }}

发送multipart/form-data 请求时,可以使用 `files` 参数传递文件:

files = {    'report': open('report.pdf', 'rb')}r = requests.post('http://httpbin.org/post', files=files)print(r.text)  # {'files': { 'report': 'PDF 内容' }}

处理重定向请求

默认情况下,Requests 会自动处理 301、302 等重定向请求。例如,GET GitHub 终点会被重定向到其 HTTPS 终点:

r = requests.get('http://github.com')print(r.url)  # https://github.com/print(r.history)  # [

可以通过 `allow_redirects` 参数禁用重定向:

r = requests.get('http://github.com', allow_redirects=False)print(r.url)  # http://github.com/

处理响应头

响应头可以通过字典访问:

print(r.headers)  # 所有 HTTP 头部信息print(r.headers['Content-Type'])  # 疑似 application/json

处理 cookies

请求中包含的 cookies 可以通过 `cookies` 参数传递:

cookies = {    'cookie_name': 'cookie_value'}r = requests.get('http://example.com', cookies=cookies)print(r.request.headers.get('Cookie'))  # Cookie: cookie_value

你也可以自行管理 Cookie Jar:

jar = requests.cookies.RequestsCookieJar()jar.set('cookie_name', 'cookie_value', domain='httpbin.org')r = requests.get('http://httpbin.org/cookies', cookies=jar)print(r.text)  # {"cookies": {"cookie_name": "cookie_value"}}

处理超时

可以通过 `timeout` 参数设定连接超时:

r = requests.get('http://github.com', timeout=0.5)

默认情况下不会超时。如果遇到超时错误,会抛出 `ConnectionError` 异常:

try:    r = requests.get('http://github.com', timeout=0.5)except requests.exceptions.ConnectionError:    print("无法连接到 GitHub")

处理错误与异常

Requests 处理网络错误的异常类型包括:

  • ConnectionError: 网络连接错误
  • HTTPError: 非成功 HTTP 状态码
  • Timeout: 超时错误
  • TooManyRedirects: 重定向次数过多
  • RequestException: 所有其它错误类型的基类

可以通过 `raise_for_status()` 检查请求是否成功:

r = requests.get('http://httpbin.org/notexist')try:    r.raise_for_status()except requests.exceptions.HTTPError:    print("HTTP 错误")

若有非 2xx 状态码,默认会抛出异常。

组合使用

可以结合使用多种请求方法和功能:

r = requestsMethods = [    requests.get,    requests.post,    requests.patch,    requests.delete,    requests.head,    requests.put]

例如,使用 HEAD 方法处理重定向:

r = requests.head('http://github.com', allow_redirects=True)print(r.url)  # https://github.com/

转载地址:http://rodpz.baihongyu.com/

你可能感兴趣的文章
MySQL高级-视图
查看>>
nacos集群搭建
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
Netty WebSocket客户端
查看>>
Netty工作笔记0011---Channel应用案例2
查看>>
Netty工作笔记0014---Buffer类型化和只读
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>