Goodreads Book Scraper avatar

Goodreads Book Scraper

Pricing

from $1.99 / 1,000 results

Go to Apify Store
Goodreads Book Scraper

Goodreads Book Scraper

Goodreads Book Scraper searches books by keyword and returns title, author, cover image, average rating, publish year, edition count and URL. ๐Ÿ“– Great for building book catalogues, reading-list apps and publishing market research.

Pricing

from $1.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Hub

Scrapers Hub

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

๐Ÿ“š Goodreads Book Scraper โ€“ Extract Book Titles, Authors, Ratings & Editions

The Goodreads Book Scraper extracts structured book data from Goodreads search results, turning any list of keywords into a clean dataset of titles, authors, cover images, average ratings, review counts, publication years and edition counts. Give it a search term โ€” an author name, a series, a genre, a subject โ€” and it walks the Goodreads search listings and returns one row per book.

Goodreads holds one of the largest publicly visible catalogues of reader-generated book metadata anywhere: aggregate star ratings, rating volumes, cover artwork and edition histories for millions of titles. That combination makes it a natural reference set for publishing analysts, bookselling teams, library and collection developers, literary researchers and anyone building a book recommendation or discovery product. This Goodreads book scraper gives you that catalogue as machine-readable rows instead of paginated HTML.

The Actor is keyword-driven rather than URL-driven. You supply an array of search terms in keywords and a per-keyword cap in maxItems, and every result row carries the keyword that produced it โ€” so a single run can cover dozens of topics while remaining perfectly attributable when you split the dataset afterwards.


๐Ÿ“Š What Data Can You Extract with This Goodreads Book Scraper?

Each dataset item represents one book from the Goodreads search listings, grouped here into the categories most teams work with.

CategoryFieldsWhat it gives you
Book identitytitle, urlThe book's listing title as shown on Goodreads and its canonical Goodreads URL for deduplication or linking.
AuthorshipauthorAn object describing the book's author, including the author name and their Goodreads profile URL.
Reader receptionratingAn object holding the aggregate score and the number of ratings behind it โ€” average and count.
Publication datapublishYear, editionsThe publication year attached to the listing and how many editions Goodreads records for the work.
Visual assetscoverThe Goodreads-hosted cover thumbnail URL for the title.
Run attributionkeywordThe search term that produced this row, so multi-keyword runs stay traceable.

The rating object is the field that carries the most analytical weight. A 4.49 average is meaningless on its own โ€” a 4.49 across 3,467 ratings is a very different signal from a 4.49 across nine. Because average and count arrive together, you can apply a minimum-volume threshold and rank titles by weighted score rather than raw stars, which is how any credible bestseller or backlist analysis has to work.


๐ŸŒŸ Key Features of the Goodreads Book Scraper

FeatureDescription
๐Ÿ”Ž Multi-keyword searchPass an array of search terms and the Actor runs each one in sequence, tagging every row with its source keyword.
๐Ÿ“ˆ Rating and volume togetherThe rating object returns both average and count, so you can weight scores by how many readers actually voted.
โœ๏ธ Structured author dataauthor is returned as an object containing the author's name and their Goodreads profile URL, not just a flat string.
๐Ÿ–ผ๏ธ Cover image URLsEvery row includes a cover link to the Goodreads-hosted thumbnail, ready to embed in catalogues or dashboards.
๐Ÿ“… Publication metadatapublishYear and editions support backlist analysis, reissue tracking and edition-history research.
๐ŸŽฏ Per-keyword result capsmaxItems limits how many books are collected for each keyword, keeping runs predictable and bounded.
๐Ÿ”— Canonical URLsThe url field gives a stable Goodreads link per title for deduplication, enrichment or manual verification.
๐Ÿšฆ Automatic proxy rotationRequests are routed through rotating proxies internally, so retrieval stays reliable without any proxy setup on your side.
โšก Lightweight HTML parsingThe scraper parses listing HTML directly rather than driving a browser, which keeps runs fast and resource-light.

๐Ÿš€ Why Choose This Goodreads Book Scraper?

Keyword-first workflow that matches how research actually starts. Most book research begins with a subject, an author or a series name โ€” not a list of URLs. Feeding keywords directly means you can go from "track everything in this genre" to a dataset in one step, with keyword preserved on every row so a fifty-term run splits cleanly afterwards.

Rating data that supports real ranking. Returning average and count as a single rating object is what makes the output usable for analysis rather than decoration. Weighted scoring, minimum-volume filters and confidence-adjusted rankings all need both numbers, and both arrive on every row.

