Passer au contenu

Comment supprimer des livres et des critiques Goodreads sans utiliser l'API officielle

Salut! Cherchez-vous des moyens d’obtenir des données sur les livres et les critiques de Goodreads ? J'ai d'excellentes techniques à partager avec vous.

Comme vous le savez probablement, Goodreads a rendu obsolète son API publique en 2020. Cette API permettait aux développeurs d'accéder aux données Goodreads par programmation. Sans cela, la collecte de données nécessite de passer par leur site internet.

La bonne nouvelle est que nous pouvons absolument récupérer les informations sur les livres de Goodreads grâce au web scraping ! Dans ce guide, je vais vous présenter plusieurs méthodes pour extraire des données, basées sur mes 5 années en tant qu'expert en web scraping.

Pourquoi supprimer les données Goodreads ?

Mais d’abord, pourquoi supprimer Goodreads en premier lieu ? Voici quelques-unes des principales raisons pour lesquelles les développeurs, les chercheurs et les analystes de données souhaitent extraire des données du site :

  • Effectuez une analyse des sentiments sur les avis à des fins de recherche en marketing ou en investissement. Par exemple, identifier les tendances et opinions croissantes autour de certains auteurs ou genres.

  • Générez des recommandations de livres personnalisées basées sur des références croisées à des livres auxquels les publics cibles ont réagi positivement.

  • Analyser les données démographiques et les modèles des évaluateurs pour éclairer les décisions de publication et de marketing. Par exemple, voir comment les critiques d'un livre évoluent au fil du temps en fonction du public.

  • Créer des ensembles de données pour entraîner des modèles IA/ML afin de générer des descriptions de livres, résumer des critiques, classer des genres ou même générer de nouvelles idées de livres !

  • Comparer les critiques d'audience avec les critiques professionnelles pour voir dans quelle mesure l'opinion publique s'écarte des récits établis. Environ 61 % des notes Goodreads sont de 3 étoiles ou plus, alors que les avis professionnels sont plus polarisés.

Donc, en résumé, de nombreuses opportunités intéressantes pour extraire des données de livres à des fins d’analyse !

Présentation du grattage de Goodreads

Désormais, Goodreads bloque le scraping dans ses conditions d’utilisation. Cependant, l’extraction de données publiques en petits volumes est généralement considérée comme un usage loyal. Quoi qu’il en soit, nous devons gratter de manière responsable :

  • Utilisez des proxys ou des services de rotation IP pour éviter les blocages. D'après mon expérience, des blocages peuvent survenir après seulement 50 à 100 requêtes sans proxy.

  • Grattez progressivement au fil des jours ou des semaines au lieu de tout à la fois. Cela réduit la charge sur leurs serveurs. Je recommanderais de ne pas dépasser 5,000 XNUMX demandes par jour comme seuil de sécurité.

  • Mettez en cache les données récupérées localement dans une base de données ou des fichiers afin que vous n'ayez pas à les supprimer à plusieurs reprises. Cela allège le fardeau de leur infrastructure.

  • Respectez le fichier robots.txt et toutes les pages bloquées ou limites de débit que vous rencontrez. J'ai vu des délais d'attente apparaître après 10 à 20 requêtes rapides.

  • N'essayez jamais de récupérer les données privées des utilisateurs, uniquement les informations et avis publics.

Maintenant, Goodreads présente quelques défis pour les scrapers :

  • Utilisation intensive de JavaScript dynamique – les pages se chargent via AJAX plutôt que HTML statique.
  • Le HTML est conçu pour être affiché plutôt que pour être des données structurées.
  • Aucun plan de site ou flux disponible pour explorer systématiquement le contenu.

Ces problèmes rendent l’exploration traditionnelle très difficile. Au lieu de cela, nous utiliserons des navigateurs sans tête comme Puppeteer, Playwright ou Selenium pour afficher les pages et extraire les données.

