Tony Wang6 min readHow to Scrape Goodreads in 2026 (API & Python)
Scrape Goodreads in 2026 — books, ratings, reviews, authors, and lists — DIY, no-code, or a structured API, since Amazon retired the Goodreads API.
The fastest way to scrape Goodreads in 2026 is to call a structured API that returns normalized JSON — book detail, ratings, reviews, author profiles, and list rankings — instead of parsing Goodreads' HTML yourself. That matters more here than on most platforms in this series: Amazon shut down the Goodreads Developer API to new applicants in December 2020, so there is no official, paid, or enterprise path back in. This guide covers DIY, no-code, and a structured API, plus the legal reality up front.
Why scrape Goodreads?
Goodreads is the largest public book-rating and review dataset on the web, which powers:
- Book catalog enrichment — attach canonical title, author, rating, and genre data to a reading app or internal dataset.
- Recommendation and discovery — build "similar books" or genre-based recommendation features from ratings and shelving data.
- Reception research — track how a book's average rating and review volume move after release or a media adaptation.
- Author and bibliography tracking — follow an author's full catalog, quotes, and reader sentiment over time.
- List and trend monitoring — watch Listopia rankings and genre shelves for what readers are actually picking up.
Is it legal to scrape Goodreads?
Option 1: DIY in Python (and why it breaks)
Since there's no API, a DIY approach means parsing Goodreads' server-rendered book, author, and review pages directly:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.goodreads.com/book/show/2767052-the-hunger-games",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
# Rating, review count, and description live in a mix of embedded JSON
# and page markup that shifts across Goodreads' redesigns
It demos and then breaks:
- robots.txt actively blocks key paths. Goodreads' default-user-agent rules disallow
/search,/review/show,/api, and/work, among others — a naive crawler following normal navigation trips these quickly. - No stable markup, and no API to fall back on. Goodreads' page structure shifts with redesigns, and unlike most platforms in this series there's no official endpoint to switch to when scraping breaks.
- Amazon-scale anti-bot. Goodreads has been Amazon-owned since 2013 and sits behind Amazon-grade infrastructure — datacenter IPs and naive clients get rate-limited or blocked.
- Reviews and editions paginate separately. A book's full review list and its full edition list each live on their own paginated sub-pages, so one page load never gets you a complete record.
Option 2: No-code tools
Some no-code scraper marketplaces and browser extensions offer pre-built Goodreads templates for one-off exports — useful for a single reading list or a small batch of titles. They're a reasonable stopgap for a hobby project, but they're awkward to run on a schedule, don't expose a clean data contract, and carry the same ToS and anti-bot exposure as a DIY script since they're scraping the same pages underneath.
Option 3: A structured Goodreads API
For a repeatable, permission-scoped workflow, a Goodreads scraping API returns normalized JSON with no page parsing to maintain and no dead developer program to wait on. Search for a book to get its id:
curl "https://api.crawlora.net/api/v1/goodreads/search?q=hunger+games" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "hunger games",
"results": [
{
"id": "2767052",
"title": "The Hunger Games",
"author": "Suzanne Collins",
"author_id": "153394",
"average_rating": 4.35,
"ratings_count": 10177818,
"pages": 374,
"uri": "https://www.goodreads.com/book/show/2767052-the-hunger-games"
}
]
}
}
Then resolve the id and pull book detail, reviews, and author data in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/goodreads"
hits = requests.get(f"{base}/search", headers=h, params={"q": "hunger games"}).json()["data"]["results"]
book_id, author_id = hits[0]["id"], hits[0]["author_id"]
book = requests.get(f"{base}/book/{book_id}", headers=h).json()["data"]
reviews = requests.get(f"{base}/book/{book_id}/reviews", headers=h, params={"limit": 20}).json()["data"]
author = requests.get(f"{base}/author/{author_id}", headers=h).json()["data"]
Book detail is normalized JSON (real fields — check the docs):
{
"code": 200,
"msg": "OK",
"data": {
"id": "2767052",
"title": "The Hunger Games",
"series": "The Hunger Games #1",
"genres": ["Young Adult", "Dystopia", "Fiction"],
"pages": 374,
"publisher": "Scholastic Press",
"publication_date": "2008-10-14",
"isbn13": "9780439023481",
"rating": {
"average": 4.35,
"ratings_count": 10177796,
"reviews_count": 272857,
"distribution": { "one_star": 133619, "five_star": 5602217 }
}
}
}
Author profiles return bio, genres, and aggregate rating; author bibliographies, quotes, and Listopia lists each follow the same id-in, normalized-JSON-out shape:
{
"data": {
"id": "153394",
"name": "Suzanne Collins",
"birth_date": "August 11, 1962",
"genres": ["Fiction", "Science Fiction & Fantasy", "Young Adult"],
"average_rating": 4.3,
"ratings_count": 21497265
}
}
/goodreads/author/{id}/books pages through an author's full bibliography, /goodreads/book/{id}/editions returns every edition of a work (format, publisher, ISBN, publication date), /goodreads/genre/{name} returns a genre shelf's top books, and /goodreads/list/{id} returns a Listopia ranking. Store one row per book (or per review, per edition) and re-run on a schedule.
What you can collect
Public book, author, and list metadata: search results (id, title, author, rating, page count); book detail (description, series, genres, format, publisher, publication date, ISBN/ISBN13, rating average and distribution); book editions across formats; publicly visible book reviews (reviewer, rating, text, like/comment counts); author profiles (bio, birth date, genres, aggregate rating); an author's full book list; author quotes; genre/shelf book rankings; and Listopia list rankings. Public data only — no private shelves, reading progress, or account-level information.
Limitations and common challenges
- No API fallback exists. Unlike most platforms in this series, there's no official endpoint to switch to if a scraping approach breaks — Goodreads retired its developer program in 2020 and hasn't reopened it.
- robots.txt and ToS both restrict automated access. Scope any project to public book, rating, and review pages, avoid disallowed paths, and never bulk-republish full review text.
- Amazon-scale anti-bot. Expect rate-limiting and blocking on naive or datacenter-IP requests.
- Per-book fan-out. Full reviews and editions each paginate separately, so a complete book record means several calls, not one.
- Public data only. This collects what Goodreads already shows publicly — never a way around a login wall or private shelf data.
Where this gets used
- Reading app catalogs — attach canonical title, author, and rating data to a book discovery or tracking product.
- Recommendation engines — power "similar books" and genre-based discovery from ratings and shelving patterns.
- Publishing and reception research — track rating and review trends for a title around launch or adaptation news.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the search, book, and author endpoints in the Playground, check the schema in the API docs, and review pricing. Goodreads is the "creative work + public reviews" pattern for books — the same shape IMDb covers for film and TV, and Discogs covers for music. If you're tracking reception beyond books, how to scrape Trustpilot reviews covers the same rating/review pattern for businesses. The rest of the books-and-audio catalog is covered too — how to scrape Apple Books for ebooks and audiobooks, and how to scrape manga data for the same title metadata on the manga side. See also how to choose a web scraping API and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
How do I scrape Goodreads?
Send a search query or a Goodreads id to a structured Goodreads API and get book detail, ratings, reviews, author profiles, and list rankings as JSON — no login and no HTML parsing required.
Does Goodreads have a public API?
No. Amazon stopped issuing new Goodreads developer API keys on December 8, 2020, and has been retiring the program since — there is no current, legal path to an official Goodreads API at any price.
Is it legal to scrape Goodreads?
Goodreads' Terms of Use and robots.txt both restrict automated collection. Since there's no official API, scraping public book, rating, and review pages narrowly and respecting those restrictions is the only programmatic option; get written permission for large-scale commercial use.
Can I get Goodreads book ratings and reviews?
Yes — the book detail endpoint returns the average rating and full rating distribution, and the reviews endpoint returns publicly visible reviews with reviewer, rating, text, and like/comment counts.
Can I scrape an author's full bibliography from Goodreads?
Yes — the author books endpoint pages through every book credited to an author id, alongside their profile bio, genres, and aggregate rating.
What can't you get from Goodreads scraping?
Only public data is available — no private shelves, reading progress, or account-level information, and full review text should never be bulk-republished.
What's the difference between scraping Goodreads and IMDb or Discogs?
All three follow the same creative-work-plus-public-reviews pattern — IMDb for film/TV, Discogs for music, Goodreads for books — but Goodreads is unique in this series in having no official API fallback at all since 2020.