Scraping TripAdvisor - Code / Sans code?

Bonjour à tous,

Je viens vers vous pour un petit challenge que je rencontre actuellement : optimiser la méthode de récupération des emails des restaurants/bars parisiens référencés sur TripAdvisor.

La première étape consiste à récupérer les URLs des pages de détail des établissement TripAdvisor, cette étape est celle qui me pose problème.

La seconde étape est de copier-coller les URLs récupérées dans ce superbe outil (développé par l’agence deux.io si je ne m’abuse) : SpreadShare - TripExtractor
=> cette seconde étape fonctionne très bien.

Pour la première étape, j’ai tenté 2 méthodes :

Méthode 1 :

Scraping (avec extension, sans coder) des URLs des résultats Google pour une requête type : site:https://www.tripadvisor.fr inurl:Restaurant_Review « E-mail » « Paris »

=> Problème : les résultats Google Tripadvisor ne sont pas exaustifs par rapport à la liste de tous les établissements sur Tripadvisor (30 pages de 10 résultats Google, par rapport au 517 pages de 30 résultats. Autrement dit 300 établissements référencés sur Google contre 15,510 sur TripAdvisor.)

Méthode 2 :

Récupération des URLs directement via les pages de recherche TripAdvisor : https://www.tripadvisor.fr/Restaurants-g187147-Paris_Ile_de_France.html (cliquer sur « Rechercher un restaurant » pour afficher la liste qui nous intéresse).

Donc là, soit on récupère les URLs à la main, ce qui évidemment trop long.
Soit, on récupère tous les liens via l’extension FF « Copy Links Advanced » > puis nettoyage des liens pollués via une macro réutilisable sur Excel avec une formule combinée « AutoFilter » + « EntireRow.Delete » /

=> problème : pas assez de points communs entre les URLs à supprimer pour faire une formule réellement efficace. Donc méthode pas concluante pour ma part. j’ai testé d’autres extensions mais rien de concluant pour le moment. J’ai également tenté de faire une recherche par CSS.selectors avec la même extension « Copy Links Advanced » mais pas concluant non plus.

L’un de vous aurait d’autres pistes pour récupérer les URLs de la page TripAdvisor ? (des changements dans la query Google ne marcheront pas car Google limite à 30 pages de résultats j’ai l’impression, sauf si vous avez une solution pour afficher plus de pages de résultats)

Merci si vous avez lu jusqu’ici,
Et merci d’avance de me venir en aide :slight_smile:

Hello @Galette

  1. Checker le robots.txt : https://www.tripadvisor.fr/robots.txt

  2. Y trouver le sitemap général : https://www.tripadvisor.fr/sitemap/2/fr/sitemap_fr_index.xml

  3. Dans ce sitemap, récupérer les 67 sous sitemaps : « fr-restaurant_review ».

  4. DL + décompresser les gz.

  5. Faire une recherche globale aux 67 fichiers : « Paris_Ile_de_France.html »

  6. Cleaner + récupérer URLs.

  7. le résultat final : Paris - Google Spreadsheets (18K restaurants sur Paris)

  8. Mic drop :grin:


Pour aller plus loin :

15 « J'aime »

1 « J'aime »

Ta essayer https://www.grepsr.com ?

1 « J'aime »

Damnnnn

Merci @Camille ! Hyper malin d’aller dans robots.txt > aller chercher les sitemap, je retiens !
Et pour scraper les 67 sitemaps, tu l’as fait à la main, via extension ou via un script type puppeteer ?
Et merci @cebri j’ai vu dans un autre thread que tu étais l’auteur du TripExtractooor :wink:

Merci pour ce site @hichem
J’ai soumis un projet Test pour découvrir le concept :slight_smile: (même si je compte rester sur du GH gratuit pour le moment, pour bien apprendre à bien me débrouiller)

Hello @Galette,

Pour une "simple " récupération d’URLs, pour non techniques, je conseil l’utilisation de l’extension Webscraper.io, de Chrome.

Il faudrait que je fasse un tuto sur ce cas concret Tripadvisor, mais par manque de temps je te donnerais simplement la solution sans explications pour le moment (vis à vis de comment créer un sitemap de A à Z pour générer le JSON que je te donne ici):

  • 3 - Cliquer sur l’onglet « Web Scraper » situé tout à droite, et faire « Import Sitemap » dans le menu « Create Sitemap ».

  • 4 - Injecter le JSON suivant dans le champs « Sitemap JSON »:

{"_id":"tripadvisor-restaurants-urls","startUrl":["https://www.tripadvisor.fr/Restaurants-g187147-Paris_Ile_de_France.html"],"selectors":[{"id":"restaurants","type":"SelectorElementClick","parentSelectors":["_root"],"selector":"a.property_title","multiple":true,"delay":"400","clickElementSelector":"a.nav.next","clickType":"clickOnce","discardInitialElements":false,"clickElementUniquenessType":"uniqueHTMLText"},{"id":"restaurant","type":"SelectorLink","parentSelectors":["restaurants"],"selector":"parent","multiple":false,"delay":0}]}

  • 5 - Cliquer sur le bouton « Import Sitemap »

  • 6 - Une fois dans notre sitemap trip-advisor-restaurants-urls, on peut lancer le scraping, via le menu, en cliquant sur « Scrape ».

  • 7 - Ici, on conserve les options par défaut, et on clique sur « Start scraping »:

  • 8 - Une fois terminé, Webscraper nous indique que le scraping est terminé. On peut alors cliquer sur le bouton bleu « Refresh Data » pour voir les résultats.

  • 9 - Enfin, cliquer sur « Export data as CSV » pour obtenir notre export de données en csv:

  • 10 - Et tadaam: le rendu final (j’ai pris comme exemple dans mes screenshots une autre ville, donc pas d’inquiétude si Paris n’est pas mentionné):

