DEV Community

Cover image for Cara menemukan PDF gratis dari sebuah makalah ilmiah lewat DOI-nya

Cara menemukan PDF gratis dari sebuah makalah ilmiah lewat DOI-nya

Kamu punya DOI, halaman penerbit minta login, padahal kamu hanya perlu membaca bagian metodenya. Sering sekali ada salinan legal yang gratis di suatu tempat: repositori universitas penulisnya, preprint, atau PubMed Central. Kalau dicari manual, kamu harus mencoba empat sampai lima situs. Kalau lewat kode, cukup beberapa API publik yang dipanggil dengan urutan yang masuk akal.

Urutan di bawah ini dipakai oleh tombol View di ruang kerja Paper pada aplikasi desktop osFoundry. Backend-nya mencoba tiap sumber secara bergiliran sampai ada yang mengembalikan PDF sungguhan (halaman ruang kerja penulisan dan riset makalah menunjukkan tampilan di sekitarnya). Contoh di sini memakai dua DOI nyata untuk pertanyaan yang sama: apakah ponsel yang tergeletak di meja mengganggu konsentrasi.

  • 10.1037/tmb0000123, meta-analisis tahun 2024 (Hartanto et al.)
  • 10.1086/691462, studi "Brain Drain" tahun 2017 yang sering dikutip (Ward et al.)

Tombol View pada hasil pencarian membuka teks meta-analisis di dalam aplikasi

Minta semua lokasi dari OpenAlex, bukan hanya penanda open access

OpenAlex mencantumkan setiap tempat makalah disimpan, dan untuk tiap lokasi, apakah ada PDF langsungnya:

curl -s "https://api.openalex.org/works/doi:10.1037/tmb0000123?select=open_access,best_oa_location,locations"
Enter fullscreen mode Exit fullscreen mode

Untuk meta-analisis tadi, hasilnya tiga lokasi: tautan PDF dari penerbit, PDF di repositori James Cook University, dan halaman landing di perpustakaan Singapore Management University.

Untuk makalah Brain Drain, permintaan yang sama menunjukkan "is_oa": true dan "oa_status": "green", tetapi setiap pdf_url bernilai null. Satu-satunya salinan terbuka adalah halaman landing sebuah repositori. Jadi is_oa hanya memberi tahu bahwa versi gratis ada di suatu tempat, bukan bahwa kamu bisa mengunduhnya. Baca pdf_url di setiap lokasi.

Tanpa API key, permintaan ke OpenAlex berbagi jatah harian gratis yang kecil dengan semua orang di alamat IP-mu, dan meta.notice pada responsnya menyebutkan hal itu. Key gratis (api_key= pada query) memberimu jatah sendiri, dan aplikasi membaca key dari OPENALEX_API_KEY jika kamu mengaturnya.

Periksa lima byte pertama

pdf_url pun baru sebatas janji. Penerbit sering mengembalikan cookie wall, pemeriksaan bot, dan halaman login dengan status 200 dan isi HTML. Kode Rust aplikasi hanya menerima unduhan jika isinya diawali magic number PDF:

if !fetched.bytes.starts_with(b"%PDF-") {
    self.tried.push(format!("{source}: link was a web page, not a PDF"));
    return None;
}
Enter fullscreen mode Exit fullscreen mode

Ide yang sama dalam Python, hanya dengan pustaka standar:

import json
import urllib.error
import urllib.request

UA = {"User-Agent": "paper-finder/1.0"}

def get(url):
    with urllib.request.urlopen(urllib.request.Request(url, headers=UA), timeout=30) as r:
        return r.read()

def pdf_links(doi):
    try:
        work = json.loads(get(f"https://api.openalex.org/works/doi:{doi}"
                              "?select=best_oa_location,locations"))
    except urllib.error.HTTPError as e:
        if e.code == 404:
            return []
        raise
    links = []
    for loc in [work.get("best_oa_location")] + work.get("locations", []):
        url = (loc or {}).get("pdf_url")
        if url and url not in links:
            links.append(url)
    return links

def first_real_pdf(doi):
    tried = []
    for url in pdf_links(doi)[:4]:
        try:
            body = get(url)
        except (urllib.error.URLError, TimeoutError) as e:
            tried.append(f"{url}: {e}")
            continue
        if body[:5] == b"%PDF-":
            return url, body
        tried.append(f"{url}: a web page, not a PDF")
    raise LookupError("no free PDF; tried: " + "; ".join(tried or ["no pdf_url at all"]))
Enter fullscreen mode Exit fullscreen mode

Pada meta-analisis, tautan penerbit menolak skrip dan salinan dari repositori datang sebagai PDF 1,6 MB. Pada Brain Drain, skrip langsung gagal dengan "no pdf_url at all". Menyimpan daftar apa yang sudah dicoba dan kenapa gagal layak ditambah beberapa baris; "teks lengkap tidak ada" saja akan membuatmu kembali mencari manual.

Batas empat tautan per pencarian dan penghapusan URL ganda juga berasal dari aplikasi. Beberapa makalah punya belasan lokasi yang semuanya mengarah ke file yang sama.

Sisa rantainya

Pencarian di OpenAlex hanyalah satu langkah. Urutan lengkap di aplikasi:

  1. Tautan PDF yang sudah ikut di hasil pencarian, kalau ada.
  2. arXiv. DOI berbentuk 10.48550/arXiv.<id> adalah makalah arXiv, dan https://arxiv.org/pdf/<id> selalu gratis.
  3. Salinan terbuka dari DOI, lewat Unpaywall atau OpenAlex. Unpaywall (https://api.unpaywall.org/v2/<doi>?email=<your email>) mengembalikan best_oa_location.url_for_pdf dan daftar oa_locations, dan menolak permintaan tanpa alamat email asli. Kedua layanan itu berasal dari nirlaba yang sama, OurResearch, jadi aplikasi bertanya ke Unpaywall jika UNPAYWALL_EMAIL diatur dan membaca lokasi OpenAlex jika tidak, tidak keduanya.
  4. CORE. API v3-nya (/v3/search/works?q=doi:"<doi>", dengan bearer key) mengumpulkan salinan dari repositori dan sering langsung mengembalikan teks hasil ekstraksi di fullText. Aplikasi memakai teks itu jika lebih dari 500 karakter, dan jika tidak, mencoba downloadUrl.
  5. PubMed Central. Dengan PMCID, Europe PMC menyajikan seluruh artikel sebagai XML JATS di https://www.ebi.ac.uk/europepmc/webservices/rest/<PMCID>/fullTextXML. Itu bukan PDF, tetapi berisi bagian, gambar, dan referensi dalam struktur yang mudah dikonversi ke HTML.

Abstrak datang sebagai inverted index

Satu lagi detail OpenAlex yang sering menjebak: tidak ada field abstract. Yang ada adalah abstract_inverted_index, yaitu peta dari tiap kata ke posisi kemunculannya, dan teksnya harus kamu susun ulang sendiri:

words = {pos: w for w, positions in idx.items() for pos in positions}
abstract = " ".join(words[i] for i in sorted(words))
Enter fullscreen mode Exit fullscreen mode

Itu cukup untuk hasil pencarian dan penyaringan awal. Untuk makalah Brain Drain, yang satu-satunya salinan terbukanya adalah halaman repositori, abstrak ditambah teks lengkap meta-analisis kurang lebih batas yang bisa dicapai jalur gratis, dan biasanya di titik itulah saatnya memeriksa apakah perpustakaanmu punya akses.

Top comments (0)