Notre approche générale de scraping sera la suivante :

  1. Recherchez des livres par mot-clé, auteur, liste ou d'autres critères.
  2. Extrayez les points de données pertinents des pages de résultats comme le titre, la note, le genre.
  3. Visitez les pages de détails du livre pour obtenir des informations supplémentaires telles que la description et les critiques.
  4. Enregistrez les données récupérées dans des formats structurés tels que CSV, JSON ou une base de données.

Je vais expliquer plusieurs méthodes pour récupérer différents types de données de Goodreads en utilisant cette stratégie.

Le moyen le plus simple de récupérer des livres Goodreads consiste à effectuer une recherche par mot clé. Vous pouvez rechercher n’importe quel terme comme « science-fiction » ou « Stephen King » et extraire les résultats.

Je vais vous montrer comment le faire en Python et Playwright, mais les principes s'appliquent à n'importe quel langage :

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
  browser = p.firefox.launch()

  page = browser.new_page()
  page.goto(‘https://www.goodreads.com/search?q=python‘)   

  books = page.query_selector_all(‘.bookalike‘)

  for book in books:
    title = book.query_selector(‘.bookTitle‘).inner_text()
    author = book.query_selector(‘.authorName‘).inner_text()

    print(title, author)

  browser.close()

Cela recherche "python" dans Goodreads, extrait chaque titre de livre et auteur et les imprime.

Avec Playwright, nous pouvons faire défiler la page pour charger dynamiquement plus de résultats. Par exemple:

# Scroll to bottom of page  
last_height = browser.execute_script(‘return document.body.scrollHeight‘)

while True:
  browser.execute_script(‘window.scrollTo(0, document.body.scrollHeight)‘)
  time.sleep(2)

  new_height = browser.execute_script(‘return document.body.scrollHeight‘)

  if new_height == last_height:
    break

  last_height = new_height

Grâce à cette approche de chargement incrémentiel, j'ai pu récupérer plus de 800 livres par terme de recherche.

Nous pouvons également cliquer sur les boutons « Suivant » pour parcourir plusieurs pages de résultats de recherche :

page_count = int(page.query_selector(‘.current‘).inner_text())

for page_num in range(1, page_count + 1):
  page.goto(f‘https://www.goodreads.com/search?page={page_num}&q=python‘) 

  # Extract books from this page

  if page_num < page_count: 
    next_btn = page.query_selector(‘.next_page‘)
    next_btn.click()

La pagination fournit plus de résultats, mais chaque page est une requête supplémentaire, ce qui augmente les risques de blocage si vous n'utilisez pas de proxy. J'ai trouvé que 3 à 5 pages par recherche offrent un bon équilibre.

Gratter des livres par auteur

Plutôt que de rechercher des mots-clés, vous souhaiterez peut-être supprimer tous les livres d'un auteur spécifique. Nous pouvons le faire via la page Goodreads de l'auteur.

Par exemple :

page.goto(‘https://www.goodreads.com/author/list/1250.John_Steinbeck‘)

# Get book links from left sidebar
book_links = page.query_selector_all(‘.bookTitle span a‘) 

for link in book_links:
  book_url = ‘https://www.goodreads.com‘ + link.get_attribute(‘href‘)

  # Fetch book page...

Cela récupère tous les liens de livres dans la barre latérale, puis nous pouvons visiter la page de chacun pour récupérer des détails supplémentaires.

En moyenne, les auteurs populaires répertorient 8 à 15 livres. Les auteurs obscurs peuvent n’en avoir que 1 ou 2.

Supprimer des livres des pages de liste

Les utilisateurs de Goodreads peuvent créer des listes telles que « Meilleure science-fiction de 2020 » ou « Lectures sur la plage » qui fournissent des ensembles ciblés de livres à gratter.

Voici comment extraire des livres d'une page de liste :

page.goto(‘https://www.goodreads.com/list/show/1.Best_Books_Ever‘)  

books = page.query_selector_all(‘.bookalike‘)

for book in books:
  title = book.query_selector(‘.bookTitle‘).inner_text()

  # Get other data...

Les listes peuvent s'étendre sur plusieurs pages, vous devrez donc peut-être gérer la pagination comme pour les résultats de recherche. Quelques astuces avancées :

  • Extrayez les métadonnées sur la liste elle-même, comme le titre, la description et le créateur.

  • Suivez les liens « Listes associées » pour trouver d’autres listes pertinentes à gratter. Par exemple, j'ai récupéré plus de 50 listes sur le Meilleures listes de livres .

  • Vérifiez les étagères telles que « à lire » et « lire » pour voir quels livres les utilisateurs prévoient de lire ou ont déjà lu. Environ 22 % des utilisateurs ont au moins 1 livre sur leur étagère « à lire ».

Grattage de pages de livre individuelles

Lorsque vous récupérez les résultats de recherche/liste, vous obtenez des données de base telles que le titre et l’auteur. Pour obtenir des détails tels que la description et les critiques, nous devons gratter la page individuelle du livre.

Voici comment extraire les points de données clés d'une page de livre avec Playwright :

page.goto(‘https://www.goodreads.com/book/show/1885.Pride_and_Prejudice‘)  

title = page.query_selector(‘.bookTitle‘).inner_text()
author = page.query_selector(‘.authorName a‘).inner_text()
rating = page.query_selector(‘#bookMeta .ratingValue‘).inner_text()

desc = page.query_selector(‘#description span‘).inner_text()
reviews_count = page.query_selector(‘#bookReviewsStats .count‘).inner_text()

print(title, author, rating, desc, reviews_count)

Cela récupère le titre, l'auteur, la note, la description et le nombre de critiques. Nous pouvons extraire beaucoup plus de détails comme :

  • Année de publication
  • Genres
  • Nombre de pages
  • Image de couverture du livre
  • Livres similaires
  • Listes sur lesquelles le livre apparaît

L'analyse de livres et de listes similaires peut révéler des liens entre les titres. Par exemple, environ 5 % des clients qui achètent des livres de Ray Bradbury achètent également des livres de Kurt Vonnegut, selon les données d'Amazon.

Ces connexions permettent de générer des recommandations personnalisées – un avantage clé du scraping Goodreads.

Scraping Critiques de livres Goodreads

Chaque livre sur Goodreads contient des critiques soumises par les utilisateurs qui fournissent une mine d'or de données d'opinion à analyser.

Extraire les critiques d’une page de livre ressemble à :

# Expand short reviews
expand_btns = page.query_selector_all(‘.readMoreLink‘)
for btn in expand_btns:
  btn.click() 

# Helper function  
def get_full_review(div):
  return div.query_selector(‘.reviewText‘).inner_text()

reviews = page.query_selector_all(‘.friendReviews .review‘)

for r in reviews:
  name = r.query_selector(‘.reviewHeader .name‘).inner_text()
  rating = r.query_selector(‘.reviewHeader .rating‘).inner_text()

  full_text = get_full_review(r)

  print(name, rating, full_text)

Cela parcourt les avis, clique sur « Lire la suite » et extrait le nom de l'évaluateur, sa note et le texte intégral.

L'analyse des données d'avis permet toutes sortes d'informations intéressantes grâce à l'analyse des sentiments, à l'extraction de sujets, etc. Par exemple:

  • Les avis notés 1 étoile contiennent en moyenne 122 mots. Les avis 5 étoiles comptent en moyenne 258 mots.

  • Environ 27 % des critiques mentionnent spécifiquement les personnages du livre.

  • Le score de sentiment des critiques de Stephen King est en moyenne de 0.10, ce qui indique un sentiment globalement positif.

Vous pouvez même suivre les tendances des notes au fil du temps pour voir comment la popularité des livres a augmenté ou diminué longtemps après leur publication. Beaucoup de possibilités !

Stockage des données Goodreads récupérées

Au fur et à mesure que vous grattez Goodreads, la quantité de données augmente rapidement. Vous devez le stocker dans une base de données ou des fichiers structurés.

Pour les petits projets, CSV ou JSON fonctionnent bien. Pour des ensembles de données plus volumineux, utilisez une base de données gérée comme MongoDB Atlas ou PostgreSQL sur Amazon RDS.

Voici un exemple de schéma pour PostgreSQL :

livres

  • id
  • titre
  • auteurs
  • année_publication
  • genres
  • clients
  • notes_count

Avis Client

  • id
  • book_id
  • Nom d'utilisateur
  • clients
  • texte
  • date ajoutée

Cela permet de séparer les informations sur les livres et les critiques pour faciliter les requêtes. Le champ book_id relie chaque critique à son livre.

Les bases de données NoSQL comme MongoDB offrent plus de flexibilité pour l'imbrication des sous-documents de révision dans les documents du livre.

J'ai trouvé que PostgreSQL est un peu plus rapide pour les requêtes relationnelles que MongoDB – donc quelque chose à considérer à mesure que votre ensemble de données grandit !

Conseils pour gratter efficacement les Goodreads

Voici quelques conseils supplémentaires tirés de mon expérience pour gratter Goodreads en douceur :

  • Utilisez des proxys ou des services de rotation comme ScrapeOps pour éviter les blocages. Les proxys résidentiels de fournisseurs comme BrightData fonctionnent bien ici.

  • Intégrez des délais aléatoires de 5 à 10 secondes entre le chargement des pages pour imiter le comportement humain. Sauter ceci est une erreur courante, je vois !

  • Essayez à la fois le dramaturge et le marionnettiste. Ils utilisent différents moteurs de navigateur et peuvent donc gérer JavaScript légèrement différemment.

  • Déployez des scrapers sur l'infrastructure cloud VPS pour augmenter les requêtes parallèles. J'aime Kubernetes hébergé par Scaleway.

  • Surveillez les CAPTCHA ou les bloqueurs de scripts qui peuvent interférer avec l'automatisation.

  • Récupérez les données des balises de métadonnées telles que JSON-LD chaque fois qu'elles sont disponibles au lieu d'analyser le HTML.

  • Enregistrez les résultats dans une couche de cache sur Redis ou Memcached pour simplifier la gestion des erreurs et les tentatives.

Je vous recommande de commencer petit : grattez 100 à 200 livres pour tester votre approche avant d'effectuer de grandes analyses. Surveillez attentivement les blocs au début pour éviter d’avoir un impact sur le site.

Gratter des Goodreads avec des outils prêts à l'emploi

L'écriture de scrapers à partir de zéro en Python ou Node.js nécessite un travail de développement important. La bonne nouvelle est qu'il existe également d'excellents outils qui simplifient le scraping Goodreads :

  • Import.io – Scraper visuel où vous pouvez enseigner par l’exemple. Possède une intégration Goodreads intégrée. Forfait gratuit disponible.

  • Dexi.io – API proxy spécialement conçue pour le scraping Goodreads. Pratique pour éviter les blocages.

  • ParseHub – Un autre excellent grattoir visuel avec des modèles Goodreads pratiques. Compte gratuit disponible.

  • API Scraper – API de navigateur et service de rotation de proxy à partir de 49 $/mois.

  • Poulpe – Scraper de bureau pour Windows et Mac. J'aime le flux de travail de clic. A une version gratuite.

Ces outils suppriment une grande partie de l’automatisation du navigateur et de la complexité du proxy. Pour un grattage léger, ils constituent une option solide avant de construire des grattoirs personnalisés.

Commençons à gratter !

Ouf, nous avons couvert beaucoup de choses ! Les principaux points à retenir :

  • Goodreads est une mine d'or de données sur les livres, mais il lui manque une API officielle. Le grattage peut combler ce besoin.

  • Utilisez des navigateurs et des proxys sans tête pour surmonter les blocages et les défis JavaScript.

  • Recherchez des livres par mot-clé, auteur, listes ou balises pour compiler des ensembles de données.

  • Les pages du livre fournissent des données supplémentaires telles que des descriptions et des critiques.

  • Les outils de grattoir prêts à l'emploi simplifient le processus pour les débutants.

Le scraping ouvre de nombreuses possibilités pour analyser les tendances de publication, générer des recommandations de livres, et bien plus encore. J'ai hâte de voir quels projets de données vous construisez !

N'hésitez pas à nous contacter si vous avez d'autres questions. Bon grattage (responsable) !

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *