這幾天註冊了 SerpAPI 帳戶使用其 API Key 來取得 Google 搜尋結果, 但它的免費帳戶一個月只能呼叫 100 次, 平均一天只能搜尋 33 次, 這似乎是太少了, 參考 :
今天在 "ChatGPT 開發手冊 Turbo x Vision" 這本書中找到 Custom Search JSON API, 它對免費帳戶提供每天 100 次呼叫服務, 是 SerpAPI 的 3 倍, 這就佛心多了, 以下紀錄註冊免費帳戶與取得 API Key 程序以及如何用它來取得 Google 搜尋資料.
1. 啟用谷歌 Custon Search JSON API 功能 :
Google Custom Search JSON API 是 Google 提供的一個 REST API, 可以讓開發者透過程式存取 Google 搜尋結果 (傳回格式為 JSON), 並可根據特定的自訂搜尋引擎來篩選內容. 只要有 Google 帳號即可申請使用, 免費版每天可搜尋 100 次, 付費版 5 美元可搜尋 1000 次, 不論免費或付費, 每次搜尋最多傳回 10 筆結果 (可利用 start 參數指定傳回筆數).
首先瀏覽器要登入 Google 帳號, 然後前往下列網址 :
按 "搜尋引擎 ID" 項目說明中的 "程式化搜尋引擎控制台" 超連結 :
按右上角的 "新增" 鈕新增一個自訂搜尋引擎 :
在 "為你的搜尋引擎命名" 欄中輸入搜尋引擎名稱 (自訂), 並於 "要搜尋甚麼" 欄位中勾選 "搜尋整個網路", 勾選我不是機器人後按 "建立" 鈕 :
這樣便建立了一個搜尋引擎, 我們可以複製 HTML 碼內嵌到自己的網頁中使用 :
按 "自訂" 鈕在下列頁面中按 "搜尋引擎 ID" 欄位右邊的複製鈕將此 ID 複製儲存到文字檔備用 :
接下來要取得此搜尋引擎 API 的金鑰, 這時回到 "程式化搜尋引擎控制台" 網頁, 按 "API 金鑰" 欄位中的 "取得金鑰" 鈕 :
在彈出的 "Enable Custom Search API" 視窗中點選 "+ Create a new project" 新增一個 GCP 專案 :
這樣便完成 API Key 的啟用了, 按 "SHOW KEY" 鈕即可顯示金鑰 :
有了自訂搜尋引擎 ID 與其 API Key 便可以用 HTTP GET 方法來取得谷歌搜尋結果了 (注意, 只能用 GET 方法, 不提供 POST 方法).
2. 使用 Custon Search JSON API 取得谷歌搜尋結果 :
透過 HTTP GET 方法取得谷歌自訂引擎搜尋結果可以使用內建的 urllib 或第三方爬蟲套件 requests, 以下測試使用 requests :
>>> import requests
關於 requests 用法參考 :
向自訂的谷歌搜尋引擎提出請求的網址格式如下 :
https://www.googleapis.com/customsearch/v1?q={query}&key={api_key}&cx={cx}&num={num}
也可以用 gl 參數指定地理位置 (台灣是 tw) 與 lr 參數指定語言 (繁體中文是 lang_zh-TW) :
https://www.googleapis.com/customsearch/v1?q={query}&key={api_key}&cx={cx}&num={num}&gl=tw&lr=lang_zh_TW
其中 query 是要搜尋的關鍵字, api_key 是金鑰, cx 是自訂搜尋引擎的 ID, NUM 是傳回的搜尋結果筆數 (前 NUM 筆), 此兩參數都使用 ISO 國家 (3166) 與語言標碼表 (639), 參考 :
定義變數如下 :
>>> cx='我的搜尋引擎 ID'
>>> api_key='我的 API Key'
>>> num=3
>>> query='2024台灣總統大選是誰當選?'
製作 HTTP GET 請求網址並將其傳入 requests.get() 函式 :
>>> url=f'https://www.googleapis.com/customsearch/v1?q={query}&key={api_key}&cx={cx}&num={num}'
>>> r=requests.get(url)
傳回值是攜帶 JSON 格式搜尋結果的 Response 物件, 呼叫其 json() 方法會轉成字典物件 :
>>> data=r.json()
>>> type(data)
<class 'dict'>
呼叫 keys() 方法檢視字典的鍵 :
>>> data.keys()
dict_keys(['kind', 'url', 'queries', 'context', 'searchInformation', 'items'])
搜尋結果是放 items 鍵裡面, 其值為一串列 :
>>> items=data['items']
>>> type(items)
<class 'list'>
檢視串列的第一個元素即可看到第一筆搜尋結果是一個字典 :
>>> items[0]
{'kind': 'customsearch#result', 'title': '2024年11月5日總統大選結果公布時間表| SF.gov', 'htmlTitle': '<b>2024</b>年11月5日<b>總統大選</b>結果公布時間表| SF.gov', 'link': 'https://www.sf.gov/zh-hant/november-5-2024-presidential-general-election-results-reporting-schedule?_gl=1*rpqmk7*_ga*NTA5MTY0MzM4LjE2NjU2OTYzOTg.*_ga_BT9NDE0NFC*MTcwOTU5ODgwMy4yODcuMC4xNzA5NTk4ODAzLjAuMC4w*_ga_63SCS846YP*MTcwOTU5ODgwMy4yMzguMC4xNzA5NTk4ODAzLjAuMC4w', 'displayLink': 'www.sf.gov', 'snippet': 'Nov 5, 2024 ... 投票站關閉後,選務處將會公布四份初步結果報告: ... 於選舉之夜公布的所有選舉結果均為初步性的,在往後的日子,當選務處點算數以萬計的選票後結果將會有所\xa0...', 'htmlSnippet': 'Nov 5, 2024 <b>...</b> 投票站關閉後,選務處將會公布四份初步結果報告: ... 於<b>選舉</b>之夜公布的所有<b>選舉</b>結果均為初步性的,在往後的日子,<b>當選</b>務處點算數以萬計的選票後結果將會有所 ...', 'formattedUrl': 'https://www.sf.gov/.../november-5-2024-presidential-general-election-result...', 'htmlFormattedUrl': 'https://www.sf.gov/.../november-5-<b>2024</b>-presidential-general-election-result...', 'pagemap': {'metatags': [{'next-head-count': '3', 'viewport': 'width=device-width'}]}}
我們關心的資訊放在下列三個鍵裡面 :
- title : 網頁標題
- link : 網頁網址
- snippet : 網頁摘要
可以用迴圈迭代 items 串列元素印出這三個鍵的內容, 此處改用字典的 get() 方法, 並指定預設傳回值為空串列 [] :
>>> for item in data.get('items', []):
print(f'標題: {item["title"]}')
print(f'描述: {item["snippet"]}')
print(f'網址: {item["link"]}\n')
標題: 2024年11月5日總統大選結果公布時間表| SF.gov
描述: Nov 5, 2024 ... 投票站關閉後,選務處將會公布四份初步結果報告: ... 於選舉之夜公布的所有選舉結果均為初步性的,在往後的日子,當選務處點算數以萬計的選票後結果將會有所 ...
網址: https://www.sf.gov/zh-hant/november-5-2024-presidential-general-election-results-reporting-schedule?_gl=1*rpqmk7*_ga*NTA5MTY0MzM4LjE2NjU2OTYzOTg.*_ga_BT9NDE0NFC*MTcwOTU5ODgwMy4yODcuMC4xNzA5NTk4ODAzLjAuMC4w*_ga_63SCS846YP*MTcwOTU5ODgwMy4yMzguMC4xNzA5NTk4ODAzLjAuMC4w
標題: 2024年中华民国总统选举- 维基百科,自由的百科全书
描述: 选举结果,赖清德、萧美琴当选中华民国第16任总统、副总统。本次是继2000年后再度未有任一候选人得票率过半的总统选举,亦是自总统直选以来,首度 ...
網址: https://zh.wikipedia.org/zh-cn/2024%E5%B9%B4%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E7%B8%BD%E7%B5%B1%E9%81%B8%E8%88%89
標題: 台湾大选:一文读懂民进党赖清德为何获胜以及选后的各种看点- BBC ...
描述: Jan 14, 2024 ... 2024年台湾总统选举结果揭晓,民进党候选人赖清德及萧美琴成功当选新一任总统及副总统,总得票数达558万,得票率为40.05%。此役民进党打破台湾政坛执政党 ...
網址: https://www.bbc.com/zhongwen/simp/chinese-news-67973916
可見若未指定位置與語言, 傳回值可能出現簡體中文結果.
另外一個做法是把 GET 的參數放在一個字典中, 然後在呼叫 requests.get() 方法時將其傳遞給 params 參數 :
>>> params={
'q': query,
'key': api_key,
'cx': cx,
'lr': 'lang_zh-TW',
'gl': 'tw',
'num': 3
}
這時 url 就不需要攜帶參數了 :
>>> url='https://www.googleapis.com/customsearch/v1'
>>> r=requests.get(url, params=params)
>>> data=r.json()
>>> for item in data.get('items', []):
print(f'標題: {item["title"]}')
print(f'描述: {item["snippet"]}')
print(f'網址: {item["link"]}\n')
標題: 2024年11月5日總統大選結果公布時間表| SF.gov
描述: Nov 5, 2024 ... 投票站關閉後,選務處將會公布四份初步結果報告: ... 於選舉之夜公布的所有選舉結果均為初步性的,在往後的日子,當選務處點算數以萬計的選票後結果將會有所 ...
網址: https://www.sf.gov/zh-hant/november-5-2024-presidential-general-election-results-reporting-schedule?_gl=1*rpqmk7*_ga*NTA5MTY0MzM4LjE2NjU2OTYzOTg.*_ga_BT9NDE0NFC*MTcwOTU5ODgwMy4yODcuMC4xNzA5NTk4ODAzLjAuMC4w*_ga_63SCS846YP*MTcwOTU5ODgwMy4yMzguMC4xNzA5NTk4ODAzLjAuMC4w
標題: 2024年中華民國總統選舉- 維基百科,自由的百科全書
描述: 選舉結果,賴清德、蕭美琴當選中華民國第16任總統、副總統。本次是繼2000年後再度未有任一候選人得票率過半的總統選舉,亦是自總統直選以來,首度 ...
網址: https://zh.wikipedia.org/zh-hant/2024%E5%B9%B4%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E7%B8%BD%E7%B5%B1%E9%81%B8%E8%88%89
標題: 台灣大選2024:賴清德當選總統民進黨未能控制立法院- BBC News ...
描述: Jan 13, 2024 ... 1月13日,台灣舉行2024年總統選舉與立法委員選舉,執政黨民進黨候選人賴清德以超過558萬票勝選。
網址: https://www.bbc.com/zhongwen/trad/chinese-news-67971619
因為有指定 gl 與 lr 參數, 所以傳回的搜尋結果都是繁體中文了.
為了簡化查詢過程, 我將上述程式碼寫成如下之函式 :
>>> def search_google(query, cx, api_key, num=3, gl='tw', lr='lang_zh_TW'):
params={
'q': query,
'key': api_key,
'cx': cx,
'gl': gl,
'lr': lr,
'num': num
}
url='https://www.googleapis.com/customsearch/v1'
r=requests.get(url, params=params)
data=r.json()
return data.get('items', [])
此函式預設傳回前 3 筆台灣繁體中文之搜尋結果, 使用前先匯入 requests 套件 :
>>> import requests
然後定義引擎 ID, 金鑰, 與關鍵字等參數值, 並將它們傳入 search_google() 即可, 它會傳回一個包含 title, link, snippet 等鍵之字典串列 :
>>> cx='我的搜尋引擎 ID'
>>> api_key='我的 API Key'
>>> query='2024 台灣金曲歌王是誰?'
>>> for item in search_google(query, cx, api_key):
print(f'標題: {item["title"]}')
print(f'描述: {item["snippet"]}')
print(f'網址: {item["link"]}\n')
標題: 2024金曲獎得獎名單完整公佈!MC HotDog奪歌王,歌后由孫盛希抱回
描述: Jun 30, 2024 ... 拿下最佳作詞人的MC HotDog熱狗再度成功拿下金曲歌王,適逢女兒生日,上台時他表示:「今天剛好是我女兒的生日,祝你生日快樂。我本來跟他講說,如果我沒有得獎 ...
網址: https://www.marieclaire.com.tw/entertainment/music/80150/the-35th-golden-melody-awards-winners
標題: 【金曲獎2024】金曲35完整得獎名單!MC HotDog熱狗奪歌王 ...
描述: Jun 29, 2024 ... 2024年「第35屆金曲獎」於6月29日,在台北小巨蛋盛大登場!本屆除了主持組合、表演嘉賓讓人相當期待,得獎名單也相當精采,角逐歌王歌后寶座的唱匠包括: ...
網址: https://www.elle.com/tw/entertainment/music/g61459193/gma-2024-35-award/
標題: 【2024 金曲獎】金曲35 完整得獎名單:MC HotDog、孫盛希封歌王 ...
描述: Jun 29, 2024 ... ... 歌手」封歌王、歌后,但真正的大贏家則是一舉拿下「最佳樂團獎」、「最佳華語專輯獎」、「年度專輯獎」的草東沒有派對!現在,馬上來看金曲35 的完整 ...
網址: https://www.gq.com.tw/article/%E5%BE%97%E7%8D%8E%E5%90%8D%E5%96%AE-2024%E9%87%91%E6%9B%B2%E7%8D%8E-%E9%87%91%E6%9B%B235
Custom Search JSON API 每天可以免費呼叫 100 次, 這是 SerpAPI 的 3 倍, 所以以後就改用這個吧! SerpAPI 就當備用好了.
沒有留言 :
張貼留言