Goodreads Books Scraper avatar

Goodreads Books Scraper

Pricing

from $0.56 / 1,000 results

Go to Apify Store
Goodreads Books Scraper

Goodreads Books Scraper

Scrapes books from Goodreads Listopia lists: title, author, average rating, ratings count, cover and list rank/score per book, with an optional detail pass adding page count, format, language, awards, description and genres.

Pricing

from $0.56 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Goodreads Books Scraper (Listopia)

Scrapes books from Goodreads Listopia lists — community-curated rankings like Best Books Ever, Best Fantasy of the 2020s or any genre/award list. HTTP-only, no browser.

What you get

One row per book, plus a LIST_SUMMARY row per list and an ERROR row for any input that fails — so every input maps to at least one row.

FieldExample
bookId2767052
titleThe Hunger Games (The Hunger Games, #1)
authorSuzanne Collins
avgRating4.35
ratingsCount10232595
listRank1 (position in this list)
listScore4518690 (Listopia vote score)
bookUrl / coverImagefull URLs

Optional detail pass

includeBookDetails: true fetches each book's page and attaches its JSON-LD Book under bookDetail, adding aggregateRating, numberOfPages, bookFormat, inLanguage, awards and the full author list — plus, under bookDetail.goodreadsExtras, the description and genres, which the JSON-LD does not carry. One extra request per book, so it is off by default.

Input

{
"listUrls": [
"https://www.goodreads.com/list/show/1.Best_Books_Ever"
],
"maxItems": 100,
"includeBookDetails": false
}

Open any Listopia list on Goodreads and paste its URL. Lists get large — Best Books Ever holds ~79,000 books at 100 per page — so maxItems and maxPages are the cost controls.

Goodreads' robots.txt disallows /search, /work, /review/show and /book/reviews/ for generic crawlers. Listopia (/list/show/…), book pages and author pages are not disallowed, and Goodreads publishes siteindex.list.xml advertising those lists for crawling.

So this actor takes list URLs and refuses a pasted /search URL rather than quietly fetching a surface the site asks crawlers to stay off. Reviews are not scraped at all, for the same reason.

Known limits

Pagination ends by repetition, not emptiness. Past a long list's real end, Goodreads re-serves the last page forever (pages 790–2000 of list 1 all returned the identical 100 books). This actor dedups by book id and stops when a page yields no new ids, reporting paginationClampHit. Short lists do end honestly with an empty page; both paths are handled.

listTotalBooks is the list's declared size, not the number of rows you will get — that depends on maxItems/maxPages and where the clamp begins.

A dead book id answers HTTP 503, not 404. Handled: such a book keeps its list row with bookDetail: null rather than failing the run.

Anti-bot / transport

No WAF, challenge page or JS gate was observed — 8 TLS profiles returned clean 200s cold, without warmup. List pages are large (~770 KB), and two transient read timeouts appeared during deep-pagination probing, so the client keeps a wide profile pool and rotates on retry rather than hammering one profile. Residential proxy is the default, without a country pin.