Goodreads Reviews Scraper Cheap
Pricing
from $1.99 / 1,000 results
Goodreads Reviews Scraper Cheap
Goodreads review scraper that collects book reviews, star ratings, and reviewer profiles without login or authentication, giving authors and researchers clean data for sentiment analysis and competitive research.
Pricing
from $1.99 / 1,000 results
Rating
0.0
(0)
Developer
Data API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Goodreads Reviews Scraper

Reader reviews on Goodreads hold a lot of signal, but the site gives you no easy way to pull them out. You can scroll a book page forever and still end up copy-pasting one review at a time into a spreadsheet. This scraper skips all of that. Paste a book link, say how many reviews you want, and get back a clean table: the review text, the star rating, who wrote it, how many likes it picked up, and which shelf they filed it under. Run it on one title or a whole stack of them, and export to JSON, CSV, or Excel.
What you get
One row per review, with a steady shape every time. Fields that a reviewer left blank come back as null rather than disappearing, so your columns line up when you load the data into a sheet or database. Each row carries three kinds of data:
- The review —
critiqueId,critiqueUrl,critiqueHtml,critiqueText,starRating,postedAt,editedAt,revisedAt,hasSpoiler,likesTotal,commentsTotal,recommendedAudience - The reader —
readerId,readerName,readerProfileUrl,readerAvatarUrl,readerIsAuthor,readerFollowers,readerReviewsWritten - Shelf and book —
shelfSlug,shelfLabel,shelfPageUrl,shelfTags,bookWorkId,collectedAt
Quick start
- Click Try for free and open the input form.
- Paste a Goodreads book link into Book page URL, or drop several into Book page URLs for a batch.
- Set Reviews per book to cap how many reviews each title returns.
- Choose a proxy if you want one, then press Start and export to JSON, CSV, Excel, or XML when the run wraps up.

