Comment scraper Goodreads : Le guide ultime du web scraping 2025

Apprenez à scraper Goodreads pour obtenir des données de livres, des avis et des notes en 2025. Ce guide couvre le contournement des anti-bots, des exemples de...

Goodreads favicon
goodreads.comDifficile
Couverture:GlobalUnited StatesUnited KingdomCanadaAustralia
Données Disponibles7 champs
TitreDescriptionImagesInfo VendeurDate de PublicationCatégoriesAttributs
Tous les Champs Extractibles
Titre du livreNom de l'auteurAbonnés de l'auteurNote moyenneNombre de notesNombre de critiquesDescriptionGenresISBNNombre de pagesDate de publicationInformations sur la sérieURL de l'image de couvertureTexte des critiques utilisateursNote du critique
Exigences Techniques
JavaScript Requis
Sans Connexion
A une Pagination
Pas d'API Officielle
Protection Anti-Bot Détectée
CloudflareDataDomereCAPTCHARate LimitingIP Blocking

Protection Anti-Bot Détectée

Cloudflare
WAF et gestion de bots de niveau entreprise. Utilise des défis JavaScript, des CAPTCHAs et l'analyse comportementale. Nécessite l'automatisation du navigateur avec des paramètres furtifs.
DataDome
Détection de bots en temps réel avec des modèles ML. Analyse l'empreinte d'appareil, les signaux réseau et les schémas comportementaux. Courant sur les sites e-commerce.
Google reCAPTCHA
Système CAPTCHA de Google. v2 nécessite une interaction utilisateur, v3 fonctionne silencieusement avec un score de risque. Peut être résolu avec des services CAPTCHA.
Limitation de débit
Limite les requêtes par IP/session dans le temps. Peut être contourné avec des proxys rotatifs, des délais de requête et du scraping distribué.
Blocage IP
Bloque les IP de centres de données connues et les adresses signalées. Nécessite des proxys résidentiels ou mobiles pour contourner efficacement.

À Propos de Goodreads

Découvrez ce que Goodreads offre et quelles données précieuses peuvent être extraites.

La plus grande plateforme de catalogage social au monde

Goodreads est la plateforme de médias sociaux de référence pour les amoureux des livres, détenue et exploitée par Amazon. Elle sert de base de données massive de données littéraires, regroupant des millions de fiches de livres, des critiques générées par les utilisateurs, des annotations et des listes de lecture. La plateforme est organisée en genres et en « étagères » créées par les utilisateurs, offrant un aperçu approfondi des habitudes de lecture mondiales et des tendances littéraires.

Une mine d'or de données littéraires

La plateforme contient des données granulaires incluant les ISBN, les genres, les bibliographies d'auteurs et les sentiments détaillés des lecteurs. Pour les entreprises et les chercheurs, ces données offrent des informations précieuses sur les tendances du marché et les préférences des consommateurs. Les données scrapées de Goodreads sont inestimables pour les éditeurs, les auteurs et les chercheurs afin de réaliser des analyses concurrentielles et d'identifier les thématiques émergentes.

Pourquoi scraper les données de Goodreads ?

Le scraping de ce site permet d'accéder à des indicateurs de popularité en temps réel, à une analyse concurrentielle pour les auteurs et à des jeux de données de haute qualité pour entraîner des systèmes de recommandation ou mener des recherches académiques en sciences humaines. Il permet aux utilisateurs de fouiller sa base de données massive tout en suivant la progression de lecture, offrant un regard unique sur la façon dont les différents groupes démographiques interagissent avec les livres.

À Propos de Goodreads

Pourquoi Scraper Goodreads?

Découvrez la valeur commerciale et les cas d'utilisation pour l'extraction de données de Goodreads.

Analyse de sentiment des lecteurs

Extrayez des milliers d'avis qualitatifs pour comprendre pourquoi certains thèmes ou genres sont tendances parmi différents segments démographiques. Ces données aident les auteurs et les éditeurs à affiner leurs stratégies marketing basées sur les retours réels des lecteurs.

Prévision des tendances du marché