Structured author objects, not flattened strings. Because author includes a Goodreads profile URL alongside the name, you can group a dataset by author reliably even when names collide, and follow the link when you need to enrich a record further.

Bounded, predictable runs. maxItems caps collection per keyword rather than globally, so adding a keyword adds a known amount of work. That predictability matters when the Goodreads book scraper runs on a schedule and feeds a downstream pipeline.


๐Ÿ“ฅ Input

{
"keywords": ["shaker", "cyberpunk", "Ursula K. Le Guin"],
"maxItems": 30
}

๐Ÿ”ง Goodreads Book Scraper Input Fields

FieldTypeRequiredDefaultDescription
keywordsarray of stringsโœ… Yesโ€” (prefilled with ["shaker"])List of search keywords to look up on Goodreads. Each keyword is searched separately.
maxItemsintegerNo30Maximum number of books to scrape per keyword.

๐Ÿ’ก Input Examples

Single subject search

{
"keywords": ["climate fiction"],
"maxItems": 50
}

Author and series tracking

{
"keywords": ["Ursula K. Le Guin", "Earthsea", "Hainish Cycle"],
"maxItems": 40
}

Broad genre sweep with a small cap per term

{
"keywords": ["cozy mystery", "space opera", "historical romance", "hard science fiction"],
"maxItems": 15
}

๐Ÿ“ค Output

{
"keyword": "shaker",
"title": "Shaker (Blackwings MC, #5)Teagan Brooks",
"url": "https://www.goodreads.com/book/show/43999679-shaker",
"author": {
"name": "Teagan Brooks",
"url": "https://www.goodreads.com/author/show/1801..."
},
"cover": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1550046473i/43999679._SY75_.jpg",
"rating": {
"average": 4.49,
"count": 3467
},
"publishYear": 2019,
"editions": 5
}

๐Ÿงพ Goodreads Book Output Fields

FieldTypeDescription
keywordstring | nullThe search keyword that produced this item.
titlestring | nullTitle of the book as rendered in the Goodreads search listing.
urlstring | nullCanonical Goodreads URL for the book.
authorobject | nullAuthor details, including the author name and Goodreads author profile URL.
coverstring | nullURL of the book's cover image thumbnail.
ratingobject | nullAggregate rating object containing average (score) and count (number of ratings).
publishYearinteger | nullYear of publication associated with the listing.
editionsinteger | nullNumber of editions Goodreads records for the work.

Note that the title string is taken from the search listing markup and can include the series designation and, in some listings, the author name appended directly after the title โ€” as in the sample above. Normalising titles with a short regex or splitting on the author name from the author object is a sensible post-processing step before matching against another catalogue.


๐Ÿ’ป How to Use the Goodreads Book Scraper (Step by Step)

Step 1: Choose Your Search Keywords

Everything begins with the keywords array. Goodreads search is broad, so the specificity of your terms determines the shape of your dataset. An author name pulls that author's catalogue plus adjacent titles; a series name pulls the entries in that series; a genre or theme pulls a wide, loosely ordered mix. If you are building a comparison set, use several tightly scoped keywords rather than one broad one โ€” the per-row keyword field then acts as a ready-made category label.

Step 2: Set a Sensible Per-Keyword Cap

maxItems controls how many books are collected for each keyword and defaults to 30. Because the cap is per keyword rather than per run, total output scales with the number of terms you supply โ€” ten keywords at 40 items each is a 400-row dataset. Start small when exploring a new subject area, confirm the results match what you expected, then raise the cap for the production run.

Step 3: Launch the Run

Start the Goodreads book scraper from the Apify Console or through the API. The Actor works through the keyword list in order, requesting search pages and parsing listing markup as it goes. No browser configuration or proxy setup is required โ€” request routing is handled internally.

Step 4: Monitor Progress in the Log

The run log shows which keyword is being processed and how items are accumulating. If a keyword produces far fewer rows than your maxItems cap, that usually means Goodreads simply has fewer matching results for that term, not that anything failed. Very generic single-word keywords sometimes return results that drift away from your intent, which the log makes visible early.

Step 5: Inspect the Dataset

When the run completes, open the dataset and review a handful of rows. Check that title values look right, that rating.count is populated for the titles you care about, and that publishYear is present. Rows for very obscure or newly listed books may have null in some fields โ€” Goodreads listings are not uniformly complete, and the scraper reports what the listing actually contains rather than guessing.

Step 6: Clean and Enrich the Data

Two clean-up steps pay for themselves immediately. First, normalise title by stripping the trailing author name and the parenthetical series suffix where present. Second, deduplicate on url, since a book matching two of your keywords will legitimately appear twice with different keyword values. From there, enrichment against ISBN databases or your own catalogue is straightforward using title and author together.

