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