Les programmes qui lisent les informations des sites Web, ou les robots d'exploration Web, ont toutes sortes d'applications utiles. Vous pouvez rechercher des informations boursières, des résultats sportifs, des SMS à partir d'un compte Twitter ou tirer des prix sur des sites Web d'achat.
L'écriture de ces programmes d'exploration Web est plus facile que vous ne le pensez. Python possède une excellente bibliothèque pour écrire des scripts qui extraient des informations de sites Web. Voyons comment créer un robot d'exploration Web à l'aide de Scrapy.
Scrapy est une bibliothèque Python qui a été créée pour gratter le Web et créer des robots d'exploration Web. Il est rapide, simple et peut naviguer sur plusieurs pages Web sans trop d'effort.
Scrapy est disponible via la bibliothèque Pip Installs Python (PIP). Voici un rappel sur l'installation de PIP sur Windows, Mac et Linux.
L'utilisation d'un environnement virtuel Python est préférable car elle vous permettra d'installer Scrapy dans un répertoire virtuel qui laisse vos fichiers système seuls. La documentation de Scrapy recommande de le faire pour obtenir les meilleurs résultats.
Créez un répertoire et initialisez un environnement virtuel.
robot mkdir
robot d'exploration de cd
virtualenv venv
. venv/bin/activer
Vous pouvez maintenant installer Scrapy dans ce répertoire à l'aide d'une commande PIP.
installation pip scrapy
Une vérification rapide pour s'assurer que Scrapy est correctement installé
scrapy
# impressions
Scrapy 1.4.0 - aucun projet actif
Usage:
scrapy [options] [args]
Commandes disponibles :
Banc Exécuter un test de référence rapide
fetch Récupérer une URL à l'aide du téléchargeur Scrapy
genspider Générer une nouvelle araignée en utilisant des modèles prédéfinis
runspider Exécute un spider autonome (sans créer de projet)
...
Maintenant que l'environnement est prêt, vous pouvez commencer à créer le robot d'exploration Web. Extrayons quelques informations d'une page Wikipedia sur les batteries :https://en.wikipedia.org/wiki/Battery_(électricité).
La première étape pour écrire un crawler consiste à définir une classe Python qui s'étend de Scrapy.Spider . Cela vous donne accès à toutes les fonctions et fonctionnalités de Scrapy. Appelons cette classe spider1 .
Une classe araignée a besoin de quelques informations :
importer scrapy
classe spider1(scrapy.Spider):
nom ='Wikipédia'
start_urls =['https://en.wikipedia.org/wiki/Battery_(électricité)']
def parse (soi, réponse):
passe
Un test rapide pour s'assurer que tout fonctionne correctement.
scrapy runpider spider1.py
# impressions
2017-11-23 09:09:21 [scrapy.utils.log] INFO :Scrapy 1.4.0 a démarré (bot :scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO :Paramètres remplacés :{'SPIDER_LOADER_WARN_ONLY' : True}
2017-11-23 09:09:21 [scrapy.middleware] INFO :Extensions activées :
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...
L'exécution de Scrapy avec cette classe imprime des informations de journal qui ne vous aideront pas pour le moment. Simplifions les choses en supprimant ces informations de journal en excès. Utiliser un avertissement déclaration en ajoutant du code au début du fichier.
journalisation des importations
logging.getLogger('scrapy').setLevel(logging.WARNING)
Désormais, lorsque vous exécutez à nouveau le script, les informations du journal ne s'impriment pas.
Tout sur une page Web est stocké dans des éléments HTML. Les éléments sont organisés dans le Document Object Model (DOM). Comprendre le DOM est essentiel pour tirer le meilleur parti de votre robot d'exploration Web. Un robot d'exploration Web parcourt tous les éléments HTML d'une page pour trouver des informations. Il est donc important de savoir comment ils sont organisés.
Google Chrome dispose d'outils qui vous aident à trouver plus rapidement des éléments HTML. Vous pouvez localiser le code HTML de tout élément que vous voyez sur la page Web à l'aide de l'inspecteur.
Ces étapes ouvriront la console développeur avec les éléments onglet sélectionné. Au bas de la console, vous verrez une arborescence d'éléments. Cet arbre est la façon dont vous obtiendrez des informations pour votre script.
Laissons le script faire un peu de travail pour nous ; Une simple analyse pour obtenir le texte du titre de la page Web.
Démarrez le script en ajoutant du code au parse() méthode qui extrait le titre.
...
def parse (soi, réponse):
print response.css('h1#firstHeading::text').extract()
...
La réponse l'argument prend en charge une méthode appelée CSS() qui sélectionne des éléments de la page en utilisant l'emplacement que vous fournissez.
Dans cet exemple, l'élément est h1.firstHeading . Ajout de
::text
au script est ce qui vous donne le contenu textuel de l'élément. Enfin, le extrait() renvoie l'élément sélectionné.
L'exécution de ce script dans Scrapy imprime le titre sous forme de texte.
[u'Batterie (électricité)']
Maintenant que nous avons gratté le texte du titre, faisons plus avec le script. Le crawler va trouver le premier paragraphe après le titre et extraire cette information.
Voici l'arborescence des éléments dans la Chrome Developer Console :
div#mw-content-text>div>p
La flèche droite (>) indique une relation parent-enfant entre les éléments.
Cet emplacement renverra tous les p éléments correspondants, qui comprend la description complète. Pour obtenir le premier p élément, vous pouvez écrire ce code :
response.css('div#mw-content-text>div>p')[0]
Tout comme le titre, vous ajoutez un extracteur CSS
::text
pour obtenir le contenu textuel de l'élément.
response.css('div#mw-content-text>div>p')[0].css('::text')
L'expression finale utilise extract() pour retourner la liste. Vous pouvez utiliser Python join() fonction pour rejoindre la liste une fois que toutes les explorations sont terminées.
def parse(self, response) :
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())
Le résultat est le premier paragraphe du texte !
Une batterie électrique est un appareil composé d'une ou plusieurs cellules électrochimiques avec des connexions externes fournies pour alimenter des appareils électriques tels que des lampes de poche, des smartphones et des voitures électriques.[1] Lorsqu'une batterie fournit de l'énergie électrique, sa borne positive est
...
Scrapy peut extraire des informations sous forme de texte, ce qui est utile. Scrapy vous permet également de visualiser les données JavaScript Object Notation (JSON). JSON est un moyen pratique d'organiser les informations et est largement utilisé dans le développement Web. JSON fonctionne également très bien avec Python.
Lorsque vous avez besoin de collecter des données au format JSON, vous pouvez utiliser le yield déclaration intégrée à Scrapy.
Voici une nouvelle version du script utilisant une instruction yield. Au lieu d'obtenir le premier élément p au format texte, cela saisira tous les éléments p et les organisera au format JSON.
...
def parse (soi, réponse):
pour e dans response.css('div#mw-content-text>div>p'):
rendement { 'para' :''.join(e.css('::text').extract()).strip() }
...
Vous pouvez maintenant exécuter le spider en spécifiant un fichier JSON de sortie :
scrapy runpider spider3.py -o joe.json
Le script va maintenant imprimer tous les éléments p.
[
{"para":"Une batterie électrique est un appareil composé d'une ou plusieurs cellules électrochimiques avec des connexions externes fournies pour alimenter des appareils électriques tels que des lampes de poche, des smartphones et des voitures électriques.[1] Lorsqu'une batterie fournit de l'énergie électrique, son positif La borne est la cathode et sa borne négative est l'anode.[2] La borne marquée négative est la source d'électrons qui, lorsqu'elle est connectée à un circuit externe, circulera et fournira de l'énergie à un appareil externe.Lorsqu'une batterie est connectée à un circuit externe , les électrolytes sont capables de se déplacer sous forme d'ions à l'intérieur, permettant aux réactions chimiques de se terminer aux bornes séparées et ainsi de fournir de l'énergie au circuit externe. C'est le mouvement de ces ions à l'intérieur de la batterie qui permet au courant de sortir de la batterie pour effectuer un travail.[3] Historiquement, le terme \"batterie\" faisait spécifiquement référence à un appareil composé de plusieurs cellules, mais l'utilisation a également évolué pour inclure les appareils composés d'un seul la cellule.[4]"},
{"para":"Les piles primaires (à usage unique ou \"jetables\") sont utilisées une seule fois et jetées ; les matériaux des électrodes sont modifiés de manière irréversible pendant la décharge. Des exemples courants sont la pile alcaline utilisée pour les lampes de poche et une multitude d'appareils électroniques portables Les batteries secondaires (rechargeables) peuvent être déchargées et rechargées plusieurs
...
Jusqu'à présent, le robot d'exploration Web a récupéré le titre et un type d'élément de la page. Scrapy peut également extraire des informations de différents types d'éléments dans un seul script.
Extrayons les meilleurs succès IMDb Box Office pour un week-end. Ces informations sont extraites de http://www.imdb.com/chart/boxoffice, dans un tableau avec des lignes pour chaque métrique.
Le parse() La méthode peut extraire plusieurs champs de la ligne. À l'aide des outils de développement Chrome, vous pouvez trouver les éléments imbriqués dans le tableau.
...
def parse (soi, réponse):
pour e dans response.css('div#boxoffice>table>tbody>tr'):
rendement {
'title' :''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'week-end' :''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross' :''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks' :''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image' :e.css('td.posterColumn img::attr(src)').extract_first(),
}
...
L'image le sélecteur spécifie que img est un descendant de td.posterColumn . Pour extraire le bon attribut, utilisez l'expression ::attr(src)
.
L'exécution de l'araignée renvoie JSON :
[
{"gross":"$93.8M", "weeks":"1", "weekend":"$93.8M", "image":"https://images-na.ssl-images-amazon.com/images/ M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg", "title":"Justice League"},
{"gross":"$27.5M", "weeks":"1", "weekend":"$27.5M", "image":"https://images-na.ssl-images-amazon.com/images/ M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg", "titre":"Merveille"},
{"gross":"$247.3M", "weeks":"3", "weekend":"$21.7M", "image":"https://images-na.ssl-images-amazon.com/images/ M/MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI@._V1_UY67_CR0,0,45,67_AL_.jpg", "title":"Thor :Ragnarok"},
...
]
Scrapy est une bibliothèque détaillée qui peut faire à peu près n'importe quel type d'exploration Web que vous lui demandez. Lorsqu'il s'agit de trouver des informations dans des éléments HTML, combinés au support de Python, il est difficile de faire mieux. Que vous construisiez un robot d'exploration Web ou que vous appreniez les bases du scraping Web, la seule limite est ce que vous êtes prêt à apprendre.
Si vous cherchez d'autres moyens de créer des robots d'exploration ou des bots, vous pouvez essayer de créer des bots Twitter et Instagram à l'aide de Python. Python peut créer des choses incroyables dans le développement Web, il vaut donc la peine d'aller au-delà des robots d'exploration Web lors de l'exploration de ce langage.