How to scrape Google Scholar with Python

This guide shows how to scrape Google Scholar with Python: call one endpoint, get every paper as clean JSON with title, authors, year, and citations, then save it to a CSV file. No browser, no HTML parsing.

3,000 free searches / month, no card Title, authors, year, citations Clean JSON, no HTML parsing
PULLED LIVE FROM THE API, JULY 20, 2026

One request, real response

The hard part of scraping Google Scholar yourself is driving a browser, getting past the block page, and parsing markup that shifts without warning. Instead you send one HTTP request to a search endpoint and get structured results back. First a quick test with curl:

# one credit per search, however many results come back; empty searches cost nothing curl "https://crustapi.com/v1/search?type=scholar&q=climate change" -H "x-api-key: YOUR_KEY"

Then the same call in Python with the requests library. Install it with pip install requests, drop in a key, and run. The results live in the organic array:

# pip install requests, then run this file import requests resp = requests.get( "https://crustapi.com/v1/search", params={"type": "scholar", "q": "climate change"}, headers={"x-api-key": "YOUR_KEY"}, ) data = resp.json() for paper in data["organic"]: print(paper["title"], paper["year"], paper["citedBy"])

Here are two of the results that came back, shown as CSV so they drop straight into Sheets or a reference manager:

title,publicationInfo,year,citedBy,link "Modern global climate change","TR Karl, KE Trenberth - science, 2003 - science.org",2003,3064,"https://www.science.org/doi/abs/10.1126/science.1090228" "Climate change and the ecologist","W Thuiller - Nature, 2007 - nature.com",2007,1115,"https://www.nature.com/articles/448550a"

Scholar returns one page of results per call. To go deeper, add a page number and loop, collecting every result into one list:

# pull the first five pages into one list papers = [] for page in range(1, 6): r = requests.get( "https://crustapi.com/v1/search", params={"type": "scholar", "q": "climate change", "page": page}, headers={"x-api-key": "YOUR_KEY"}, ) papers += r.json()["organic"]

Change q to any Scholar query, like graph neural networks or crispr gene editing.

WHAT EVERY RESULT INCLUDES

The full record, ready to use

Every result comes complete, so you build a citation list or a research dataset with no second call. Here is one paper as CSV, ready for Sheets or a database:

title,publicationInfo,year,citedBy,link,pdfUrl "Modern global climate change","TR Karl, KE Trenberth - science, 2003 - science.org",2003,3064,"https://www.science.org/doi/abs/10.1126/science.1090228","https://www.agro.uba.ar/users/fernande/Karl%26Trenberth2003.pdf"

Or the same record as JSON, exactly as the API returns it:

// one result in full { "title": "Modern global climate change", "link": "https://www.science.org/doi/abs/10.1126/science.1090228", "publicationInfo": "TR Karl, KE Trenberth - science, 2003 - science.org", "snippet": "... the estimated change to date (2), dominates all other direct influences humans have on climate. For ... Global changes in atmospheric composition occur from anthropogenic emissions of ...", "year": 2003, "citedBy": 3064, "pdfUrl": "https://www.agro.uba.ar/users/fernande/Karl%26Trenberth2003.pdf", "id": "Sq6DrEx1vacJ", "position": 6 }
HOW IT COMPARES

vs writing your own scraper

You can build a Scholar scraper with a headless browser and a parser, and plenty of tutorials show how. The trade is that Scholar blocks automated traffic quickly, and the layout keeps moving. Here is the difference in practice.

Writing it yourselfCrustAPI
SetupInstall a headless browser, get past the block page and CAPTCHAsOne GET request, no browser
OutputParse the HTML yourself; fields break when the layout changesClean JSON from the API, or the same rows as CSV
MaintenanceFix the scraper each time the page changesWe keep it working
Free tierFree, but you pay in time and blocked requests3,000 searches / month, no card
Cost modelServer, proxy, and developer timeOne credit per search, whatever the result count; empty searches free
Storing the dataYours to manageNo storage limits. Export to CSV or a database
PRICING

One credit per search

Prepaid packs, and credits never expire: 25k for $49 · 100k for $149 · 500k for $549 · 2.5M for $1,999 · up to 250M, all self-serve, ex-tax. One search costs one credit, however many results come back; a search that returns none costs nothing.

Run your first Scholar search free
3,000 credits a month. No card, no contract.
Get started →
THE LAST STEP

Save the results to a CSV file

Because the response is plain JSON, Python's built-in csv module writes it to a file in a few lines. No extra libraries. This reads every result from the search and writes one row each:

# save every result to a CSV file with the built-in csv module import csv, requests data = requests.get( "https://crustapi.com/v1/search", params={"type": "scholar", "q": "climate change"}, headers={"x-api-key": "YOUR_KEY"}, ).json() with open("papers.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["title", "publicationInfo", "year", "citedBy", "link", "pdfUrl"]) for p in data["organic"]: writer.writerow([p["title"], p["publicationInfo"], p.get("year", ""), p.get("citedBy", ""), p.get("link", ""), p.get("pdfUrl", "")])

Open papers.csv in Sheets or Excel and you have a finished reading list. Swap the query, run it again, and append to build a bigger literature dataset.

Related: Google Scholar API · Google Search API · Google Patents API · Scrape Google Maps with Python · API docs

FAIR PLAY

When a different tool fits better: Google Scholar has no official API, so there is no formal SLA on this data. This endpoint returns the same public search results anyone sees on scholar.google.com, which is what most citation research and literature-review work needs. For licensed full text or bulk metadata, providers like Crossref and Semantic Scholar run their own APIs.

BEFORE YOU ASK

Common questions

WORKS WITH YOUR STACK

Try it on a topic you know

3,000 free credits covers a real search. Run one query and look at the JSON that comes back.

Get 3,000 free credits
No credit card required