Je dois extraire le contenu d’un site Web, mais l’application ne fournit aucune interface de programmation d’application ni aucun autre mécanisme permettant d’accéder à ces données par programmation.
J’ai trouvé un outil tiers utile, appelé Import.io, qui fournit des fonctionnalités de clic et de sortie pour gratter les pages Web et créer des ensembles de données. La seule chose est que je veux conserver mes données localement et je ne souhaite pas m’abonner .
Quel type de technique cette entreprise utilise-t-elle pour gratter les pages Web et créer leurs jeux de données? J’ai trouvé des frameworks de grattage web pjscrape & Scrapy qui pourraient fournir une telle fonctionnalité
Vous voudrez certainement commencer avec un bon cadre de grattage Web. Plus tard, vous pouvez décider qu’ils sont trop contraignants et que vous pouvez assembler votre propre bibliothèque de bibliothèques, mais sans beaucoup d’expérience, votre conception sera bien pire que le Pjscrape ou le Scrapy.
Note: J’utilise les termes rampants et grattants essentiellement interchangeables ici. Ceci est une copie de ma réponse à votre question Quora, c’est assez long.
Outils
Familiarisez-vous avec les outils de développement Firebug ou Chrome en fonction de votre navigateur préféré. Cela est absolument nécessaire lorsque vous parcourez le site à partir duquel vous extrayez des données et que vous déterminez quelles URL contiennent les données que vous recherchez et quels formats de données constituent les réponses.
Vous aurez besoin d’une bonne connaissance du HTTP et du HTML, et vous voudrez probablement trouver une personne décente dans le logiciel proxy intermédiaire. Vous devrez pouvoir inspecter les requêtes et les réponses HTTP et comprendre comment les cookies et les informations de session et les parameters de requête sont transmis. Fiddler ( http://www.telerik.com/fiddler ) et Charles Proxy ( http://www.charlesproxy.com/ ) sont des outils populaires. J’utilise beaucoup mitmproxy ( http://mitmproxy.org/ ) car je suis plus un claviériste qu’un mec.
Une sorte d’environnement de type console / shell / REPL où vous pouvez essayer différents morceaux de code avec une rétroaction instantanée sera inestimable. Les tâches d’ingénierie inversée comme celle-ci impliquent beaucoup d’essais et d’erreurs. Vous souhaiterez donc avoir un workflow qui facilite les choses.
La langue
PHP est fondamentalement sorti, ce n’est pas bien adapté à cette tâche et le support de la bibliothèque / infrastructure est médiocre dans ce domaine. Python (Scrapy est un excellent sharepoint départ) et Clojure / Clojurescript (incroyablement puissant et productif, mais une grande courbe d’apprentissage) sont de bons langages pour résoudre ce problème. Puisque vous préférez ne pas apprendre une nouvelle langue et que vous connaissez déjà le Javascript, je vous suggérerais certainement de restr avec JS. Je n’ai pas utilisé pjscrape mais cela semble très bien vu une lecture rapide de leurs documents. C’est bien adapté et met en œuvre une excellente solution au problème que je décris ci-dessous.
Une note sur les expressions régulières: N’UTILISEZ PAS D’EXPRESSIONS ORDINAIRES POUR PARSE HTML. Beaucoup de débutants font cela parce qu’ils sont déjà familiarisés avec les regex. C’est une erreur énorme, utilisez les sélecteurs xpath ou css pour naviguer dans HTML et utilisez uniquement des expressions régulières pour extraire les données du texte réel dans un nœud HTML. Cela peut déjà être évident pour vous, cela devient évident si vous l’essayez, mais beaucoup de gens perdent beaucoup de temps dans cette voie pour une raison quelconque. N’ayez pas peur des sélecteurs xpath ou css, ils sont beaucoup plus faciles à apprendre que les regex et ils ont été conçus pour résoudre ce problème précis.
Sites lourds en Javascript
Auparavant, il suffisait de faire une requête http et d’parsingr la réponse HTML. Maintenant, vous devrez certainement faire face à des sites qui sont un mélange de requêtes / réponses HTTP HTML standard et d’appels HTTP asynchrones effectués par la partie javascript du site cible. C’est là que votre logiciel proxy et l’onglet réseau de Firebug / devtools sont très utiles. Les réponses à ces questions peuvent être HTML ou elles peuvent être json, dans de rares cas elles seront xml ou autre chose.
Il y a deux approches à ce problème:
L’approche de bas niveau:
Vous pouvez comprendre ce que les jax JavaScript du site appellent et ce à quoi ces réponses ressemblent et faire ces mêmes requêtes vous-même. Vous pouvez donc extraire le fichier HTML de http://example.com/foobar et extraire un élément de données, puis extraire la réponse json de http://example.com/api/baz?foo=b … à obtenir l’autre morceau de données. Vous devez être conscient de transmettre les bons cookies ou parameters de session. C’est très rare, mais de temps en temps certains parameters requirejs pour un appel ajax seront le résultat d’un calcul fou effectué dans le javascript du site, le reverse engineering peut être agaçant.
L’approche du navigateur intégré:
Pourquoi avez-vous besoin de savoir quelles données sont en HTML et quelles données proviennent d’un appel ajax? Gérer toutes ces données de session et de cookie? Vous n’avez pas à le faire lorsque vous naviguez sur un site, le navigateur et le site JavaScript le font. Exactement.
Si vous chargez simplement la page dans un moteur de navigation sans tête comme phantomjs, elle chargera la page, exécutera le javascript et vous indiquera quand tous les appels ajax sont terminés. Vous pouvez injecter votre propre javascript si nécessaire pour déclencher les clics appropriés ou tout ce qui est nécessaire pour déclencher le javascript du site afin de charger les données appropriées.
Vous avez maintenant deux options, faites-le pour cracher le HTML fini et parsingz-le ou injectez du javascript dans la page qui parsing votre texte et le formatage des données, et crache les données (probablement au format json). Vous pouvez librement mélanger ces deux options.
Quelle approche est la meilleure?
Cela dépend, vous devez être familier et à l’aise avec l’approche de bas niveau à coup sûr. L’approche du navigateur intégré fonctionne pour tout, elle sera beaucoup plus facile à mettre en œuvre et fera disparaître certains des problèmes les plus délicats liés au raclage. C’est aussi un mécanisme complexe que vous devrez comprendre. Ce ne sont pas seulement les requêtes et réponses HTTP, ses requêtes, le rendu du navigateur intégré, le javascript du site, le javascript injecté, votre propre code et l’interaction bidirectionnelle avec le processus du navigateur intégré.
Le navigateur intégré est également beaucoup plus lent à l’échelle en raison de la surcharge de rendu, mais cela n’aura certainement pas d’importance, à moins que vous ne cherchiez à exploiter beaucoup de domaines différents. Votre besoin de limiter vos demandes rendra le temps de rendu totalement négligeable dans le cas d’un seul domaine.
Taux de limitation / comportement du Bot
Vous devez être très conscient de cela. Vous devez faire des demandes à vos domaines cibles à un rythme raisonnable. Vous devez écrire un bot bien comporté lors de l’parsing des sites Web, ce qui implique de respecter le fichier robots.txt et de ne pas forcer le serveur avec les requêtes. Les erreurs ou la négligence ici sont très contraires à l’éthique, car cela peut être considéré comme une attaque par déni de service. Le taux acceptable varie en fonction de la personne que vous demandez, 1req / s est le maximum sur lequel s’exécute le robot Google, mais vous n’êtes pas Google et vous n’êtes probablement pas le bienvenu comme Google. Gardez-le aussi lentement que raisonnable. Je suggérerais 2-5 secondes entre chaque demande de page.
Identifiez vos requêtes avec une chaîne d’agent utilisateur identifiant votre bot et disposant d’une page Web expliquant son objective. Cette URL va dans la chaîne de l’agent.
Vous serez facile à bloquer si le site veut vous bloquer. Un ingénieur avisé de son côté peut facilement identifier les robots et quelques minutes de travail peuvent entraîner des semaines de travail pour modifier votre code de raclage de votre côté ou simplement pour le rendre impossible. Si la relation est antagoniste, un ingénieur intelligent sur le site cible peut complètement empêcher un ingénieur de génie d’écrire un robot. Le code de grattage est insortingnsèquement fragile et ceci est facilement exploité. Quelque chose qui pourrait provoquer cette réponse est presque certainement contraire à l’éthique de toute façon, alors écrivez un bot bien comporté et ne vous inquiétez pas à ce sujet.
Essai
Pas un testeur d’unité / d’intégration? Dommage. Vous devrez maintenant en devenir un. Les sites changent fréquemment et vous modifierez fréquemment votre code. Ceci est une grande partie du défi.
Il y a beaucoup de pièces mobiles impliquées dans le raclage d’un site Web moderne, de bonnes pratiques de test seront très utiles. La plupart des bogues que vous rencontrerez lors de l’écriture de ce type de code seront du type qui renverra silencieusement les données corrompues. Sans de bons tests pour vérifier les régressions, vous découvrirez que vous avez sauvegardé des données inutiles dans votre firebase database pendant un certain temps sans vous en rendre compte. Ce projet vous familiarisera avec la validation des données (trouver de bonnes bibliothèques à utiliser) et les tests. Il n’y a pas beaucoup d’autres problèmes qui nécessitent des tests complets et sont très difficiles à tester.
La deuxième partie de vos tests implique la mise en cache et la détection des modifications. Lors de l’écriture de votre code, vous ne voulez pas forcer le serveur pour la même page, encore et encore, sans aucune raison. Lorsque vous exécutez vos tests unitaires, vous voulez savoir si vos tests ont échoué car vous avez enfreint votre code ou que le site Web a été repensé. Exécutez vos tests unitaires sur une copie en cache des URL impliquées. Un proxy de mise en cache est très utile ici mais difficile à configurer et à utiliser correctement.
Vous voulez également savoir si le site a changé. S’ils ont repensé le site et que votre robot d’exploration est cassé, vos tests unitaires continueront de fonctionner car ils s’exécutent sur une copie en cache! Vous aurez besoin d’un autre ensemble de tests d’intégration plus restreints, exécutés peu fréquemment sur le site en direct, ou d’une bonne détection des erreurs dans votre code d’parsing, qui enregistre les problèmes exacts, vous signale le problème et arrête l’exploration. Maintenant, vous pouvez mettre à jour votre cache, exécuter vos tests unitaires et voir ce que vous devez changer.
Probleme juridique
La loi ici peut être légèrement dangereuse si vous faites des choses stupides. Si la loi intervient, vous avez affaire à des personnes qui considèrent régulièrement wget et curl comme des “outils de piratage”. Vous ne le voulez pas.
La réalité éthique de la situation est qu’il n’ya pas de différence entre utiliser un logiciel de navigation pour demander une URL et examiner certaines données et utiliser votre propre logiciel pour demander une URL et examiner certaines données. Google est la plus grande entreprise de raclage au monde et elle est très appréciée. Identifier le nom de votre robot dans l’agent utilisateur et être ouvert sur les objectives et les intentions de votre robot d’indexation sur le Web vous aidera ici, car la loi comprend ce qu’est Google. Si vous faites quelque chose de douteux, comme créer de faux comptes d’utilisateur ou accéder à des zones du site que vous ne devriez pas (soit “bloqué” par robots.txt, soit à cause d’une sorte d’exploitations d’autorisation), sachez que vous faites quelque chose d’éthique et la méconnaissance de la technologie par la loi sera extrêmement dangereuse ici. C’est une situation ridicule mais c’est réel.
Il est littéralement possible d’essayer de créer un nouveau moteur de recherche en tant que citoyen, de faire une erreur ou d’avoir un bogue dans votre logiciel et d’être considéré comme un pirate informatique. Pas quelque chose que vous voulez compte tenu de la réalité politique actuelle.
Qui suis-je pour écrire ce mur de texte géant de toute façon?
J’ai écrit beaucoup de code relatif à l’exploration du Web dans ma vie. Je fais du développement de logiciels Web depuis plus de dix ans en tant que consultant, employé et fondateur de startup. Au début, on écrivait des robots, des grattoirs et des sites Web PHP. Lorsque nous incorporions des iframes cachées chargeant des données csv dans des pages Web pour les ajuster avant que Jesse James Garrett ne les nomme ajax, avant que XMLHTTPRequest ne soit une idée. Avant jQuery, avant json. Je suis dans la mi-trentaine, apparemment considérée comme ancienne pour cette entreprise.
J’ai écrit des systèmes de crawl / scraping à grande échelle deux fois, une fois pour une grande équipe dans une société de médias (en Perl) et récemment pour une petite équipe en tant que CTO d’un démarrage de moteur de recherche (en Python / Javascript). Je travaille actuellement en tant que consultant, principalement en codage dans Clojure / Clojurescript (un langage expert génial en général et a des bibliothèques qui font des problèmes de crawler / scraper un plaisir)
J’ai également écrit des logiciels anti-rampes performants. Il est extrêmement facile d’écrire des sites presque invisibles si vous le souhaitez ou d’identifier et de saboter des robots que vous n’aimez pas.
J’aime écrire des robots, des grattoirs et des parsingurs plus que tout autre type de logiciel. C’est stimulant, amusant et peut être utilisé pour créer des choses étonnantes.
Oui, vous pouvez le faire vous-même. Il suffit de saisir les sources de la page et de les parsingr comme vous le souhaitez.
Il y a différentes possibilités. Un bon combo utilise python-requêtes (construit au dessus de urllib2, il s’agit de urllib.request
dans Python3) et BeautifulSoup4 , qui a ses méthodes pour sélectionner des éléments et permet également des sélecteurs CSS :
import requests from BeautifulSoup4 import BeautifulSoup as bs request = requests.get("http://foo.bar") soup = bs(request.text) some_elements = soup.find_all("div", class_="myCssClass")
Certains préféreront l’parsing de xpath ou la pyquery, le lxml ou autre chose .
Lorsque les données souhaitées sont produites par du JavaScript , ce qui précède ne fonctionnera pas. Vous avez besoin de python-ghost ou de selenium. Je préfère ce dernier combiné avec PhantomJS , beaucoup plus léger et plus simple à installer et facile à utiliser:
from selenium import webdriver client = webdriver.PhantomJS() client.get("http://foo") soup = bs(client.page_source)
Je conseillerais de commencer votre propre solution. Vous comprendrez les avantages de Scrapy.
ps: jetez un coup d’oeil à scrap: https://github.com/scrapy/scrapely
pps: jetez un oeil à Portia, pour commencer à extraire des informations visuellement, sans connaissances en programmation: https://github.com/scrapinghub/portia