4 « J'aime »

Au top, merci @ScrapingExpert
Cette extension Chrome est géniale, j’ai compris d’où venait ton JSON :wink: (depuis Export sitemap ?)
Avec leurs tutos vidéos, j’ai pu l’appliquer sur un autre site de restaurants pour pouvoir croiser les données avec celles de TripAdvisor et avoir une BDD qualifiée au max ! Je suis ravi
En revanche, pas encore réussi à passer outre l’obstacle de la pagination mais j’ai bon espoir d’y parvenir en rentrant ce soir.
Connais-tu la limite de lignes qu’on peut récupérer en un scrap ?

1 « J'aime »

@Camille @cebri : le TripExtractor fonctionne très bien pour quelques URLs mais bloque (probablement temporairement) quand on met beaucoup (j’en ai mis 6000 :grimacing: )
Auriez-vous une reco par rapport à cette limite ? Allotir - par combien - par exemple ?
Autre question : faut-il rester connecter à Drive + avoir l’ordi qui tourne pour que le script tourne correctement ?
(je pose cette question car je scrape pour plaisir perso, et je ne voudrais pas scraper au boulot [notre sysadmin voit tout :grin: ] donc j’aimerais savoir si je dois laisser mon ordi perso tourner toute la journée chez moi)
=> il semblerait que oui d’après ce thread SO

C’est normal en effet. Le script est exécuté par ta machine (donc tu dois laisser tout ca tourner), mais utilise les adresses IP de google pour scraper les sites; Google te bloque au bout d’un certain nombre de requetes.

Si tu veux scraper un volume important, tu vas devoir passer par du code ou des tools dédiés. Dans ce cas, le script de scraping est assez simple, les données étant toutes disponibles dans le code de la page. Il faut sans doute utiliser qqs dizaines d’IP pour tes 6000 urls par contre. Si tu ne sais pas faire ca, il va falloir

  1. apprendre à coder :wink:
  2. apprendre à utiliser scrapebox
  3. embaucher un dév sur upwork (ce taf la doit pas etre bien cher)

++

Bon…en fait je me suis motivé, j’ai codé le truc. Il faut bien utiliser des proxies.
Si tu veux le résultats, MP :wink:

4 « J'aime »

« En revanche, pas encore réussi à passer outre l’obstacle de la pagination » : quel problème rencontres-tu exactement à ce stade?

Car la pagination est bien gérée avec le sitemap du scénario de Webscraper que je t’ai donné, ça clique tout seul jusqu’à la fin :slight_smile:

@Galette: sinon pour le JSON du sitemap, certes il vient de l’export mais il vient surtout de moi-même, sous entendu j’ai créé cette config manuellement :cowboy_hat_face:

@cebri: du coup ça passe nickel sans proxies en utilisant Chrome controlé par l’extension Webscraper , pas eu de blocages de mon côté même sur des centaines de millier de pages…

1 « J'aime »

ahah :wink: well done. J’ai fait un script, pas webscraper, du coup le nombre de requetes en parallele est quelque peu…importante. Ce doit être la raison du besoin de proxies.

1 « J'aime »

GG ALL :wink:

image

4 « J'aime »

Le barbare :rofl::joy:

1 « J'aime »

Bravo messieurs et merci pour ce partage :pray:

C’est super @ScrapingExpert !
J’avais le tool mais je ne connaissais pas cette astuce d’import le sitemap pour le scraping. Par contre, quand je test ton JSON de mon côté, l’extension me met invalid json, tu as une idée d’où ça peut venir ?

Et juste pour avoir un peu de détails supplémentaires, comment as-tu cette config?

Ok. Nous annonçons la levée de $20M pour continuer le développement de ce topic.

10 « J'aime »

La fonctionnalité d’export/import de sitemap (ou plutôt de configuration d’un scénario), permet simplement de pouvoir injecter une config de scénario écrite par un autre, sans avoir à se retaper toute la config manuelle de l’outil.

Le problème ne provient pas de mon JSON, mais de la manière dont ce site (le forum growthhacking.fr) formate les doubles quotes ("), quand tu regardes de plus près il remplaces les doubles guillemets par des guillemets de citation à gauche et à droite. Après avoir copié collé ce JSON dans ton éditeur de texte préféré, remplaces ces guillemets de citation par le vrai caractère du double quotes.

J’ai re-édité ma réponse, en incluant le JSON dans du texte pré-formatté, pour éviter ce problème, le voici à jour:

  • 4 - Injecter le JSON suivant dans le champs “Sitemap JSON”:

{"_id":"tripadvisor-restaurants-urls","startUrl":["https://www.tripadvisor.fr/Restaurants-g187147-Paris_Ile_de_France.html"],"selectors":[{"id":"restaurants","type":"SelectorElementClick","parentSelectors":["_root"],"selector":"a.property_title","multiple":true,"delay":"400","clickElementSelector":"a.nav.next","clickType":"clickOnce","discardInitialElements":false,"clickElementUniquenessType":"uniqueHTMLText"},{"id":"restaurant","type":"SelectorLink","parentSelectors":["restaurants"],"selector":"parent","multiple":false,"delay":0}]}

Après coup, il est bien valide:

@louistof: comme je l’expliquais avant, j’ai créé cette config manuellement avec l’outil Webscraper, mais je n’ai pas pris le temps nécessaire pour vous faire un tuto complet à ce sujet.

1 « J'aime »

Tu peux nous rejoindre avec un petit mitmproxy :wink:

1 « J'aime »