Surveillez la vitesse d'ajout aux listes 'Want to Read' des sorties à venir pour prédire les futurs best-sellers. Identifier ces tendances tôt permet aux détaillants et aux bibliothèques d'optimiser leurs stocks et leurs décisions d'achat.

Création de bases de données bibliographiques

Collectez des métadonnées précises incluant les ISBN, l'ordre des séries et le nombre de pages pour construire des catalogues littéraires complets. Ces données structurées sont essentielles pour les systèmes de gestion de bibliothèques et les projets de recherche académique.

Suivi de la concurrence entre auteurs

Suivez les performances des auteurs concurrents dans le même genre en analysant la répartition de leurs notes et le nombre de leurs avis au fil du temps. Cela fournit des insights profonds sur le paysage concurrentiel de l'industrie de l'édition.

Entraînement de moteurs de recommandation

Rassemblez des jeux de données de haute qualité sur les évaluations des utilisateurs et les habitudes de rangement pour entraîner des models de machine learning. Ces models peuvent alimenter des systèmes de recommandation de niche suggérant des livres basés sur des préférences complexes.

Suivi de la réputation de l'auteur

Aidez les agents littéraires et les auteurs à surveiller la réception à long terme d'une bibliographie tout au long de son cycle de vie. Le scraping permet de détecter les changements soudains dans la perception du public ou l'impact des campagnes marketing externes.

Défis du Scraping

Défis techniques que vous pouvez rencontrer lors du scraping de Goodreads.

Barrières anti-bot avancées

Goodreads utilise Cloudflare et DataDome pour détecter le trafic automatisé, ce qui entraîne souvent des erreurs 403 Forbidden immédiates pour les scripts standards. Contourner cela nécessite un fingerprinting de navigateur sophistiqué et une gestion rigoureuse des headers.

Rendu de contenu dynamique

L'interface moderne de Goodreads est construite avec React, ce qui signifie que les avis et les statistiques détaillées des livres sont chargés de manière asynchrone via JavaScript. Les parseurs HTML statiques passeront souvent à côté de ces données sans un navigateur headless.

Sélecteurs CSS instables

Le site utilise des noms de classes React obfusqués et changeant fréquemment, ce qui rend le scraping traditionnel basé sur le CSS peu fiable. S'appuyer sur ces sélecteurs entraîne des ruptures fréquentes du script et une maintenance lourde.

Sections d'avis en lazy-loading

Pour optimiser les performances de la page, Goodreads ne charge initialement qu'une fraction des avis, nécessitant un défilement ou une interaction de pagination. Les scrapers doivent simuler ces actions utilisateur pour capturer l'intégralité des retours lecteurs.

Limitation de débit (rate-limiting) agressive

L'envoi de trop de requêtes à partir d'une seule adresse IP dans un court intervalle déclenche des CAPTCHAs automatisés ou des bannissements temporaires. Maintenir un crawl à haut volume nécessite un rythme prudent et une rotation des proxies.

Scrapez Goodreads avec l'IA

Aucun code requis. Extrayez des données en minutes avec l'automatisation par IA.

Comment ça marche

1

Décrivez ce dont vous avez besoin

Dites à l'IA quelles données vous souhaitez extraire de Goodreads. Tapez simplement en langage naturel — pas de code ni de sélecteurs.

2

L'IA extrait les données

Notre intelligence artificielle navigue sur Goodreads, gère le contenu dynamique et extrait exactement ce que vous avez demandé.

3

Obtenez vos données

Recevez des données propres et structurées, prêtes à exporter en CSV, JSON ou à envoyer directement à vos applications.

Pourquoi utiliser l'IA pour le scraping