Use cases
- Sentiment work — collect a few hundred reader reviews to train a classifier or run opinion mining on how people reacted to a book
- Author and competitor reading — see what readers actually wrote about your titles or the ones you're up against
- Recommendation engines — feed ratings, shelves, and tags into similarity scoring or recommendation logic
- Genre and market research — gauge how readers responded to recent releases in a category before you commit to one
- Academic datasets — assemble reader-review corpora for literary or sociological study
- Acquisition calls — read feedback on comparable books before greenlighting something similar
Input
| Field | Type | Required | Description |
|---|---|---|---|
titleUrl | string | No | A single Goodreads book page link. Best for one title at a time. Example https://www.goodreads.com/book/show/2767052-the-hunger-games. |
titleUrls | array of strings | No | A list of Goodreads book page links, one per row, for batch runs. |
reviewsLimit | integer | No | Reviews to collect per book. Hard ceiling of 1000. Default 50. |
runTimeoutSeconds | integer | No | Cap on the whole run, in seconds. Default 420. |
requestTimeoutSeconds | integer | No | Cap on each API call, in seconds. Default 45. |
proxyConfiguration | object | No | Proxies used for requests. Datacenter is the default; switch to Residential if Goodreads starts blocking. |
You can fill titleUrl, titleUrls, or both. Repeated links are dropped.
Example input
{"titleUrls": ["https://www.goodreads.com/book/show/2767052-the-hunger-games","https://www.goodreads.com/book/show/4671.The_Great_Gatsby"],"reviewsLimit": 50,"runTimeoutSeconds": 420,"requestTimeoutSeconds": 45,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["DATACENTER"]}}
Output
Every review becomes one row, and each field is always present — values a reviewer never filled in come back as null, so the dataset stays rectangular.
Example output
{"critiqueId": "kca://review:goodreads/amzn1.gr.review:goodreads.v1.tI_H8-8bJGQv1O4IIOpeTA","critiqueUrl": "https://www.goodreads.com/review/show/2280609898","critiqueHtml": "<b>4.5 Stars!</b><br /><br />Buddy read with the gang and it held up...","critiqueText": "4.5 Stars! Buddy read with the gang and it held up...","starRating": 5,"postedAt": "2018-02-01T20:15:18+00:00","editedAt": "2021-02-19T16:45:57+00:00","revisedAt": "2018-03-20T18:24:36+00:00","hasSpoiler": false,"likesTotal": 114,"commentsTotal": 17,"recommendedAudience": null,"readerId": 44125660,"readerName": "Beth","readerProfileUrl": "https://www.goodreads.com/user/show/44125660-beth","readerAvatarUrl": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/sample.jpg","readerIsAuthor": false,"readerFollowers": 627,"readerReviewsWritten": 929,"shelfSlug": "read","shelfLabel": "Read","shelfPageUrl": "https://www.goodreads.com/review/list/44125660?shelf=read","shelfTags": ["2018-reads", "audiobook", "book-series", "five-stars", "young-adult-fantasy"],"bookWorkId": "kca://work/amzn1.gr.work.v1.TbpxJa2CwiSSz_9W2FruoA","collectedAt": "2026-06-29T10:30:00+00:00"}
Output fields
| Field | Type | Description |
|---|---|---|
critiqueId | string | Goodreads' identifier for the review |
critiqueUrl | string | Direct link to the review |
critiqueHtml | string | Review body as raw HTML |
critiqueText | string | Review body as plain text, tags removed |
starRating | integer | Stars given, 1 to 5, or null if none |
postedAt | string | When the review first went up |
editedAt | string | When the review was last changed |
revisedAt | string | When the review text was last edited |
hasSpoiler | boolean | Whether the review is flagged as a spoiler |
likesTotal | integer | Number of likes |
commentsTotal | integer | Number of comments |
recommendedAudience | string | Who the reader recommends the book for, when noted |
readerId | integer | Reviewer's numeric Goodreads ID |
readerName | string | Reviewer's display name |
readerProfileUrl | string | Link to the reviewer's profile |
readerAvatarUrl | string | Link to the reviewer's profile photo |
readerIsAuthor | boolean | Whether the reviewer is a published author |
readerFollowers | integer | How many followers the reviewer has |
readerReviewsWritten | integer | Total reviews the reviewer has written |
shelfSlug | string | Shelf machine name (for example read, currently-reading) |
shelfLabel | string | Reader-facing shelf name (for example Read) |
shelfPageUrl | string | Link to the reviewer's shelf |
shelfTags | array | Custom shelf tags the reviewer added |
bookWorkId | string | Internal Goodreads work ID for the book |
collectedAt | string | When the actor captured this review |
Tips for best results
- Try a small run first. Scrape 10 reviews from one book before you point it at a long list — most URL or format snags show up in the first batch.
- Switch to Residential if you get blocked. Datacenter clears most books; reach for residential when you see repeated 403s or rate limits.
- Mind the 1000-per-book ceiling.
reviewsLimittops out at 1000 for each title, so split very popular books across separate runs if you need more. - Raise
requestTimeoutSecondsto ~60 when you run on residential proxies or hit slow responses. - Batch with
titleUrls. Stack several links and the actor reads them in order into one dataset, so a multi-book pull is a single run.
How can I use Goodreads reviews data?
How can I use the Goodreads Reviews Scraper to run sentiment analysis on a book?
Paste the book's link, set reviewsLimit to a few hundred, and run it. You get critiqueText for clean review bodies plus starRating for a labelled signal — enough to train a sentiment model or chart how reader reactions skew positive or negative for that title.
How can I export Goodreads reviews to CSV or Excel? Run the scraper on one or more book links, then use the export button when it finishes. Every review lands as a row with the same columns — review text, rating, reader, likes, shelf — so the JSON, CSV, or Excel file drops straight into a spreadsheet or BI tool.
How can I pull reviews for several books at once for genre research?
Drop a batch of book links into titleUrls and the actor walks them in order, writing all reviews into one dataset tagged with bookWorkId. Group by that field to compare how readers responded across a genre or a set of comparable titles.
How can I collect Goodreads reviewer profiles alongside the reviews?
Each row already carries reader fields — readerName, readerProfileUrl, readerFollowers, readerReviewsWritten, and readerIsAuthor — so you can see who is reviewing, weight opinions by reach, or build a list of active reviewers in a niche without a second scrape.
Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Support
Questions, feature requests, or a field you'd like added? Reach out at data.apify@proton.me and we'll get back to you.
