Goodreads Scraper — Books, Authors & Reviews
Pricing
$10.00 / 1,000 result scrapeds
Goodreads Scraper — Books, Authors & Reviews
Scrape Goodreads books, reviews, and reading lists without authentication. Extract titles, authors, ratings, review counts, genres, ISBNs, and synopsis. Search by keyword, author, or genre. Monitor book trends. Export to JSON/CSV.
Pricing
$10.00 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
CryptoSignals Agent
Actor stats
0
Bookmarked
3
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Goodreads Scraper
Scrape book data from Goodreads — the world's largest book recommendation site with 125M+ members and 3.5B+ shelved books. Search books, get full details (ratings, reviews, genres, ISBN, page count), and browse complete author catalogs.
No API key needed. Goodreads shut down their public API in December 2020. This actor scrapes publicly available pages, making it the only reliable way to programmatically access Goodreads data.
What Data You Get
| Action | Data Returned |
|---|---|
| Search | Book ID, title, author, average rating, ratings count, URL, cover image |
| Book Details | Full metadata: descriptions, all ratings (1-5 star breakdown), reviews count, page count, format, publisher, publish date, language, ISBN/ISBN13/ASIN, genres, series info, awards, cover URL |
| Author Catalog | Author name, bio, image, book count, and their full book list with ratings |
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
action | String | Yes | "search" | What to scrape: search, book, or author |
query | String | For search | "Harry Potter" | Search term — title, author, keyword, or ISBN |
url | String | For book/author | — | Goodreads URL or just the numeric ID |
maxItems | Integer | No | 20 | Max results to return (1–200) |
Input Examples
Search for books
{"action": "search","query": "project hail mary","maxItems": 10}
Get full book details
{"action": "book","url": "https://www.goodreads.com/book/show/44767458-dune"}
You can also pass just the book ID:
{"action": "book","url": "44767458"}
Get author's books
{"action": "author","url": "https://www.goodreads.com/author/show/58.Frank_Herbert","maxItems": 50}
Output Examples
Search Result
{"bookId": 44767458,"title": "Dune (Dune, #1)","author": "Frank Herbert","avgRating": 4.29,"ratingsCount": 1646394,"url": "https://www.goodreads.com/book/show/44767458-dune","coverUrl": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1555447414i/44767458.jpg"}
Book Detail
{"bookId": 44767458,"title": "Dune","titleComplete": "Dune (Dune, #1)","authors": ["Frank Herbert"],"description": "Set on the desert planet Arrakis, Dune is the story of the boy Paul Atreides...","avgRating": 4.29,"ratingsCount": 1646396,"ratingsDistribution": [25620, 54369, 199561, 504821, 862025],"reviewsCount": 84029,"numPages": 658,"format": "Hardcover","publisher": "Ace","publishDate": "2019-10-01","language": "English","isbn": "059309932X","isbn13": "9780593099322","asin": "059309932X","genres": ["Science Fiction", "Fiction", "Fantasy", "Classics"],"series": [{"title": "Dune", "position": "1"}],"awards": ["Hugo Award for Best Novel (1966)", "Nebula Award for Best Novel (1966)"],"coverUrl": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1555447414i/44767458.jpg","url": "https://www.goodreads.com/book/show/44767458-dune"}
Author Catalog
{"authorName": "Frank Herbert","bio": "Frank Patrick Herbert was an American science fiction author...","imageUrl": "https://images.gr-assets.com/authors/1429735/.jpg","booksCount": 68,"books": [{"bookId": 44767458,"title": "Dune (Dune, #1)","avgRating": 4.29,"ratingsCount": 1646394,"url": "https://www.goodreads.com/book/show/44767458-dune","coverUrl": "https://i.gr-assets.com/images/S/..."}]}
Use with Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")# Search for booksrun = client.actor("cryptosignals/goodreads-scraper").call(run_input={"action": "search","query": "atomic habits","maxItems": 10,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item['title']} by {item['author']} — {item['avgRating']}⭐")
# Get full book detailsrun = client.actor("cryptosignals/goodreads-scraper").call(run_input={"action": "book","url": "44767458",})for book in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{book['title']} — {book['numPages']} pages, {book['ratingsCount']} ratings")print(f"Genres: {', '.join(book.get('genres', []))}")
Handling Bot Detection
Goodreads may throttle or block requests from datacenter IPs, especially at higher volumes. If you see empty results or CAPTCHA pages:
- Use residential proxies — datacenter IPs get flagged quickly on Goodreads
- Lower
maxItems— smaller batches are less likely to trigger rate limits - Space out runs — avoid running the same search repeatedly in quick succession
For reliable residential proxies, I recommend ThorData — rotating residential IPs with good geographic coverage that work well for book data scraping.
Limitations
- Goodreads' page structure may change without notice — the actor is updated regularly to handle this
- Search returns up to 200 results per query (Goodreads pagination limit)
- Very new books may not yet have full metadata populated
- Rate limiting may occur on high-volume runs without residential proxies
Support
Found a bug or have a feature request? Open an issue on the actor's page or reach out through Apify's messaging system.