博客
关于我
爬虫神器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/

你可能感兴趣的文章
NSSet集合 无序的 不能重复的
查看>>
NT AUTHORITY\NETWORK SERVICE 权限问题
查看>>
ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
查看>>
ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
查看>>
Nuget~管理自己的包包
查看>>
nullnullHuge Pages
查看>>
NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
查看>>
numpy 用法
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>
oauth2-shiro 添加 redis 实现版本
查看>>
OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
查看>>
OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
查看>>
OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
查看>>
OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
查看>>
OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
查看>>
OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
查看>>
OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
查看>>
OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
查看>>