Fingerprinting indétectable: Automatio utilise une technologie avancée de spoofing de navigateur pour imiter de vrais utilisateurs humains, franchissant avec succès les protections Cloudflare et DataDome qui bloquent les autres scrapers.
Mapping visuel des données: Éliminez le besoin de sélecteurs CSS ou XPath complexes en cliquant visuellement sur les données de livres que vous souhaitez extraire. Cela garantit que votre scraper reste fonctionnel même lorsque la mise en page du site change.
Exécution native du JavaScript: Parce qu'il fonctionne comme un navigateur complet, Automatio gère automatiquement le contenu rendu par React et le lazy-loading, garantissant que chaque avis et chaque note sont capturés exactement comme ils apparaissent à l'écran.
Gestion automatisée des proxies: Exploitez la rotation intégrée des proxies résidentiels pour éviter le blocage d'IP. Automatio s'occupe du changement d'IP pour que votre collecte de données reste ininterrompue à grande échelle.
Déclencheurs de contenu dynamique: Configurez facilement le scraper pour cliquer sur les boutons 'Show More' ou faire défiler jusqu'au bas de la page pour déclencher le chargement de contenu dynamique sans écrire une seule ligne de code.
Pas de carte de crédit requiseOffre gratuite disponibleAucune configuration nécessaire

L'IA facilite le scraping de Goodreads sans écrire de code. Notre plateforme alimentée par l'intelligence artificielle comprend quelles données vous voulez — décrivez-les en langage naturel et l'IA les extrait automatiquement.

How to scrape with AI:
  1. Décrivez ce dont vous avez besoin: Dites à l'IA quelles données vous souhaitez extraire de Goodreads. Tapez simplement en langage naturel — pas de code ni de sélecteurs.
  2. L'IA extrait les données: Notre intelligence artificielle navigue sur Goodreads, gère le contenu dynamique et extrait exactement ce que vous avez demandé.
  3. Obtenez vos données: Recevez des données propres et structurées, prêtes à exporter en CSV, JSON ou à envoyer directement à vos applications.
Why use AI for scraping:
  • Fingerprinting indétectable: Automatio utilise une technologie avancée de spoofing de navigateur pour imiter de vrais utilisateurs humains, franchissant avec succès les protections Cloudflare et DataDome qui bloquent les autres scrapers.
  • Mapping visuel des données: Éliminez le besoin de sélecteurs CSS ou XPath complexes en cliquant visuellement sur les données de livres que vous souhaitez extraire. Cela garantit que votre scraper reste fonctionnel même lorsque la mise en page du site change.
  • Exécution native du JavaScript: Parce qu'il fonctionne comme un navigateur complet, Automatio gère automatiquement le contenu rendu par React et le lazy-loading, garantissant que chaque avis et chaque note sont capturés exactement comme ils apparaissent à l'écran.
  • Gestion automatisée des proxies: Exploitez la rotation intégrée des proxies résidentiels pour éviter le blocage d'IP. Automatio s'occupe du changement d'IP pour que votre collecte de données reste ininterrompue à grande échelle.
  • Déclencheurs de contenu dynamique: Configurez facilement le scraper pour cliquer sur les boutons 'Show More' ou faire défiler jusqu'au bas de la page pour déclencher le chargement de contenu dynamique sans écrire une seule ligne de code.

Scrapers Web No-Code pour Goodreads

Alternatives pointer-cliquer au scraping alimenté par l'IA

Plusieurs outils no-code comme Browse.ai, Octoparse, Axiom et ParseHub peuvent vous aider à scraper Goodreads sans écrire de code. Ces outils utilisent généralement des interfaces visuelles pour sélectionner les données, bien qu'ils puissent avoir des difficultés avec le contenu dynamique complexe ou les mesures anti-bot.

Workflow Typique avec les Outils No-Code

1
Installer l'extension de navigateur ou s'inscrire sur la plateforme
2
Naviguer vers le site web cible et ouvrir l'outil
3
Sélectionner en point-and-click les éléments de données à extraire
4
Configurer les sélecteurs CSS pour chaque champ de données
5
Configurer les règles de pagination pour scraper plusieurs pages
6
Gérer les CAPTCHAs (nécessite souvent une résolution manuelle)
7
Configurer la planification pour les exécutions automatiques
8
Exporter les données en CSV, JSON ou se connecter via API

Défis Courants

Courbe d'apprentissage

Comprendre les sélecteurs et la logique d'extraction prend du temps

Les sélecteurs cassent

Les modifications du site web peuvent casser tout le workflow

Problèmes de contenu dynamique

Les sites riches en JavaScript nécessitent des solutions complexes

Limitations des CAPTCHAs

La plupart des outils nécessitent une intervention manuelle pour les CAPTCHAs

Blocage d'IP

