Requests 函数库
requests 函数库 ( 模组 ) 是相当流行的 Python 外部函数库,具备了 GET、POST...等各种 request 用法,透过 requests 能够轻松抓取网页的数据,这篇教学会介绍 requests 函数库的基本用法。
快速导览:
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
安装 requests 模组
如果是使用 Colab 或 Anaconda,默认已经安装了 requests 函数库,不用额外安装,如果是本机环境,输入下列指令,就能安装 requests 函数库 ( 依据每个人的作业环境不同,可使用 pip 或 pip3 或 pipenv )。
pip install requests
import requests
要使用 requests 必须先 import requests 模组,或使用 from 的方式,单独 import 特定的类型。
import requests
from requests import get
requests 的 HTTP 方法
requests 可以使用下列 HTTP 六个方法,使用后会传回一个 Response 对象,六个方法里,GET 和 POST 是最常用的两个方法,两个的差别在于 GET 提交的参数会放在标头中传送 ( 公开 ),而 POST 则是放在内容中传送 ( 隐密 )。
| HTTP 方法 | requests 方法 | 说明 |
|---|---|---|
| GET | requests.get(url) | 向指定资源提交请求,可额外设定 params 参数字典。 |
| POST | requests.post(url) | 向指定资源提交请求,可额外设定 data 参数字典。 |
| PUT | requests.put(url) | 向指定资源提供最新内容,可额外设定 data 参数字典。 |
| DELETE | requests.delete(url) | 请求删除指定的资源。 |
| HEAD | requests.head(url) | 请求提供资源的回应标头 ( 不含内容 )。 |
| OPTIONS | requests.options(url) | 请求服务器提供资源可用的功能选项。 |
Response 对象的属性与方法
当服务器收到 requests HTTP 方法所发出的请求后,会传回一个 Response 对象,对象里包含服务器回应的消息信息,可以透过下列的属性与方法,查询相关内容 ( bytes 表示数据以 bytes 表示,str 以字串表示,dict 以字典表示 )。
| Response 对象 | 说明 |
|---|---|
| url | 资源的 URL 位址。 |
| content | 回应消息的内容 ( bytes )。 |
| text | 回应消息的内容字串 ( str )。 |
| raw | 原始回应消息串流 ( bytes )。 |
| status_code | 回应的状态 ( int )。 |
| encoding | 回应消息的编码。 |
| headers | 回应消息的标头 ( dict )。 |
| cookies | 回应消息的 cookies ( dict )。 |
| history | 请求历史 ( list )。 |
| json() | 将回应消息进行 JSON 解码后回传 ( dict )。 |
| rasise_for_status() | 检查是否有例外发生,如果有就抛出例外。 |
爬取第一个静态网页内容
知道 requests 的使用方法后,就可以开始爬取第一个网页内容,范例使用的网站为“台湾水库即时水情”的网站,使用 requests.get 取得回应的对象后,就可以印出 text 的内容 ( 其他文章会介绍如何爬取更多不同的网站 )。
台湾水库即时水情:https://water.taiwanstat.com/
import requests
web = requests.get('https://water.taiwanstat.com/') # 使用 get 方法
print(web.text) # 讀取並印出 text 屬性
处理乱码文题
如果发现爬取的内容是乱码,往往是网页与系统的编码设定不同导致,只要在爬取到内容后设定 encoding 为 utf-8 通常就能顺利解决。
import requests
web = requests.get('https://water.taiwanstat.com/') # 使用 get 方法
web.encoding='utf-8' # 因為該網頁編碼為 utf-8,加上 .encoding 避免亂碼
print(web.text)
透过 API 爬取第一个开放数据
除了可以爬取网页数据,也可以透过 requests 透过 API,取得政府机关所提供的开放数据,范例使用的是“高雄轻轨月均运量统计”的 JSON 文件,取得数据后,印出 json() 的内容 ( 注意,如果使用 json() 必须要确定回应的数据是 json 格式 )。
import requests
web = requests.get('https://data.kcg.gov.tw/dataset/6f29f6f4-2549-4473-aa90-bf60d10895dc/resource/30dfc2cf-17b5-4a40-8bb7-c511ea166bd3/download/lightrailtraffic.json')
print(web.json())
HTTP 状态代码
在爬取网页时,和浏览网页相同,有时会遇到网页无法浏览的情况,这时可以使用“status_code”读取网页的回应状态代码,网页有下列几种常见的回应状态代码:
| 状态代码 | 说明 |
|---|---|
| 200 | 网页正常。 |
| 301 | 网页搬家,重新导向到新的网址。 |
| 400 | 错误的要求。 |
| 401 | 未授权,需要凭证。 |
| 403 | 没有权限。 |
| 404 | 找不到网页。 |
| 500 | 服务器错误。 |
| 503 | 服务器暂时无法处理请求 ( 附载过大 )。 |
| 504 | 服务器没有回应。 |
下方的例子会读取一个不存在的网页,接着判断如果 status_code 为 404,印出“找不到网页”的文字。
import requests
web = requests.get('https://data.kcg.gov.tw/12345')
if web.status_code == 404:
print('找不到網頁')
传递参数
requests 在使用方法时,也可加入指定的参数,最常用的是 params ( GET 使用 )、data ( POST 使用 )、headers 和 cookies。
| 参数 | 说明 |
|---|---|
| params | GET 方法使用,传递网址参数 ( dict )。 |
| data | POST 方法使用,传递网址参数 ( dict )。 |
| headers | HTTP 的 headers 信息 ( 可模拟不同的浏览器 )。 |
| cookies | 设定 Request 中的 cookie ( dict )。 |
| auth | 支持 HTTP 认证功能 ( tuple )。 |
| json | JSON 格式的数据,作为 Request 的内容。 |
| files | 传输文件 ( dict )。 |
| timeout | 设定超时时间,以“秒”为单位。 |
| proxies | 设定访问代理服务器,可以增加认证 ( dict )。 |
| allow_redirects | True/False,默认 True,重新定向。 |
| stream | True/False,默认 True,获取内容立即下载。 |
| verify | True/False,默认 True,认证 SSL。 |
| cert | 本机 SSL 路径。 |
下方的例子会使用 get 的方式发送 request 给范例的网址,并会加入 params 参数,当网址收到数据后,就会回传指定的文字。
get 范例网址:https://script.google.com/macros/s/AKfycbw5PnzwybI_VoZaHz65TpA5DYuLkxIF-HUGjJ6jRTOje0E6bVo/exec
import requests
# 設定參數
params = {
'name':'oxxo',
'age':'18'
}
# 加入參數
web = requests.get('https://script.google.com/macros/s/AKfycbw5PnzwybI_VoZaHz65TpA5DYuLkxIF-HUGjJ6jRTOje0E6bVo/exec', params=params)
print(web.text)
参考数据
微信扫码关注
抖音扫码关注