Comment créer un robot d’exploration Web de base pour extraire des informations d’un site Web
Les programmes qui lisent des informations à partir de sites Web ou de robots d’exploration Web ont une variété d’applications utiles. Vous pouvez obtenir des informations boursières, des résultats sportifs, des SMS depuis votre compte Twitter ou obtenir des prix sur des sites commerciaux.
L’écriture de ces robots 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.
Installer Scrapy
Scrapy est une bibliothèque Python pour gratter le Web et créer des robots d’exploration Web. C’est rapide, simple et surfe sur plusieurs pages Web sans effort.
Scrapy est disponible via la bibliothèque Pip Installs Python (PIP), voici un rappel sur la façon d’installer PIP sur Windows, Mac et Linux.
L’utilisation d’un environnement virtuel Python est préférable car elle vous permet d’installer Scrapy dans un répertoire virtuel sans utiliser vos fichiers système séparément. La documentation de Scrapy recommande de le faire pour de meilleurs résultats.
Créez un répertoire et initialisez l’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 de la commande PIP.
pip installer scrapy
Une vérification rapide pour s’assurer que Scrapy est correctement installé
rayure
# imprimer
Scrapy 1.4.0 – Aucun projet actif
usage:
rayure <命令> [options] [args]
Commandes disponibles :
banc pour effectuer un benchmark rapide
Obtenez l’URL à l’aide du téléchargeur Scrapy
genspider génère de nouvelles araignées à l’aide de modèles prédéfinis
runspider exécute une araignée autonome (sans créer de projet)
…
Faire une vidéo du jour
Comment créer un robot d’exploration Web
Maintenant que l’environnement est prêt, vous pouvez commencer à créer votre robot d’exploration Web. Prenons quelques informations sur la page Wikipedia sur les batteries : https://en.wikipedia.org/wiki/Battery_(électricité).
La première étape de l’écriture d’un crawler consiste à définir une classe Python qui commence par Scrapy.SpiderCela vous donne accès à toutes les fonctionnalités et fonctionnalités de Scrapy.Appelons cette classe araignée 1.
La classe araignée a besoin de quelques informations :
- Une sorte de Nom utilisé pour identifier les araignées
- Une sorte de URL de démarrage Une variable contenant une liste d’URL à récupérer (les URL Wikipédia seront des exemples dans ce tutoriel)
- Une sorte de analyser () Procédé de traitement de pages web pour extraire des informations
importer scrapy
Classe Araignée 1 (scrapy.Spider):
nom= »Wikipédia »
URL de démarrage = [‘https://en.wikipedia.org/wiki/Battery_(electricity)’]
def parse (soi, réponse):
traverser
Un test rapide pour s’assurer que tout fonctionne correctement.
spider1.py de runpider grattant
# imprimer
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 : Remplacer les paramètres : {‘SPIDER_LOADER_WARN_ONLY’ : Vrai}
2017-11-23 09:09:21 [scrapy.middleware] Info : Extensions activées :
[‘scrapy.extensions.memusage.MemoryUsage’,
‘scrapy.extensions.logstats.LogStats’,
…
Turning Off Logging
Running Scrapy with this class prints log information that won’t help you right now. Let’s make it simple by removing this excess log information. Use a warning statement by adding code to the beginning of the file.
import logging
logging.getLogger(‘scrapy’).setLevel(logging.WARNING)
Now when you run the script again, the log information will not print.
Using the Chrome Inspector
Everything on a web page is stored in HTML elements. The elements are arranged in the Document Object Model (DOM). Understanding the DOM is critical to getting the most out of your web crawler. A web crawler searches through all of the HTML elements on a page to find information, so knowing how they’re arranged is important.
Google Chrome has tools that help you find HTML elements faster. You can locate the HTML for any element you see on the web page using the inspector.
- Navigate to a page in Chrome
- Place the mouse on the element you would like to view
- Right-click and select Inspect from the menu
These steps will open the developer console with the Elements tab selected. At the bottom of the console, you will see a tree of elements. This tree is how you will get information for your script.
Let’s get the script to do some work for us; A simple crawl to get the title text of the web page.
Start the script by adding some code to the parse() method that extracts the title.
…
def parse(self, response):
print response.css(‘h1#firstHeading::text’).extract()
…
The response argument supports a method called CSS() that selects elements from the page using the location you provide.
In this example, the element is h1.firstHeading. Adding
::text
to the script is what gives you the text content of the element. Finally, the extract() method returns the selected element.
Running this script in Scrapy prints the title in text form.
[u’Battery (electricity)’]
Rechercher des instructions
Maintenant que nous avons gratté le texte de l’en-tête, faisons un peu plus avec le script. Le crawler trouvera le premier paragraphe après le titre et extraira ces informations.
Voici l’arborescence des éléments dans la Chrome Developer Console :
div#mw-content-text>div>p
La flèche droite (>) indique la relation parent-enfant entre les éléments.
Cet emplacement renverra tous p Éléments correspondants, y compris la description complète.pour obtenir le premier p Vous pouvez écrire un élément du code suivant :
réponse.css(‘div#mw-content-text>div>p’)[0]
Tout comme le titre, ajoutez l’extracteur CSS
::texte
Récupère le contenu textuel de l’élément.
réponse.css(‘div#mw-content-text>div>p’)[0].css(‘::text’)
L’expression finale utilise raffinage() Retour à la liste. vous pouvez utiliser python se joindre à() Toutes les fonctions qui sont ajoutées à la liste une fois l’exploration terminée.
def parse (soi, réponse):
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 est un appareil composé d’une ou plusieurs cellules électrochimiques avec des connexions externes qui sont utilisées pour alimenter des appareils électroniques tels que des lampes de poche, des smartphones et des véhicules électriques.[1] Lorsque la batterie est alimentée, son pôle positif est
…
Collecter des données JSON
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 compact d’organiser les informations et est largement utilisé dans le développement Web. JSON fonctionne également bien avec Python.
Lorsque vous avez besoin de collecter des données au format JSON, vous pouvez utiliser rendement Déclarations intégrées à Scrapy.
Il s’agit d’une nouvelle version du script qui utilise l’instruction yield. Cela obtiendra tous les éléments p et les organisera au format JSON au lieu d’obtenir le premier élément p au format texte.
…
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 imprimera maintenant tous les éléments p.
[
{« para »: « An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] Lorsque la batterie est alimentée, le pôle positif est le pôle positif et le pôle négatif est le pôle négatif.[2] La borne marquée négative est la source d’électrons qui, lorsqu’elle est connectée à un circuit externe, circulera et transférera de l’énergie au dispositif externe. Lorsque la batterie est connectée à un circuit externe, l’électrolyte est capable de se déplacer à l’intérieur sous forme d’ions, ce qui permet de réaliser des réactions chimiques à des bornes séparées pour transférer de l’énergie vers le circuit externe. C’est le mouvement de ces ions à l’intérieur de la batterie qui fait sortir le courant de la batterie pour effectuer le travail.[3] Historiquement, le terme « batterie » faisait spécifiquement référence aux appareils constitués de plusieurs cellules, mais son utilisation a encore évolué pour inclure les appareils constitués d’une seule cellule.[4] »},
{« para »: « Les piles primaires (jetables ou « jetables ») sont jetées après une utilisation ; le matériau de l’électrode change de manière irréversible pendant la décharge. Des exemples courants sont les piles alcalines utilisées dans les lampes de poche et un grand nombre d’appareils électroniques portables. Secondaire (rechargeable) les batteries peuvent être déchargées et rechargées plusieurs fois
…
Saisissez plusieurs éléments
Jusqu’à présent, les robots d’exploration Web ont récupéré le titre et un élément de la page. Scrapy peut également extraire des informations de différents types d’éléments dans un script.
Extrayons les succès du box-office IMDb d’un week-end. Ces informations ont été extraites de http://www.imdb.com/chart/boxoffice et le tableau contient une ligne pour chaque métrique.
cette analyser () La méthode peut extraire plusieurs champs d’une ligne. À l’aide des outils de développement Chrome, vous pouvez rechercher des éléments imbriqués dans des tableaux.
…
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(),
‘total’ : ».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(),
}
…
cette image sélecteur spécifié image Oui td.posterColonne. Pour extraire l’attribut correct, 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 », « title »: « Wonder »},
{« 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 »},
…
]
Plus de robots d’exploration Web et de bots
Scrapy est une bibliothèque détaillée qui peut effectuer tout type de grattage Web que vous demandez. Lorsqu’il s’agit de trouver des informations dans des éléments HTML, plus le support de Python, c’est imbattable. Que vous construisiez un robot d’exploration Web ou que vous appreniez les bases du grattage Web, la seule limite est ce que vous êtes prêt à apprendre.
Si vous cherchez d’autres façons de créer des crawlers ou des bots, vous pouvez essayer de créer des bots Twitter et Instagram en Python. Python peut créer des choses incroyables dans le développement Web, il vaut donc la peine de regarder au-delà des robots d’exploration Web lors de l’exploration de ce langage.
…