Le scraping agressif peut entraîner le blocage de votre IP

Scrapers Web No-Code pour Goodreads

Plusieurs outils no-code comme Browse.ai, Octoparse, Axiom et ParseHub peuvent vous aider à scraper Goodreads sans écrire de code. Ces outils utilisent généralement des interfaces visuelles pour sélectionner les données, bien qu'ils puissent avoir des difficultés avec le contenu dynamique complexe ou les mesures anti-bot.

Workflow Typique avec les Outils No-Code
  1. Installer l'extension de navigateur ou s'inscrire sur la plateforme
  2. Naviguer vers le site web cible et ouvrir l'outil
  3. Sélectionner en point-and-click les éléments de données à extraire
  4. Configurer les sélecteurs CSS pour chaque champ de données
  5. Configurer les règles de pagination pour scraper plusieurs pages
  6. Gérer les CAPTCHAs (nécessite souvent une résolution manuelle)
  7. Configurer la planification pour les exécutions automatiques
  8. Exporter les données en CSV, JSON ou se connecter via API
Défis Courants
  • Courbe d'apprentissage: Comprendre les sélecteurs et la logique d'extraction prend du temps
  • Les sélecteurs cassent: Les modifications du site web peuvent casser tout le workflow
  • Problèmes de contenu dynamique: Les sites riches en JavaScript nécessitent des solutions complexes
  • Limitations des CAPTCHAs: La plupart des outils nécessitent une intervention manuelle pour les CAPTCHAs
  • Blocage d'IP: Le scraping agressif peut entraîner le blocage de votre IP

Exemples de Code

import requests
from bs4 import BeautifulSoup

# URL cible pour un livre spécifique
url = 'https://www.goodreads.com/book/show/1.Harry_Potter'
# Headers essentiels pour éviter un blocage immédiat
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/119.0.0.0 Safari/537.36'}

try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')
    # Utilisation de data-testid pour l'UI moderne basée sur React
    title = soup.find('h1', {'data-testid': 'bookTitle'}).text.strip()
    author = soup.find('span', {'data-testid': 'name'}).text.strip()
    print(f'Titre: {title}, Auteur: {author}')
except Exception as e:
    print(f'Le scraping a échoué : {e}')

Quand Utiliser

Idéal pour les pages HTML statiques avec peu de JavaScript. Parfait pour les blogs, sites d'actualités et pages e-commerce simples.

Avantages

  • Exécution la plus rapide (sans surcharge navigateur)
  • Consommation de ressources minimale
  • Facile à paralléliser avec asyncio
  • Excellent pour les APIs et pages statiques

Limitations

  • Ne peut pas exécuter JavaScript
  • Échoue sur les SPAs et contenu dynamique
  • Peut avoir des difficultés avec les systèmes anti-bot complexes

Comment Scraper Goodreads avec du Code

Python + Requests
import requests
from bs4 import BeautifulSoup

# URL cible pour un livre spécifique
url = 'https://www.goodreads.com/book/show/1.Harry_Potter'
# Headers essentiels pour éviter un blocage immédiat
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/119.0.0.0 Safari/537.36'}

try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')
    # Utilisation de data-testid pour l'UI moderne basée sur React
    title = soup.find('h1', {'data-testid': 'bookTitle'}).text.strip()
    author = soup.find('span', {'data-testid': 'name'}).text.strip()
    print(f'Titre: {title}, Auteur: {author}')
except Exception as e:
    print(f'Le scraping a échoué : {e}')
Python + Playwright
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # Le lancement d'un navigateur est nécessaire pour les pages Cloudflare/JS
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('https://www.goodreads.com/search?q=fantasy')
    # Attendre que l'attribut de donnée spécifique soit rendu
    page.wait_for_selector('[data-testid="bookTitle"]')
    
    books = page.query_selector_all('.bookTitle')
    for book in books:
        print(book.inner_text().strip())
    
    browser.close()
Python + Scrapy
import scrapy

