
天貓商品數據爬取方案:官方API與非官方接口實戰
# 電工上門
# 電工維修
return "電力恢復正常"
每當出現電力故障時,我們只需要調用「撥打電工號碼」這個函數就可以將電力恢復正常,而無需了解電工上門使用的交通工具和具體的維修過程,API 的概念與此類似,在使用過程中我們關注的只有兩點:API 的端點和參數
API 的功能(能達到的目的)除了上文提到過的「庫」和「函數」之外,平日里我們說到 API,大部分時候指的是服務端與客戶端通信的一種模式,比如:RESTful、GraphQL、gRPC,它們就像是無形的「絲線」,編織起了互聯網的基礎。RESTful、GraphQL、gRPC 都是用于設計和實現 API 的方式,目的是提供一種標準化的方法來定義和訪問服務或資源。它們都基于網絡協議(如 HTTP 或 HTTP/2)進行通信,使用特定的數據格式(如 JSON、Protocol Buffers)來傳輸數據,為服務提供者和消費者之間提供了一種約定和規范,促進了系統的互操作性和松耦合性。至于 API 能為我們帶來什么效率提升自然不必多說,相信大家在少數派看過不少使用「API」做文章的高級技巧了,尤其是作者們基于 Notion API 實現各種自動化功能,著實令人眼花繚亂。不過授人以魚不如授人以漁,讀完這篇文章,你也一定能制作出屬于自己的效率工具!
API 雖然無形,可你一定能感知到它們的存在,每當我們輕車熟路地點擊一個「按鈕」或者敲擊一次「回車」,其后都有數條細小的絲線將你需要的內容準確無誤地匯聚到瀏覽器窗口之中。這就意味著只要能捕獲這些「絲線」,即使不借助瀏覽器也能獲取需要的資源。那么該怎么「捕獲」這些絲線呢?主要有三種方法:查看官方 API 文檔使用 F12 觀察網頁特點使用抓包工具
首選的方式當然是查看各大平臺的官方網站是否提供 API 文檔,比如 Notion、和風天氣、訊飛語音都具備詳盡的開發者文檔,官方貼心地提供了 API 的詳細說明,包括如何進行認證、可用的端點(Endpoints)、請求的參數、請求和響應的格式以及錯誤代碼的含義等。在閱讀官方文檔時需要關注以下幾點:
注意以上幾點,能夠顯著加速開發過程,減少猜測工作,并幫助你避免常見的錯誤。
理想很美好,現實很殘酷,并非所有平臺都會貼心地為你附上一篇詳細的 API 文檔,平臺方自然是出于服務器壓力、可維護性等方面的考量,這就需要使用其他途徑捕獲 API。現代瀏覽器內置的開發者工具是探索和理解網頁工作原理的寶庫,它們允許開發者查看網頁的 HTML 結構、CSS 樣式、JavaScript 代碼以及網絡請求和響應(詳見這篇文章)。你可以在開發者工具中打開「網絡(Network)」面板,刷新頁面以開始捕獲網絡請求。頁面刷新后,網絡面板會列出所有發出的網絡請求,包括 API 的調用、圖片、腳本、CSS 文件等,使用面板頂部的過濾器可以縮小關注點,在本篇內容你只需關注「Fetch/XHR」請求即可,這里面通常包含與 API 交互的相關請求。點擊任何一個請求,你將看到該請求的詳細信息,這也是一條網絡 API 請求通常會包含的內容:
純理論未免有些晦澀,下面是一個實際的例子:假設我想使用少數派的 API 做一些自動化的工具,而官方又沒有提供 API 文檔的情況下,此時就可以使用 F12 打開「開發者工具」一探究竟,從中找出需要的內容,在「開發者工具」選中「Network」下的「Fetch/XHR」標簽,使用少數派的搜索功能搜索一個關鍵詞。
上圖所列出的就是這個網頁背后的「絲線」,你在頁面上看到的所有數據(譬如文章數量、文章標題、文章概要以及右側邊欄的熱門文章)都是通過這些「絲線」進行傳遞的。隨便點進其中一條 API 的詳情頁,可以看到完整的 URL 為:https://sspai.com/api/v1/search/article/page/get?free=1&title=%E6%B5%8F%E8%A7%88%E5%99%A8&stime=0&offset=0&limit=8
遺憾的是官方并沒有提供詳細的使用文檔,具體的功能和使用方式還得觀察和測試之后才能得知。在 URL 規范中「?」用于區分路徑和參數,「?」前面代表的是請求的基本網址,即 https://sspai.com/api/v1/search/article/page/get,這是由開發者定義的 API 端點,通過英文單詞也可知道其功能是搜索文章,并且需要使用「get」方法。而「?」后用「&」區分的就是一個個傳遞給服務端的參數,具體的參數列表如下:
先稱贊一下少數派網站的開發者,API 的可讀性不錯,我們僅憑單詞釋義就將這條 URL 的功能猜了個七七八八,不過至于猜的到底對不對呢,這里推薦使用 Postman 測試,使用方法也很簡單,只需要填寫基礎網址,改動幾個參數的值就能輕松發送請求和查看響應,上面還剩下幾個不確定的參數就留給讀者朋友們自己測試啦。知曉 API 的參數和功能之后我們就可以使用 API 做一些有趣的事情,這里我編寫了一個簡單的示例代碼(適用于 windows)用于獲取少數派的首頁文章,各位可以在本地建立一個名為:test.txt 的文件,將代碼拷貝至其中。
@echo off
SetLocal EnableDelayedExpansion
set "outputFile=titles.txt"
powershell -Command "$response = Invoke-RestMethod -Uri 'https://sspai.com/api/v1/article/index/page/get?limit=10&offset=0&created_at=0'; $titles = $response.data | ForEach-Object { $_.title }; [array]::Reverse($titles); $titles" > %outputFile%
保存后將該文件的后綴名改為 bat ,直接點擊 test.bat 你就可以得到一個包含最近十篇首頁文章標題的 titles.txt 文件。
使用抓包工具網頁端我們可以使用 F12 進行抓包,可占據了互聯網半壁江山的 app 卻很少提供相應的 web 版本,所以如果想在移動端 app 上捕獲 API 就要借助一些抓包工具,比如安卓端的 Fiddler、蘋果端的 Stream。不過與直接在瀏覽器的開發者工具中查看網絡響應不同,使用抓包工具需要手動配置 CA 證書才能捕獲 HTTPS 的流量。這是由于二者捕獲數據的原理有差異,我們都知道 HTTPS 傳輸的是加密后的數據,而抓包工具本質上是捕獲網絡中傳輸的數據包(網絡層),以分析網絡通信過程中的數據交換細節,直接抓包只能看到加密后的數據。而開發者工具中則是在查看瀏覽器已經解密之后的 HTTPS 通信數據(應用層),因為瀏覽器作為受信任的客戶端已經與服務器建立了安全的 TLS 連接。
所以需要額外安裝抓包工具的證書,這樣,抓包工具就可以作為中間人解密來自手機的數據包,再加密后發送給服務器;同時也能解密服務器的響應,再加密后發送回手機。具體細節此處不細探討,有關 HTTPS 的更多知識推薦看 B 站的這個視頻:「HTTPS 是什么?加密原理和證書,SSL/TLS 握手過程」。看不懂沒關系,大部分抓包 app 都在下載時貼心地準備了安裝證書的教程,以蘋果端的 Stream 為例,初次打開軟件便會提示你需要安裝 CA 證書。
接著按照上圖流程,在「設置 – 通用 – VPN 與設備管理」中安裝下載的描述文件(對應的描述文件的名稱中包含「CA」字樣),安裝完成后還需在「設置 – 通用 – 關于本機 – 證書信任設置」中將該證書設置為信任。提示:盡量選擇你信任的抓包軟件,隨意安裝 CA 證書可能會帶來風險。配置完成后,只要按下「開始抓包」按鈕,此期間產生的網絡交換信息都可以輕松捕捉到。
通過以上三種途徑足以捕獲大部分平臺的 API 信息,之后我們就可以使用這些API實現效率提升,下面便是一個實際的例子。
在信息爆炸的時代,我們常常面臨著一個困境:海量的信息散落在各大平臺,如微博、知乎、少數派等。每天,我們都需要在這些平臺之間不斷切換,以獲取自己感興趣的內容。這無疑耗費了大量的時間和精力,降低了信息獲取的效率。面對這種情況,我們迫切地需要一種更高效、更便捷的信息獲取方式。一個理想的解決方案是:在個人筆記或博客的一個頁面中聚合多個平臺的熱門內容,實現信息的一站式瀏覽。說到這,相信大家心里一定有想法了:如果能夠抓取各大平臺的熱門文章 API,從接口獲取對應的熱榜信息,是不是就能實現一個「私人信息中心」呢。當然每個人的興趣各異,常逛的論壇也不同,那么第一步就是需要獲取你感興趣的平臺中與「熱門文章」有關的 API。以知乎為例,通過瀏覽其網頁版發現,熱榜信息會在「首頁 – 熱榜」這一標簽下展示,打開 F12 觀察一下這個網頁的特點。
我們發現熱榜信息是通過這條 API 獲取的:https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total觀察一下「Headers」中的信息,可以發現該 API 使用的是 「GET」方法,附加的參數也很簡單,只有兩個:limit – 返回的結果數量desktop – 是否為桌面端不過直接訪問 API 的話只能得到一個復雜的 JSON 格式的數據,在 Postman 查看返回值能知道其大致結構如下:{
"data": [
{
"target": {
"id": 1234567890,
"title": "文章標題",
"url": "https://api.zhihu.com/questions/1234567890",
// 其他字段
},
// 其他字段
},
// 更多數據項
]}
試想一下,「私人信息中心」中最需要的是什么數據?必不可少的是今日熱榜的標題和鏈接,換成 HTML 中的表達來說就是一個具有 href 屬性和文本的標簽:
/這是一條熱榜信息的基本單元/
百度
接下來就要從 API 的返回值中獲取我們需要的信息:標題和鏈接,從上文的 JSON 中可以看到標題信息保存在 data.target.title ,這一部分我們直接獲取即可,但data.target.url中的鏈接格式卻不是很理想,回到網頁端的知乎,我們隨便點擊一條熱榜查看該頁面的地址欄,可以看到有效的 URL 格式為:?https://www.zhihu.com/question/1234567890所以還需將JSON的對應字段轉為正確可訪問的 URL。此外,返回值里面還有很多有趣的信息,比如熱榜的概要、熱度、圖片等,如果你需要的話,也可以獲取這些內容。下面是一個使用 nodejs 寫的一個示例:
const axios = require('axios')
async function getZhihuHotList() {
const hotList = {}
let num = 0
const response = await axios.get('https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total')
const data = response.data.data
data.forEach((ele) => {
hotList[num] = {
title: ele.target.title,
link: ele.target.url.replace("api","www").replace("questions","question") //將 URL 替換為正確可訪問的地址
}
num += 1
})
return hotList
}
以上代碼可以將知乎 API 的返回值精簡為一個只包含標題和鏈接的 JSON,以供后續使用。接下來各位可以嘗試自己獲取一下少數派和微博的熱榜數據。前文的例子中我們已經編寫了一個 test.bat 文件用于獲取少數派的首頁文章,在其中使用的 API 端點為:https://sspai.com/api/v1/article/index/page/get,但其實少數派也有一個「熱門」板塊,不過我更關注的是近期「首頁」的文章,所以選擇了這條 API。獲取這些必要的信息后,我們就可以在個人博客中搭建一個「私人信息中心」頁面,將這些內容整合在一起方便日常瀏覽。我使用的是 Trilium 筆記的 Ankia 博客系統,下文便以此為例。Trilium 是一款開源可部署的筆記軟件,擁有一個可運行的 nodejs 環境;Ankia 是一款基于 Trilium 的博客主題,能夠直接將 Trilium 中的筆記轉換為博客。Trilium 是一款開源可部署的筆記軟件,擁有一個可運行的 nodejs 環境;Ankia 是一款基于 Trilium 的博客主題,能夠直接將 Trilium 中的筆記轉換為博客。Trilium 支持直接運行 nodejs 環境的代碼,那么把上文中的示例稍微修改一下,并將精簡后的 JSON 保存在一個名為「今日熱榜」的筆記屬性中。然后通過 EJS 模板獲取 「今日熱榜」筆記中的相關屬性,將其渲染為通用的 HTML。
知乎熱榜
- <a href="" target="_blank" rel="nofollow">
輔以 EJS 模板的渲染,最終實現的效果如下:
最后一步,既然聚合是各大平臺熱榜,那么定時更新熱榜信息也是重要的一環,在 Trilium 中可以輕松實現腳本的定時運行,只需在腳本筆記添加:#run=hourly 屬性就可以讓其每小時自動運行一次,以確保信息的及時有效。當然,以上只是一個簡單的示例,這是你的「私人信息中心」,可以根據自己的需求對其進行擴展和定制,比如增加更多的內容源、添加分類和標簽功能、優化頁面樣式等。
在網絡世界,API 就像是一把潛行者的「利刃」,讓我們在數字世界游刃有余,無論是通過查閱官方文檔,還是使用 F12 開發者工具和抓包軟件,我們都可以發現 API 的蹤跡,稍微思考一番,你也可以利用它們來實現自己的創意。最后,請在遵守法律法規的前提下爬取和使用 API,作者不鼓勵或支持任何違反法律的行為,做到尊重他人的知識產權,保護用戶的數據安全和隱私,不從事任何違法犯罪活動是每一個網民應該遵守的基本原則。
原文轉載自:https://mp.weixin.qq.com/s/LlKvLlVI1L3ikiHf0pnLBA