Step 7: Export or Automate

Export the dataset as JSON, CSV or Excel, or pull it through the API into your own system. To track a subject over time, schedule the run on a weekly or monthly cadence and compare rating.count across snapshots โ€” growth in rating volume is one of the clearest available proxies for a title gaining traction.


๐Ÿ”Œ API Access & Integrations

Trigger the Goodreads book scraper and receive the dataset in a single synchronous call:

curl -X POST "https://api.apify.com/v2/acts/scrapers-hub~goodreads-book-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keywords": ["cyberpunk", "solarpunk"],
"maxItems": 25
}'

The equivalent using the official Python client:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run_input = {
"keywords": ["Ursula K. Le Guin", "Earthsea"],
"maxItems": 40,
}
run = client.actor("scrapers-hub/goodreads-book-scraper").call(run_input=run_input)
for book in client.dataset(run["defaultDatasetId"]).iterate_items():
rating = book.get("rating") or {}
print(book["title"], rating.get("average"), rating.get("count"), book["publishYear"])

The dataset can also be routed into Zapier, Make, Google Sheets or Slack, or delivered to your own service through Apify webhooks the moment a run finishes.


๐Ÿ’ก Best Use Cases for Goodreads Book Data

๐Ÿ“– Publishing and Backlist Analysis

Combining publishYear with rating.count shows which older titles are still accumulating readers and which have gone quiet. Publishers use exactly this shape of data to decide reissue candidates, and the editions count adds a second signal โ€” a work with many editions has typically had sustained commercial life.

๐Ÿ›’ Bookselling and Catalogue Curation

Retailers and independent bookshops can pull a genre's top titles by keyword, rank them using rating.average filtered by a minimum rating.count, and use cover plus url to build a shelf-talker list or an online curated collection with artwork already attached.

๐ŸŽฏ Competitive Title Research for Authors

Authors and agents researching a comp-title list can search their subgenre, then sort by rating.count to find the titles readers actually engage with. The author object's profile URL makes it easy to follow up on prolific names in the same space.

๐Ÿค– Building Book Recommendation Datasets

Recommendation engines need a seed corpus with identity, popularity and metadata. title, author, publishYear, rating and url cover the essentials, and running many keywords in one job builds a genre-labelled corpus where the keyword field doubles as a weak category label.

๐Ÿ“š Library Collection Development

Acquisition librarians evaluating a subject area can scan rating.average and rating.count across a keyword sweep to gauge reader demand, then check editions and publishYear to judge availability and edition stability before ordering.

๐Ÿ“Š Literary and Cultural Research

Researchers studying genre trends, reception patterns or publication cycles can build longitudinal datasets by running the same keyword set on a schedule. Tracking how rating.count and rating.average move over months gives a quantitative view of reception that is otherwise hard to obtain.

๐Ÿ–ผ๏ธ Cover and Metadata Enrichment

If you already hold a book list without artwork or publication years, a keyword run using titles or author names returns cover, publishYear and url, filling the gaps in an existing catalogue without manual lookup.


โš™๏ธ Tips for Better Goodreads Scraping Results

  • Use specific keywords. "Le Guin Earthsea" returns a tighter, more relevant set than "fantasy". Broad single-word terms drift quickly on Goodreads search.
  • Keep maxItems proportionate. Search relevance drops the deeper you go into results. For most keywords, the first 20โ€“40 items carry the signal; beyond that you collect noise.
  • Deduplicate on url. Overlapping keywords will surface the same book more than once, which is expected. The canonical URL is the reliable join key, not the title.
  • Normalise title before matching. Listing titles can carry series suffixes and a trailing author name, so strip those before comparing against ISBN data or an internal catalogue.
  • Filter by rating.count before ranking. Apply a minimum rating volume โ€” a few hundred is a reasonable floor for mainstream genres โ€” so tiny-sample averages do not dominate your top results.
  • Run on a schedule for trend work. A single snapshot tells you position; repeated snapshots tell you direction. Rating volume growth is the most informative delta to track.

๐Ÿ› ๏ธ Troubleshooting

Why did a keyword return fewer books than my maxItems setting? maxItems is an upper bound, not a target. If Goodreads search has fewer matching listings for that term, the Actor returns everything it found. Broaden the keyword or check its spelling if the count looks unexpectedly low.

Why does the title field include the author name? The title is taken from the Goodreads search listing markup, where the author name can be rendered adjacent to the title without a separator. Use the name value inside the author object to strip it during post-processing.

