前陣子分享的論文評讀工具(讓 Claude 幫忙做品質評讀跟內容整理),有朋友回我一句很實在的話:工具是好用,但每次都得自己先去把 PDF 生出來,最煩的其實是這一步。

真的是這樣。要讓 AI 幫你讀論文,你得先拿得到全文。而拿全文這件事,卡住的通常不是 AI,是權限、是出版社、是圖書館。

所以論文三件組裡最後一塊、也是最痛的一塊,今天終於補上了:paper-fetch(MIT 開源)。給它一個 DOI,它會自己走完整條路,把全文 PDF 抓下來。

階段工具做什麼
發現論文學習雷達 paper-radarRSS/PubMed 餵新論文,依興趣排序
下載paper-fetchDOI → 全文 PDF
評讀claude-paper-tools品質評讀、內容整理

它怎麼運作?一道由便宜到麻煩的階梯

整個設計只有一句話:先走最便宜、最正當的路,失敗才往下掉

第一層:開放取用(open access)

Unpaywall、Semantic Scholar、PMC/Europe PMC,還有藏在文章網頁裡的 citation_pdf_url meta tag(那正是 Google Scholar 拿來索引 PDF 的東西)。這層零金鑰、開箱即用,你只要在設定檔填自己的 email。沒有圖書館資源的人,能接的來源我都接上去了。

第二層:出版社官方的文字探勘 API(text-mining API)

Elsevier、Wiley、Springer 都有正式開放給文字探勘用的 API,自己去申請一把金鑰就好,是完全被允許的管道。這層跟盜版一點關係都沒有,只是大家很少知道它存在。

第三層:自己醫院圖書館的校外連線

你自己的帳號登入,抓你們醫院本來就有訂的期刊。它只是把你原本會手動做的那一串點擊自動化,不是繞過付費牆。

第四層:投降,但投降得有用

全部失敗的話,它會把圖書館的 SFX/OpenURL 連結印出來讓你手動去點,而不是丟一個 error 就沒了。

沒有 Sci-Hub,沒有盜版路線。 每一層都是你本來就有資格走的路。

最花時間的是什麼?把每一家出版社的脾氣摸清楚

這是我覺得整個專案最值得分享的部分。DOI 換 PDF 聽起來像一行程式,實際上每家出版社的做法都不一樣,而且沒有文件可以查,只能一篇一篇撞出來。目前摸清楚、而且用真實文章驗證過的有 20 幾條路線,收斂成四種形狀。

形狀一:網址模板

有規則可循的最幸福,從 DOI 直接組出 PDF 的網址就好。Wiley、Springer/BMC、NEJM、Sage、Taylor & Francis、AJR、Radiology、World Scientific 都屬於這一類。

形狀二:讀 citation_pdf_url

遇到新的出版社,這條要第一個試。 很多網站沒有 DOI 換 PDF 的規則,卻會在文章頁面的 HTML 裡老老實實寫一個 <meta name="citation_pdf_url">,直接告訴你 PDF 在哪(因為 Google Scholar 就是靠它索引的)。把 DOI 解析到文章頁、讀那個 meta、帶著 Referer 去抓就好,完全不用逆向工程。JAMA、Oxford、Nature、Pediatrics 都是這樣拿到的。

形狀三:要「有頭」的瀏覽器

同樣是讀 meta,但 Cloudflare 會擋。這裡有個我一開始判斷錯的地方:BMJ 我本來在文件裡寫它是「WAF 硬擋、死路一條」,後來才發現它只擋無頭瀏覽器(headless browser),真的開一個看得到畫面的瀏覽器、老老實實導航過去,第一次就過了。AJNR 和 J Nucl Med 也是同一招救回來的。

一個判死的結論,值得每隔一陣子拿出來重驗一次。

形狀四:多步驟的簽名網址

LWW/Ovid 這種平台不會給你固定網址,PDF 連結是一次性簽發的,得照順序走完一串頁面才拿得到。這類最麻煩,但也是走得通的。

抓不到的時候,到底是誰的錯?

還有一個很吃虧的坑:你沒有訂閱的文章,會讓一條好好的路線回傳一頁 HTML 或 403,看起來跟程式壞掉一模一樣。於是你會跑去修一個根本沒壞的東西。

所以工具裡多了一層 holdings.py:把圖書館的 A–Z 電子期刊清單(期刊、平台、涵蓋年份)存成一張本地對照表,之後每篇論文用 DOI 去 CrossRef 拿 ISSN 跟年份,一查就知道這篇到底有沒有權限。先確認權限,再回頭判斷路線壞不壞。

兩個實務上的細節:

  • 涵蓋範圍是逐刊也逐年的。 圖書館可能只訂了某本期刊的 1990 年代單期,或不含 online first,所以「我們有訂這本」根本不夠。
  • 「不在清單裡」不等於「沒權限」。 JAMA 完全不在我們的電子期刊清單裡(它掛在資料庫那一層),但代理實測抓得起來。所以查無資料時只警告、照樣試。

每家圖書館的 A–Z 頁面長得都不一樣,所以我沒有附爬蟲,只給了資料表的欄位規格。你自己抓,或直接跟圖書館要一份匯出檔,都可以。

老實說,它不是拿了就能用

這點我想講清楚,不要讓人抱著期待 clone 下來然後失望:

  • 設定檔要填你自己醫院圖書館的端點(link resolver、校外認證入口、代理主機)。這些不是機密,是你們圖書館的公開資訊。
  • 要去申請幾把出版社的 API 金鑰(免費,但要填表)。
  • 圖書館代理那層的 login() 我留成空白。因為每家醫院的登入流程都不一樣(EZproxy、OpenAthens/Shibboleth、VPN、自建 portal 是四大家族),這一段本來就只能你自己接。

但這正是這個時代好玩的地方

repo 裡有一份 AGENTS.md,是專門寫給 AI 看的說明書:這個工具是什麼、怎麼幫使用者部署、部署完怎麼驗收、哪些是紅線(不准偽造別人機構的端點、不准把帳密寫進設定檔、不准為了大量下載把速率限制拿掉、不准加 Sci-Hub 路線)。程式碼裡的 docstring 也是照「教會你方法」而不是「跑得動就好」在寫的。

所以你不用會寫程式。把 repo 丟給 Claude,跟他說「幫我接上我們醫院的圖書館」,他會讀 AGENTS.md、跟你要端點、帶你去 devtools 看登入流程、把 login() 補完。我自己也是這樣跟他一起把它寫出來的。

一條紅線:不要平行爆抓

圖書館那層是嚴格一篇一篇來,每篇之間等 15 秒

這不是我龜毛。出版社一旦偵測到系統性大量下載,封鎖的是整間醫院的 IP,害到的是全院所有同事。工具裡的速率限制是為了保護這個共用資源,請不要把它拿掉。

花蓮慈濟的同事

慈濟版(端點都填好、可以直接跑)是另一個非公開的 repo。想試用的話,私訊我你的 GitHub email,我把你加進去。

從發現、下載到評讀,這條線總算整條打通了。如果有理解錯誤的地方,也歡迎指正~