Goodreads Scraper — search & extract book data
Pricing
Pay per usage
Goodreads Scraper — search & extract book data
Scrape Goodreads — the world's largest book platform. Search books, extract ratings, authors, genres, ISBN, publication details, series info, and more. Output as JSON, CSV, or Excel.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Steven Bennett
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Goodreads Scraper
Extract book data from Goodreads — the world's largest book recommendation platform with 150M+ members, 3.5B+ books cataloged, and 90M+ reviews.
No existing Goodreads scraper on Apify Store. First-mover advantage in this valuable niche.

Why Goodreads?
Goodreads is the definitive source for book metadata — ratings, reviews, genres, author info, series data, and more. Publishers, authors, marketers, librarians, and AI/ML teams all need this data:
- Publishers — track ratings and reviews for competitive titles
- Authors — monitor your book's performance and discoverability
- Market researchers — analyze genre trends, rating distributions, publication patterns
- AI/ML teams — build training datasets for recommendation systems, NLP models, book classifiers
- Librarians — enrich catalog metadata with crowdsourced ratings and genres
Features
- 🔍 Search anything — books by title, author, or keyword
- 📚 Rich book data — title, author, rating, ratings count, reviews count, ISBN, ISBN-13, pages, publisher, publication year, format
- 🏷️ Genres & shelves — extract all genre tags/categories for each book
- 🏆 Awards — see which awards each book has won
- 📖 Full descriptions — get the complete book description text
- 🔗 Series data — identify series and series position
- 📊 Rating analytics — average rating and total rating counts
- 🔄 Smart sorting — by relevance, highest rated, or newest first
- 📄 Automatic pagination — paginates through all search results up to your max
- 🛡️ Anti-bot resistant — headless browser with stealth techniques
- 💰 Pay-per-event pricing — you only pay for what you use
- 🔌 API-first — call via REST API, Apify SDK, Python, or Zapier
Pricing
| Event | Price |
|---|---|
| Run start | $0.50 per run |
| Per book scraped | $0.001 per book |
A typical search for "science fiction" (1,000 results) would cost ~$1.50. A small search (50 books) costs ~$0.55.
Quick Start
Via Apify Console
- Go to Goodreads Scraper in Apify Console
- Click Run and fill in the fields:
search— what to look for (e.g. "Dune", "Stephen King", "fantasy")maxItems— how many books to scrape (default: 50, max: 1000)sort— sort order: relevance (default), highest rated, or newest first
- Wait for the run to complete
- Download results as JSON, CSV, or Excel
Via API
curl -X POST "https://api.apify.com/v2/acts/~goodreads-scraper/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"search": "The Name of the Wind","maxItems": 50,"sort": "relevance"}'
Via Apify SDK (Node.js)
import { Actor } from 'apify';const run = await Actor.call('~goodreads-scraper', {search: 'The Name of the Wind',maxItems: 50,sort: 'rating',});const { items } = await Actor.openDataset(run.defaultDatasetId);console.log(items);
Via Python
import requestsresponse = requests.post('https://api.apify.com/v2/acts/~goodreads-scraper/runs',params={'token': 'YOUR_API_TOKEN'},json={'search': 'The Name of the Wind','maxItems': 50,'sort': 'relevance'})run = response.json()print(f'Run ID: {run["data"]["id"]}')
Via Webhook/Zapier
Configure a webhook in Apify Console to send data directly to Zapier, Make (formerly Integromat), Slack, Google Sheets, or any HTTP endpoint.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
search | string | required | Search keyword, title, or author name |
maxItems | number | 50 | Max books to scrape (1–1000) |
sort | string | relevance | Sort order: relevance, rating, date |
proxyConfiguration | object | Apify proxy | Proxy configuration (recommended for large runs) |
Output Schema
Each scraped book returns the following fields:
| # | Field | Type | Description |
|---|---|---|---|
| 1 | id | number | Goodreads book ID |
| 2 | title | string | null | Book title |
| 3 | author | string | null | Author name |
| 4 | authorUrl | string | null | Author profile URL |
| 5 | rating | number | null | Average rating (0–5) |
| 6 | ratingsCount | number | null | Number of ratings |
| 7 | reviewsCount | number | null | Number of text reviews |
| 8 | isbn | string | null | ISBN-10 identifier |
| 9 | isbn13 | string | null | ISBN-13 identifier |
| 10 | pages | number | null | Number of pages |
| 11 | publicationYear | number | null | Year of publication |
| 12 | publisher | string | null | Publisher name |
| 13 | description | string | null | Full book description |
| 14 | genres | string[] | Genre/category tags (up to 30) |
| 15 | awards | string[] | Awards the book has won |
| 16 | imageUrl | string | null | Book cover image URL |
| 17 | format | string | null | Book format (Paperback, Hardcover) |
| 18 | series | string | null | Series name (if part of a series) |
| 19 | url | string | Goodreads book page URL |
| 20 | price | number | null | Price (if available) |
| 21 | scrapedAt | string | ISO 8601 timestamp of scrape |
Sample Output
{"id": 186074,"title": "The Name of the Wind","author": "Patrick Rothfuss","authorUrl": "https://www.goodreads.com/author/show/108713.Patrick_Rothfuss","rating": 4.53,"ratingsCount": 1051940,"reviewsCount": 76291,"isbn": "0575081406","isbn13": "9780575081406","pages": 662,"publicationYear": 2007,"publisher": "Gollancz","description": "Told in Kvothe's own voice, this is the tale of the magically gifted young man...","genres": ["Fantasy", "Fiction", "High Fantasy", "Epic Fantasy", "Magic", "Adventure"],"awards": ["Quill Award for Science Fiction/Fantasy/Horror (2007)", "David Gemmell Legend Award (2008)"],"imageUrl": "https://images.gr-assets.com/books/1472067508m/186074.jpg","format": "Paperback","series": "The Kingkiller Chronicle (1)","url": "https://www.goodreads.com/book/show/186074","price": null,"scrapedAt": "2026-07-04T12:00:00.000Z"}
Use Cases
📊 Publishing & Market Research
Analyze ratings, review sentiment, and genre trends across thousands of books. Identify emerging genres, track author popularity over time, and benchmark competitor titles.
🤖 AI/ML Training Data
Build high-quality datasets for book recommendation systems, NLP models, sentiment analysis, text classification, and genre prediction. Goodreads data is ideal for:
- Matrix factorization — user-item rating matrices
- Content-based filtering — book metadata & genre features
- NLP training — authentic review text corpora
- Book embeddings — genre-tagged, rated collections
📝 Author & Self-Publishing
Monitor your book's performance, track ratings and reviews, compare against similar titles, and identify keywords for better discoverability.
🏫 Academic Research
Bibliometric studies, network analysis of reading patterns, genre evolution tracking, literary analysis at scale.
📚 Library Science
Enrich library catalog metadata with crowdsourced ratings, shelf/genre tags, series information, and cover images.
Rate Limits & Anti-Bot
Goodreads is a content platform and generally doesn't aggressively block scrapers. However, for reliability at scale, this Actor includes:
- ✅ Headless Playwright browser (full JS rendering)
- ✅ Apify proxy support for IP rotation
- ✅ Request retry logic with exponential backoff
- ✅ Browser stealth techniques (spoofed webdriver, plugins, languages)
- ✅ Polite delays between requests (human-like timing)
Technical Details
Architecture
The scraper uses a two-phase approach:
- Search phase — Crawls Goodreads search results pages, extracting basic info (title, author, rating, ratings count) and collecting book IDs
- Detail phase — Visits each book's detail page, extracting rich metadata from both JSON-LD structured data and DOM parsing for comprehensive coverage
RSC Payload Support
Goodreads has been migrating pages to Next.js App Router. The scraper checks for React Server Components (RSC) streaming payloads (self.__next_f.push) first — if found, it extracts structured data directly without DOM parsing. This is:
- Faster (no DOM parsing overhead)
- More resilient (resists layout changes)
- More accurate (same data the app renders)
If RSC data isn't available (e.g. legacy pages), it falls back automatically to HTML/Cheerio parsing with JSON-LD extraction.
Stack
Crawlee (PlaywrightCrawler) · Node.js 20 · Cheerio for HTML fallback · Apify SDK · JSON-LD extraction · RSC payload parsing
Changelog
v1.0 — 2026-07-04
- Initial release
- Book search with full pagination
- Full detail extraction (RSC → JSON-LD → DOM)
- Genre/category extraction
- Award tracking
- Series information
- Three sort options (relevance, rating, date)
- Proxy support with Apify proxy
Built with 🛠️ by Meester Bot · Not affiliated with Goodreads or Amazon