Why are publishYear or editions null on some rows? Not every Goodreads listing exposes those values, particularly for very new, self-published or sparsely catalogued titles. The scraper reports what the listing contains rather than inferring missing values.

Why do the same books appear multiple times? Each keyword is searched independently, so a title matching two of your terms produces two rows with different keyword values. Deduplicate on url if you need a unique title list.

Why did a run return no results at all? Check that keywords is a non-empty array of strings. If the input is valid and the run still returns nothing, Goodreads may have been temporarily unresponsive โ€” rerun the job, since proxy rotation and retries are handled automatically.


โ“ Frequently Asked Questions About Goodreads Book Scraping

What is the Goodreads Book Scraper? It is an Apify Actor that searches Goodreads by keyword and returns structured book data โ€” title, author, cover, rating, publication year, edition count and canonical URL โ€” as dataset rows.

Do I need a Goodreads account or API key? No. The scraper reads publicly visible Goodreads search listings. No login credentials or Goodreads API keys are required.

Can I scrape by book URL instead of keyword? The input schema is keyword-based: keywords and maxItems are the only fields. To target a specific book, search for its exact title, optionally combined with the author name.

How many books can I collect in one run? maxItems caps results per keyword and defaults to 30. Total output is roughly the number of keywords multiplied by that cap, subject to how many results Goodreads actually returns.

What exactly is in the rating field? It is an object with average โ€” the aggregate star score โ€” and count, the number of ratings that produced it. Both are needed for any credible ranking.

What is inside the author object? The author's name and their Goodreads author profile URL, which lets you group by author reliably and follow up for further detail.

Does the scraper return full book descriptions or reviews? No. The output fields are limited to the listing-level data documented above: keyword, title, url, author, cover, rating, publishYear and editions.

Can I get ISBNs from this Goodreads book scraper? ISBN is not among the output fields. Use title and the author name to match against an ISBN database if you need that identifier.

Does it handle proxies? Yes. Requests are routed through rotating proxies automatically. Proxy configuration is not exposed as an input field, so there is nothing to set up.

Can I schedule recurring runs? Yes. Apify's scheduler supports any cron expression, which makes it straightforward to snapshot the same keyword set weekly or monthly for trend analysis.

What export formats are available? Datasets export as JSON, JSONL, CSV, Excel, XML or HTML from the Apify Console, and can be read directly through the API.

Is scraping Goodreads legal? This Actor accesses publicly available listing pages. How you use the resulting data is your responsibility, including compliance with Goodreads' terms of service and any copyright applying to titles, descriptions and cover artwork.

Why is the cover image a small thumbnail? The cover URL is the image Goodreads serves in its search listings, which is a compressed thumbnail. That is what the listing markup exposes.

Can I filter results by rating or publication year in the input? Not at input time โ€” the schema offers only keywords and maxItems. Filter on rating.average, rating.count or publishYear after export; the fields are all present in the dataset.

How do I track whether a book is gaining popularity? Run the same keywords on a schedule and compare rating.count between snapshots. Growth in rating volume is the clearest signal of a title picking up readers.


๐Ÿ†˜ Support & Feedback

If you hit a bug, an unexpected empty result, or a parsing issue, open a ticket in the Issues tab of this Actor on Apify. Reports filed there are tracked and answered directly, and they are the fastest route to a fix.

Need something custom โ€” additional Goodreads fields, a different input mode, or a pipeline that feeds this data straight into your own systems? Write to scraperhubapi@gmail.com with a description of the outcome you need.

If the Goodreads Book Scraper is useful to you, a review on its Apify page is genuinely appreciated. Ratings and written feedback directly influence which improvements are prioritised.


โš–๏ธ Disclaimer

This Goodreads book scraper collects only publicly accessible information from Goodreads search listings. It does not log in, does not access private shelves, reading activity or account settings, and does not attempt to circumvent authentication or access controls.

You are responsible for how you use the extracted data. Book titles, cover artwork, descriptions and author information may be protected by copyright or other rights held by publishers, authors and Goodreads itself, and redistributing that material can carry obligations that this Actor does not resolve for you. Review Goodreads' terms of service before deploying the scraper at scale or in a commercial product.

Where the data you collect includes personal information โ€” author names and profile URLs, for example โ€” you act as the data controller under the GDPR, the UK GDPR, the CCPA and other applicable privacy laws. That includes having a lawful basis for processing, honouring data-subject requests, and applying sensible retention limits.

To ask a question about data handling, or to request removal of data associated with your runs, contact scraperhubapi@gmail.com.