class GoodreadsSpider(scrapy.Spider):
    name = 'goodreads_spider'
    start_urls = ['https://www.goodreads.com/list/show/1.Best_Books_Ever']

    def parse(self, response):
        # Cibler le balisage schema.org pour des sélecteurs plus stables
        for book in response.css('tr[itemtype="http://schema.org/Book"]'):
            yield {
                'title': book.css('.bookTitle span::text').get(),
                'author': book.css('.authorName span::text').get(),
                'rating': book.css('.minirating::text').get(),
            }
        
        # Gestion standard de la pagination
        next_page = response.css('a.next_page::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)
Node.js + Puppeteer
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  // Goodreads utilise du JS moderne, nous attendons donc des composants spécifiques
  await page.goto('https://www.goodreads.com/book/show/1.Harry_Potter');
  await page.waitForSelector('[data-testid="bookTitle"]');
  
  const data = await page.evaluate(() => ({
    title: document.querySelector('[data-testid="bookTitle"]').innerText,
    author: document.querySelector('[data-testid="name"]').innerText,
    rating: document.querySelector('.RatingStatistics__rating').innerText
  }));
  
  console.log(data);
  await browser.close();
})();

Que Pouvez-Vous Faire Avec Les Données de Goodreads

Explorez les applications pratiques et les insights des données de Goodreads.

Analyse prédictive des best-sellers

Les éditeurs analysent le sentiment des premières critiques et la vitesse de mise en étagère pour prédire les futurs succès.

Comment implémenter :

  1. 1Surveiller les comptes 'Envie de lire' pour les livres à paraître.
  2. 2Scraper les premières critiques d'exemplaires de pré-publication (ARC).
  3. 3Comparer le sentiment par rapport aux données historiques des best-sellers.

Utilisez Automatio pour extraire des données de Goodreads et créer ces applications sans écrire de code.

Que Pouvez-Vous Faire Avec Les Données de Goodreads

  • Analyse prédictive des best-sellers

    Les éditeurs analysent le sentiment des premières critiques et la vitesse de mise en étagère pour prédire les futurs succès.

    1. Surveiller les comptes 'Envie de lire' pour les livres à paraître.
    2. Scraper les premières critiques d'exemplaires de pré-publication (ARC).
    3. Comparer le sentiment par rapport aux données historiques des best-sellers.
  • Intelligence concurrentielle pour auteurs

    Les auteurs suivent les thèmes de genre et les tendances de notation pour optimiser leur propre écriture et leur marketing.

    1. Scraper les livres les mieux notés dans une étagère de genre spécifique.
    2. Extraire les thèmes récurrents des critiques des lecteurs.
    3. Analyser la vitesse de notation après les campagnes marketing.
  • Moteurs de recommandation de niche

    Les développeurs créent des outils pour trouver des livres correspondant à des critères spécifiques et complexes non supportés par le site principal.

    1. Scraper les tags définis par les utilisateurs et les croiser.
    2. Cartographier les notes pour trouver des corrélations uniques entre les auteurs.
    3. Exporter les résultats via une API vers une application web.
  • Filtrage de livres basé sur le sentiment

    Les chercheurs utilisent le NLP sur les critiques pour catégoriser les livres en fonction de leur impact émotionnel plutôt que de leur genre.

    1. Extraire des milliers de critiques d'utilisateurs pour une catégorie spécifique.
    2. Lancer une analyse de sentiment et une extraction de mots-clés.
    3. Construire un dataset pour des modèles de machine learning.
Plus que de simples prompts

Optimisez votre flux de travail avec l'Automatisation IA

Automatio combine la puissance des agents IA, de l'automatisation web et des integrations intelligentes pour vous aider a accomplir plus en moins de temps.

Agents IA
Automatisation Web
Flux Intelligents

Conseils Pro pour Scraper Goodreads

Conseils d'experts pour extraire avec succès les données de Goodreads.

Cibler les attributs data-testid

Au lieu d'utiliser des noms de classes volatiles, utilisez des attributs comme [data-testid='bookTitle'] dans vos sélecteurs. Ils sont spécifiquement conçus pour les tests et risquent beaucoup moins de changer lors des mises à jour du site.

Vérifier les scripts JSON-LD

Inspectez le code source de la page pour trouver des balises script de type 'application/ld+json'. Elles contiennent souvent des métadonnées de livres propres et pré-structurées, plus faciles et rapides à parser que le HTML visuel.

Privilégier les proxies résidentiels

Évitez d'utiliser des IP de centres de données, car Goodreads et Amazon bloquent souvent ces plages entières. Les proxies résidentiels offrent des taux de réussite bien plus élevés face aux dispositifs anti-bot.

Implémenter des délais aléatoires

Ajoutez toujours un temps d'attente aléatoire de 3 à 8 secondes entre les chargements de pages. Cela permet de rester sous le radar des algorithmes de rate-limiting et réduit la probabilité de déclencher des reCAPTCHAs.

Scraper les listes de résultats de recherche

Pour une collecte de métadonnées rapide, scrapez les pages de résultats de recherche ou les listes 'Listopia' plutôt que les pages individuelles des livres. Ces listes contiennent souvent les titres, auteurs et notes pour plus de 50 livres sur une seule page.

Gérer la troncature des avis

De nombreux avis longs sont tronqués par un lien '...more'. Assurez-vous que votre scraper est configuré pour cliquer sur ces liens d'extension avant d'extraire le texte afin de ne pas perdre de données de feedback critiques.

Témoignages

Ce Que Disent Nos Utilisateurs

Rejoignez des milliers d'utilisateurs satisfaits qui ont transforme leur flux de travail

Jonathan Kogan

Jonathan Kogan

Co-Founder/CEO, rpatools.io

Automatio is one of the most used for RPA Tools both internally and externally. It saves us countless hours of work and we realized this could do the same for other startups and so we choose Automatio for most of our automation needs.

Mohammed Ibrahim

Mohammed Ibrahim

CEO, qannas.pro

I have used many tools over the past 5 years, Automatio is the Jack of All trades.. !! it could be your scraping bot in the morning and then it becomes your VA by the noon and in the evening it does your automations.. its amazing!

Ben Bressington

Ben Bressington

CTO, AiChatSolutions

Automatio is fantastic and simple to use to extract data from any website. This allowed me to replace a developer and do tasks myself as they only take a few minutes to setup and forget about it. Automatio is a game changer!

Sarah Chen

Sarah Chen

Head of Growth, ScaleUp Labs

We've tried dozens of automation tools, but Automatio stands out for its flexibility and ease of use. Our team productivity increased by 40% within the first month of adoption.

David Park

David Park

Founder, DataDriven.io

The AI-powered features in Automatio are incredible. It understands context and adapts to changes in websites automatically. No more broken scrapers!

Emily Rodriguez

Emily Rodriguez

Marketing Director, GrowthMetrics

Automatio transformed our lead generation process. What used to take our team days now happens automatically in minutes. The ROI is incredible.

Jonathan Kogan

Jonathan Kogan

Co-Founder/CEO, rpatools.io

Automatio is one of the most used for RPA Tools both internally and externally. It saves us countless hours of work and we realized this could do the same for other startups and so we choose Automatio for most of our automation needs.

Mohammed Ibrahim

Mohammed Ibrahim

CEO, qannas.pro

I have used many tools over the past 5 years, Automatio is the Jack of All trades.. !! it could be your scraping bot in the morning and then it becomes your VA by the noon and in the evening it does your automations.. its amazing!

Ben Bressington

Ben Bressington

CTO, AiChatSolutions

Automatio is fantastic and simple to use to extract data from any website. This allowed me to replace a developer and do tasks myself as they only take a few minutes to setup and forget about it. Automatio is a game changer!

Sarah Chen

Sarah Chen

Head of Growth, ScaleUp Labs

We've tried dozens of automation tools, but Automatio stands out for its flexibility and ease of use. Our team productivity increased by 40% within the first month of adoption.

David Park

David Park

Founder, DataDriven.io

The AI-powered features in Automatio are incredible. It understands context and adapts to changes in websites automatically. No more broken scrapers!

Emily Rodriguez

Emily Rodriguez

Marketing Director, GrowthMetrics

Automatio transformed our lead generation process. What used to take our team days now happens automatically in minutes. The ROI is incredible.

Associés Web Scraping

Questions Fréquentes sur Goodreads

Trouvez des réponses aux questions courantes sur Goodreads