Scraping Web Python - Guide rapide
Le scraping Web est un processus automatique d'extraction d'informations à partir du Web. Ce chapitre vous donnera une idée approfondie du web scraping, sa comparaison avec l'exploration web et pourquoi vous devriez opter pour le web scraping. Vous découvrirez également les composants et le fonctionnement d'un grattoir Web.
Qu'est-ce que le Web Scraping?
Le sens du dictionnaire du mot «mise au rebut» implique d'obtenir quelque chose sur le Web. Ici, deux questions se posent: ce que nous pouvons obtenir du Web et comment l'obtenir.
La réponse à la première question est ‘data’. Les données sont indispensables pour tout programmeur et l'exigence de base de tout projet de programmation est la grande quantité de données utiles.
La réponse à la deuxième question est un peu délicate, car il existe de nombreuses façons d'obtenir des données. En général, nous pouvons obtenir des données à partir d'une base de données ou d'un fichier de données et d'autres sources. Mais que faire si nous avons besoin d'une grande quantité de données disponibles en ligne? Une façon d'obtenir ce type de données consiste à rechercher manuellement (en cliquant dans un navigateur Web) et à enregistrer (copier-coller dans une feuille de calcul ou un fichier) les données requises. Cette méthode est assez fastidieuse et prend du temps. Une autre façon d'obtenir de telles données consiste à utiliserweb scraping.
Web scraping, aussi appelé web data mining ou web harvesting, est le processus de construction d'un agent capable d'extraire, d'analyser, de télécharger et d'organiser automatiquement des informations utiles du Web. En d'autres termes, nous pouvons dire qu'au lieu de sauvegarder manuellement les données des sites Web, le logiciel de scraping Web chargera et extraira automatiquement les données de plusieurs sites Web selon nos besoins.
Origine du Web Scraping
L'origine du scraping Web est la mise au rebut d'écran, qui a été utilisée pour intégrer des applications non basées sur le Web ou des applications Windows natives. À l'origine, le grattage d'écran était utilisé avant la large utilisation du World Wide Web (WWW), mais il ne pouvait pas étendre le WWW. Cela a rendu nécessaire l'automatisation de l'approche du grattage d'écran et de la technique appelée‘Web Scraping’ est venu au monde.
Analyse Web v / s Web Scraping
Les termes Web Crawling et Scraping sont souvent utilisés de manière interchangeable car leur concept de base est d'extraire des données. Cependant, ils sont différents les uns des autres. Nous pouvons comprendre la différence fondamentale de leurs définitions.
L'exploration Web est essentiellement utilisée pour indexer les informations sur la page à l'aide de robots aka crawlers. Il est également appeléindexing. D'autre part, le web scraping est un moyen automatisé d'extraire les informations à l'aide de bots aka scrapers. Il est également appelédata extraction.
Pour comprendre la différence entre ces deux termes, regardons le tableau de comparaison ci-dessous -
Exploration Web | Grattage Web |
---|---|
Désigne le téléchargement et le stockage du contenu d'un grand nombre de sites Web. | Se réfère à l'extraction d'éléments de données individuels du site Web à l'aide d'une structure spécifique au site. |
Fait principalement à grande échelle. | Peut être mis en œuvre à n'importe quelle échelle. |
Donne des informations génériques. | Donne des informations spécifiques. |
Utilisé par les principaux moteurs de recherche comme Google, Bing, Yahoo. Googlebot est un exemple de robot d'exploration Web. | Les informations extraites à l'aide du web scraping peuvent être utilisées pour se répliquer dans un autre site Web ou peuvent être utilisées pour effectuer une analyse de données. Par exemple, les éléments de données peuvent être des noms, une adresse, un prix, etc. |
Utilisations du Web Scraping
Les utilisations et les raisons d'utiliser le web scraping sont aussi infinies que les utilisations du World Wide Web. Les racleurs Web peuvent faire n'importe quoi comme commander de la nourriture en ligne, scanner un site Web d'achat en ligne pour vous et acheter un billet pour un match au moment où ils sont disponibles, etc. Certaines des utilisations importantes du web scraping sont discutées ici -
E-commerce Websites - Les web scrapers peuvent collecter les données spécialement liées au prix d'un produit spécifique à partir de divers sites de commerce électronique pour leur comparaison.
Content Aggregators - Le scraping Web est largement utilisé par les agrégateurs de contenu tels que les agrégateurs de nouvelles et les agrégateurs d'emplois pour fournir des données mises à jour à leurs utilisateurs.
Marketing and Sales Campaigns - Les web scrapers peuvent être utilisés pour obtenir des données telles que des e-mails, un numéro de téléphone, etc. pour les campagnes de vente et de marketing.
Search Engine Optimization (SEO) - Le scraping Web est largement utilisé par les outils de référencement comme SEMRush, Majestic, etc. pour indiquer aux entreprises comment elles se classent pour les mots-clés de recherche qui leur importent.
Data for Machine Learning Projects - La récupération des données pour les projets d'apprentissage automatique dépend du web scraping.
Data for Research - Les chercheurs peuvent collecter des données utiles aux fins de leurs travaux de recherche en économisant leur temps grâce à ce processus automatisé.
Composants d'un Web Scraper
Un racleur de bande se compose des composants suivants -
Module de robot d'exploration Web
Un composant très nécessaire de Web Scraper, le module de robot d'exploration Web, est utilisé pour naviguer sur le site Web cible en faisant une requête HTTP ou HTTPS aux URL. Le robot télécharge les données non structurées (contenu HTML) et les transmet à l'extracteur, le module suivant.
Extracteur
L'extracteur traite le contenu HTML récupéré et extrait les données dans un format semi-structuré. Ceci est également appelé module d'analyseur et utilise différentes techniques d'analyse telles que l'expression régulière, l'analyse HTML, l'analyse DOM ou l'intelligence artificielle pour son fonctionnement.
Module de transformation et de nettoyage des données
Les données extraites ci-dessus ne conviennent pas pour une utilisation immédiate. Il doit passer par un module de nettoyage pour que nous puissions l'utiliser. Les méthodes telles que la manipulation de chaînes ou l'expression régulière peuvent être utilisées à cette fin. Notez que l'extraction et la transformation peuvent également être effectuées en une seule étape.
Module de stockage
Après avoir extrait les données, nous devons les stocker selon nos besoins. Le module de stockage sortira les données dans un format standard qui peut être stocké dans une base de données ou au format JSON ou CSV.
Fonctionnement d'un Web Scraper
Web Scraper peut être défini comme un logiciel ou un script utilisé pour télécharger le contenu de plusieurs pages Web et en extraire des données.
Nous pouvons comprendre le fonctionnement d'un grattoir Web en étapes simples, comme indiqué dans le diagramme ci-dessus.
Étape 1: Téléchargement de contenu à partir de pages Web
Dans cette étape, un racleur Web téléchargera le contenu demandé à partir de plusieurs pages Web.
Étape 2: extraction des données
Les données sur les sites Web sont en HTML et pour la plupart non structurées. Par conséquent, dans cette étape, Web Scraper analysera et extraira les données structurées du contenu téléchargé.
Étape 3: stockage des données
Ici, un racleur Web stockera et enregistrera les données extraites dans l'un des formats tels que CSV, JSON ou dans une base de données.
Étape 4: Analyse des données
Une fois toutes ces étapes effectuées avec succès, le racleur de bande analysera les données ainsi obtenues.
Dans le premier chapitre, nous avons appris ce qu'est le web scraping. Dans ce chapitre, voyons comment implémenter le web scraping à l'aide de Python.
Pourquoi Python pour le Web Scraping?
Python est un outil populaire pour implémenter le web scraping. Le langage de programmation Python est également utilisé pour d'autres projets utiles liés à la cybersécurité, aux tests de pénétration ainsi qu'aux applications médico-légales numériques. En utilisant la programmation de base de Python, le web scraping peut être effectué sans utiliser aucun autre outil tiers.
Le langage de programmation Python gagne en popularité et les raisons qui font de Python un bon choix pour les projets de scraping Web sont les suivantes:
Simplicité de la syntaxe
Python a la structure la plus simple par rapport aux autres langages de programmation. Cette fonctionnalité de Python facilite les tests et un développeur peut se concentrer davantage sur la programmation.
Modules intégrés
Une autre raison d'utiliser Python pour le scraping Web est les bibliothèques utiles intégrées et externes qu'il possède. Nous pouvons effectuer de nombreuses implémentations liées au web scraping en utilisant Python comme base de programmation.
Langage de programmation Open Source
Python bénéficie d'un énorme soutien de la communauté car c'est un langage de programmation open source.
Large gamme d'applications
Python peut être utilisé pour diverses tâches de programmation allant des petits scripts shell aux applications Web d'entreprise.
Installation de Python
La distribution Python est disponible pour des plates-formes telles que Windows, MAC et Unix / Linux. Nous devons télécharger uniquement le code binaire applicable à notre plate-forme pour installer Python. Mais dans le cas où le code binaire de notre plateforme n'est pas disponible, nous devons avoir un compilateur C pour que le code source puisse être compilé manuellement.
Nous pouvons installer Python sur différentes plates-formes comme suit -
Installer Python sous Unix et Linux
Vous devez suivre les étapes ci-dessous pour installer Python sur des machines Unix / Linux -
Step 1 - Aller sur le lien https://www.python.org/downloads/
Step 2 - Téléchargez le code source compressé disponible pour Unix / Linux sur le lien ci-dessus.
Step 3 - Extrayez les fichiers sur votre ordinateur.
Step 4 - Utilisez les commandes suivantes pour terminer l'installation -
run ./configure script
make
make install
Vous pouvez trouver Python installé à l'emplacement standard /usr/local/bin et ses bibliothèques à /usr/local/lib/pythonXX, où XX est la version de Python.
Installer Python sur Windows
Vous devez suivre les étapes ci-dessous pour installer Python sur les machines Windows -
Step 1 - Aller sur le lien https://www.python.org/downloads/
Step 2 - Téléchargez le programme d'installation de Windows python-XYZ.msi fichier, où XYZ est la version que nous devons installer.
Step 3 - Maintenant, enregistrez le fichier d'installation sur votre machine locale et exécutez le fichier MSI.
Step 4 - Enfin, exécutez le fichier téléchargé pour afficher l'assistant d'installation de Python.
Installer Python sur Macintosh
Il faut utiliser Homebrew pour installer Python 3 sur Mac OS X. Homebrew est facile à installer et constitue un excellent programme d'installation.
Homebrew peut également être installé à l'aide de la commande suivante -
$ ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
Pour mettre à jour le gestionnaire de paquets, nous pouvons utiliser la commande suivante -
$ brew update
Avec l'aide de la commande suivante, nous pouvons installer Python3 sur notre machine MAC -
$ brew install python3
Configurer le PATH
Vous pouvez utiliser les instructions suivantes pour configurer le chemin sur divers environnements -
Configuration du chemin sous Unix / Linux
Utilisez les commandes suivantes pour configurer les chemins à l'aide de divers shells de commande -
Pour shell csh
setenv PATH "$PATH:/usr/local/bin/python".
Pour bash shell (Linux)
ATH="$PATH:/usr/local/bin/python".
Pour sh ou ksh shell
PATH="$PATH:/usr/local/bin/python".
Configuration du chemin sous Windows
Pour définir le chemin sur Windows, nous pouvons utiliser le chemin %path%;C:\Python à l'invite de commande, puis appuyez sur Entrée.
Exécuter Python
Nous pouvons démarrer Python en utilisant l'une des trois méthodes suivantes -
Interprète interactif
Un système d'exploitation tel que UNIX et DOS qui fournit un interpréteur de ligne de commande ou un shell peut être utilisé pour démarrer Python.
Nous pouvons commencer à coder dans l'interpréteur interactif comme suit -
Step 1 - Entrez python sur la ligne de commande.
Step 2 - Ensuite, nous pouvons commencer à coder tout de suite dans l'interpréteur interactif.
$python # Unix/Linux
or
python% # Unix/Linux
or
C:> python # Windows/DOS
Script depuis la ligne de commande
Nous pouvons exécuter un script Python en ligne de commande en appelant l'interpréteur. Il peut être compris comme suit -
$python script.py # Unix/Linux
or
python% script.py # Unix/Linux
or
C: >python script.py # Windows/DOS
Environnement de développement intégré
Nous pouvons également exécuter Python à partir d'un environnement GUI si le système dispose d'une application GUI prenant en charge Python. Certains IDE prenant en charge Python sur différentes plates-formes sont indiqués ci-dessous -
IDE for UNIX - UNIX, pour Python, a IDLE IDE.
IDE for Windows - Windows a PythonWin IDE qui a également une interface graphique.
IDE for Macintosh - Macintosh a IDLE IDE qui est téléchargeable sous forme de fichiers MacBinary ou BinHex'd depuis le site Web principal.
Dans ce chapitre, apprenons divers modules Python que nous pouvons utiliser pour le web scraping.
Environnements de développement Python utilisant virtualenv
Virtualenv est un outil pour créer des environnements Python isolés. Avec l'aide de virtualenv, nous pouvons créer un dossier contenant tous les exécutables nécessaires pour utiliser les packages requis par notre projet Python. Cela nous permet également d'ajouter et de modifier des modules Python sans accéder à l'installation globale.
Vous pouvez utiliser la commande suivante pour installer virtualenv -
(base) D:\ProgramData>pip install virtualenv
Collecting virtualenv
Downloading
https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c3
5d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl
(1.9MB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 1.9MB 86kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-16.0.0
Maintenant, nous devons créer un répertoire qui représentera le projet à l'aide de la commande suivante -
(base) D:\ProgramData>mkdir webscrap
Maintenant, entrez dans ce répertoire à l'aide de cette commande suivante -
(base) D:\ProgramData>cd webscrap
Maintenant, nous devons initialiser le dossier d'environnement virtuel de notre choix comme suit -
(base) D:\ProgramData\webscrap>virtualenv websc
Using base prefix 'd:\\programdata'
New python executable in D:\ProgramData\webscrap\websc\Scripts\python.exe
Installing setuptools, pip, wheel...done.
Maintenant, activez l'environnement virtuel avec la commande donnée ci-dessous. Une fois activé avec succès, vous verrez le nom de celui-ci sur le côté gauche entre parenthèses.
(base) D:\ProgramData\webscrap>websc\scripts\activate
Nous pouvons installer n'importe quel module dans cet environnement comme suit -
(websc) (base) D:\ProgramData\webscrap>pip install requests
Collecting requests
Downloading
https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69
c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl (9
1kB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 148kB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
Downloading
https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca
55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133
kB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 369kB/s
Collecting certifi>=2017.4.17 (from requests)
Downloading
https://files.pythonhosted.org/packages/df/f7/04fee6ac349e915b82171f8e23cee6364
4d83663b34c539f7a09aed18f9e/certifi-2018.8.24-py2.py3-none-any.whl
(147kB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 153kB 527kB/s
Collecting urllib3<1.24,>=1.21.1 (from requests)
Downloading
https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c5
3851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl (133k
B)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 517kB/s
Collecting idna<2.8,>=2.5 (from requests)
Downloading
https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746
a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 61kB 339kB/s
Installing collected packages: chardet, certifi, urllib3, idna, requests
Successfully installed certifi-2018.8.24 chardet-3.0.4 idna-2.7 requests-2.19.1
urllib3-1.23
Pour désactiver l'environnement virtuel, nous pouvons utiliser la commande suivante -
(websc) (base) D:\ProgramData\webscrap>deactivate
(base) D:\ProgramData\webscrap>
Vous pouvez voir que (websc) a été désactivé.
Modules Python pour le Web Scraping
Le scraping Web est le processus de construction d'un agent capable d'extraire, d'analyser, de télécharger et d'organiser automatiquement des informations utiles du Web. En d'autres termes, au lieu d'enregistrer manuellement les données des sites Web, le logiciel de scraping Web chargera et extraira automatiquement les données de plusieurs sites Web conformément à nos exigences.
Dans cette section, nous allons discuter des bibliothèques Python utiles pour le scraping Web.
Demandes
Il s'agit d'une simple bibliothèque de scraping Web python. Il s'agit d'une bibliothèque HTTP efficace utilisée pour accéder aux pages Web. Avec l'aide deRequests, nous pouvons obtenir le code HTML brut des pages Web qui peut ensuite être analysé pour récupérer les données. Avant d'utiliserrequests, laissez-nous comprendre son installation.
Installation des demandes
Nous pouvons l'installer soit sur notre environnement virtuel, soit sur l'installation globale. Avec l'aide depip commande, nous pouvons facilement l'installer comme suit -
(base) D:\ProgramData> pip install requests
Collecting requests
Using cached
https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69
c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl
Requirement already satisfied: idna<2.8,>=2.5 in d:\programdata\lib\sitepackages
(from requests) (2.6)
Requirement already satisfied: urllib3<1.24,>=1.21.1 in
d:\programdata\lib\site-packages (from requests) (1.22)
Requirement already satisfied: certifi>=2017.4.17 in d:\programdata\lib\sitepackages
(from requests) (2018.1.18)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in
d:\programdata\lib\site-packages (from requests) (3.0.4)
Installing collected packages: requests
Successfully installed requests-2.19.1
Exemple
Dans cet exemple, nous effectuons une requête GET HTTP pour une page Web. Pour cela, nous devons d'abord importer la bibliothèque de requêtes comme suit -
In [1]: import requests
Dans cette ligne de code suivante, nous utilisons des requêtes pour effectuer des requêtes HTTP GET pour l'url: https://authoraditiagarwal.com/ en effectuant une demande GET.
In [2]: r = requests.get('https://authoraditiagarwal.com/')
Nous pouvons maintenant récupérer le contenu en utilisant .text propriété comme suit -
In [5]: r.text[:200]
Observez que dans la sortie suivante, nous avons obtenu les 200 premiers caractères.
Out[5]: '<!DOCTYPE html>\n<html lang="en-US"\n\titemscope
\n\titemtype="http://schema.org/WebSite" \n\tprefix="og: http://ogp.me/ns#"
>\n<head>\n\t<meta charset
="UTF-8" />\n\t<meta http-equiv="X-UA-Compatible" content="IE'
Urllib3
C'est une autre bibliothèque Python qui peut être utilisée pour récupérer des données à partir d'URL similaires au requestsbibliothèque. Vous pouvez en savoir plus à ce sujet dans sa documentation technique à l'adressehttps://urllib3.readthedocs.io/en/latest/.
Installation d'Urllib3
En utilisant le pip commande, nous pouvons installer urllib3 soit dans notre environnement virtuel, soit en installation globale.
(base) D:\ProgramData>pip install urllib3
Collecting urllib3
Using cached
https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c5
3851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl
Installing collected packages: urllib3
Successfully installed urllib3-1.23
Exemple: Scraping avec Urllib3 et BeautifulSoup
Dans l'exemple suivant, nous grattons la page Web en utilisant Urllib3 et BeautifulSoup. Nous utilisonsUrllib3à la place de la bibliothèque de requêtes pour obtenir les données brutes (HTML) de la page Web. Ensuite, nous utilisonsBeautifulSoup pour analyser ces données HTML.
import urllib3
from bs4 import BeautifulSoup
http = urllib3.PoolManager()
r = http.request('GET', 'https://authoraditiagarwal.com')
soup = BeautifulSoup(r.data, 'lxml')
print (soup.title)
print (soup.title.text)
C'est la sortie que vous observerez lorsque vous exécuterez ce code -
<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal
Sélénium
Il s'agit d'une suite de tests automatisés open source pour les applications Web sur différents navigateurs et plates-formes. Ce n'est pas un outil unique mais une suite de logiciels. Nous avons des liaisons de sélénium pour Python, Java, C #, Ruby et JavaScript. Ici, nous allons effectuer du web scraping en utilisant le sélénium et ses liaisons Python. Vous pouvez en savoir plus sur Selenium avec Java sur le lien Selenium .
Les liaisons Selenium Python fournissent une API pratique pour accéder à Selenium WebDrivers comme Firefox, IE, Chrome, Remote, etc. Les versions actuelles de Python prises en charge sont 2.7, 3.5 et supérieures.
Installation de sélénium
En utilisant le pip commande, nous pouvons installer urllib3 soit dans notre environnement virtuel, soit en installation globale.
pip install selenium
Comme le sélénium nécessite un pilote pour s'interfacer avec le navigateur choisi, nous devons le télécharger. Le tableau suivant montre différents navigateurs et leurs liens pour les télécharger.
Chrome |
https://sites.google.com/a/chromium.org/ |
Edge |
https://developer.microsoft.com/ |
Firefox |
https://github.com/ |
Safari |
https://webkit.org/ |
Exemple
Cet exemple montre le scraping Web à l'aide de sélénium. Il peut également être utilisé pour des tests appelés tests de sélénium.
Après avoir téléchargé le pilote particulier pour la version spécifiée du navigateur, nous devons faire de la programmation en Python.
Tout d'abord, vous devez importer webdriver à partir du sélénium comme suit -
from selenium import webdriver
Maintenant, fournissez le chemin du pilote Web que nous avons téléchargé selon nos besoins -
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser = webdriver.Chrome(executable_path = path)
Maintenant, fournissez l'url que nous voulons ouvrir dans ce navigateur Web maintenant contrôlé par notre script Python.
browser.get('https://authoraditiagarwal.com/leadershipmanagement')
Nous pouvons également gratter un élément particulier en fournissant le xpath comme fourni dans lxml.
browser.find_element_by_xpath('/html/body').click()
Vous pouvez vérifier le navigateur, contrôlé par le script Python, pour la sortie.
Scrapy
Scrapy est un framework d'exploration Web rapide et open-source écrit en Python, utilisé pour extraire les données de la page Web à l'aide de sélecteurs basés sur XPath. Scrapy a été publié pour la première fois le 26 juin 2008 sous licence BSD, avec un jalon 1.0 publié en juin 2015. Il nous fournit tous les outils dont nous avons besoin pour extraire, traiter et structurer les données des sites Web.
Installation de Scrapy
En utilisant le pip commande, nous pouvons installer urllib3 soit dans notre environnement virtuel, soit en installation globale.
pip install scrapy
Pour une étude plus détaillée de Scrapy vous pouvez aller sur le lien Scrapy
Avec Python, nous pouvons gratter n'importe quel site Web ou des éléments particuliers d'une page Web, mais avez-vous une idée si c'est légal ou non? Avant de gratter un site Web, nous devons connaître la légalité du scraping Web. Ce chapitre expliquera les concepts liés à la légalité du web scraping.
introduction
En règle générale, si vous prévoyez d'utiliser les données récupérées à des fins personnelles, il se peut qu'il n'y ait pas de problème. Mais si vous prévoyez de republier ces données, avant de faire de même, vous devez faire une demande de téléchargement au propriétaire ou faire des recherches de base sur les politiques ainsi que sur les données que vous allez collecter.
Recherche requise avant le grattage
Si vous ciblez un site Web pour en extraire des données, nous devons comprendre son échelle et sa structure. Voici quelques-uns des fichiers que nous devons analyser avant de commencer le scraping Web.
Analyse du fichier robots.txt
En fait, la plupart des éditeurs permettent aux programmeurs d'explorer leurs sites Web dans une certaine mesure. En d'autres termes, les éditeurs souhaitent que des parties spécifiques des sites Web soient explorées. Pour définir cela, les sites Web doivent mettre des règles pour indiquer quelles parties peuvent être explorées et lesquelles ne peuvent pas l'être. Ces règles sont définies dans un fichier appelérobots.txt.
robots.txtest un fichier lisible par l'homme utilisé pour identifier les parties du site Web que les robots d'exploration sont autorisés ou non à extraire. Il n'y a pas de format standard de fichier robots.txt et les éditeurs de site Web peuvent effectuer des modifications selon leurs besoins. Nous pouvons vérifier le fichier robots.txt pour un site Web particulier en fournissant une barre oblique et robots.txt après l'URL de ce site Web. Par exemple, si nous voulons le vérifier pour Google.com, nous devons taperhttps://www.google.com/robots.txt et nous obtiendrons quelque chose comme suit -
User-agent: *
Disallow: /search
Allow: /search/about
Allow: /search/static
Allow: /search/howsearchworks
Disallow: /sdch
Disallow: /groups
Disallow: /index.html?
Disallow: /?
Allow: /?hl=
Disallow: /?hl=*&
Allow: /?hl=*&gws_rd=ssl$
and so on……..
Certaines des règles les plus courantes définies dans le fichier robots.txt d'un site Web sont les suivantes:
User-agent: BadCrawler
Disallow: /
La règle ci-dessus signifie que le fichier robots.txt demande à un robot avec BadCrawler l'agent utilisateur de ne pas explorer son site Web.
User-agent: *
Crawl-delay: 5
Disallow: /trap
La règle ci-dessus signifie que le fichier robots.txt retarde un robot d'exploration de 5 secondes entre les demandes de téléchargement de tous les user-agents pour éviter de surcharger le serveur. le/traplink essaiera de bloquer les robots malveillants qui suivent des liens non autorisés. Il existe de nombreuses autres règles qui peuvent être définies par l'éditeur du site Web selon leurs besoins. Certains d'entre eux sont discutés ici -
Analyse des fichiers Sitemap
Que devez-vous faire si vous souhaitez explorer un site Web pour obtenir des informations à jour? Vous explorerez chaque page Web pour obtenir ces informations mises à jour, mais cela augmentera le trafic du serveur de ce site Web particulier. C'est pourquoi les sites Web fournissent des fichiers de plan du site pour aider les robots d'exploration à localiser le contenu mis à jour sans avoir à explorer chaque page Web. La norme Sitemap est définie àhttp://www.sitemaps.org/protocol.html.
Contenu du fichier Sitemap
Ce qui suit est le contenu du fichier plan du site de https://www.microsoft.com/robots.txt qui est découvert dans le fichier robot.txt -
Sitemap: https://www.microsoft.com/en-us/explore/msft_sitemap_index.xml
Sitemap: https://www.microsoft.com/learning/sitemap.xml
Sitemap: https://www.microsoft.com/en-us/licensing/sitemap.xml
Sitemap: https://www.microsoft.com/en-us/legal/sitemap.xml
Sitemap: https://www.microsoft.com/filedata/sitemaps/RW5xN8
Sitemap: https://www.microsoft.com/store/collections.xml
Sitemap: https://www.microsoft.com/store/productdetailpages.index.xml
Sitemap: https://www.microsoft.com/en-us/store/locations/store-locationssitemap.xml
Le contenu ci-dessus montre que le plan du site répertorie les URL sur le site Web et permet en outre à un webmaster de spécifier des informations supplémentaires telles que la date de la dernière mise à jour, le changement de contenu, l'importance de l'URL par rapport aux autres, etc. sur chaque URL.
Quelle est la taille du site Web?
La taille d'un site Web, c'est-à-dire le nombre de pages Web d'un site Web, affecte-t-elle la façon dont nous explorons? Oui, certainement. Parce que si nous avons moins de pages Web à explorer, l'efficacité ne serait pas un problème sérieux, mais supposons que si notre site Web comporte des millions de pages Web, par exemple Microsoft.com, le téléchargement de chaque page Web de manière séquentielle prendrait plusieurs mois et alors l'efficacité serait un problème sérieux.
Vérification de la taille du site Web
En vérifiant la taille du résultat du robot d'exploration de Google, nous pouvons avoir une estimation de la taille d'un site Web. Notre résultat peut être filtré en utilisant le mot-clésitetout en effectuant la recherche Google. Par exemple, estimer la taille dehttps://authoraditiagarwal.com/ est donné ci-dessous -
Vous pouvez voir qu'il y a environ 60 résultats, ce qui signifie que ce n'est pas un gros site Web et que l'exploration ne poserait pas de problème d'efficacité.
Quelle technologie est utilisée par le site Web?
Une autre question importante est de savoir si la technologie utilisée par le site Web affecte la façon dont nous explorons? Oui, cela affecte. Mais comment vérifier la technologie utilisée par un site Web? Il existe une bibliothèque Python nomméebuiltwith avec l'aide de laquelle nous pouvons découvrir la technologie utilisée par un site Web.
Exemple
Dans cet exemple, nous allons vérifier la technologie utilisée par le site Web https://authoraditiagarwal.com avec l'aide de la bibliothèque Python builtwith. Mais avant d'utiliser cette bibliothèque, nous devons l'installer comme suit -
(base) D:\ProgramData>pip install builtwith
Collecting builtwith
Downloading
https://files.pythonhosted.org/packages/9b/b8/4a320be83bb3c9c1b3ac3f9469a5d66e0
2918e20d226aa97a3e86bddd130/builtwith-1.3.3.tar.gz
Requirement already satisfied: six in d:\programdata\lib\site-packages (from
builtwith) (1.10.0)
Building wheels for collected packages: builtwith
Running setup.py bdist_wheel for builtwith ... done
Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\2b\00\c2\a96241e7fe520e75093898b
f926764a924873e0304f10b2524
Successfully built builtwith
Installing collected packages: builtwith
Successfully installed builtwith-1.3.3
Maintenant, en suivant une simple ligne de codes, nous pouvons vérifier la technologie utilisée par un site Web particulier -
In [1]: import builtwith
In [2]: builtwith.parse('http://authoraditiagarwal.com')
Out[2]:
{'blogs': ['PHP', 'WordPress'],
'cms': ['WordPress'],
'ecommerce': ['WooCommerce'],
'font-scripts': ['Font Awesome'],
'javascript-frameworks': ['jQuery'],
'programming-languages': ['PHP'],
'web-servers': ['Apache']}
Qui est le propriétaire du site Web?
Le propriétaire du site Web est également important, car si le propriétaire est connu pour avoir bloqué les robots d'exploration, les robots d'exploration doivent faire attention lorsqu'ils récupèrent les données du site Web. Il existe un protocole nomméWhois avec l'aide duquel nous pouvons nous renseigner sur le propriétaire du site Web.
Exemple
Dans cet exemple, nous allons vérifier le propriétaire du site Web, disons microsoft.com à l'aide de Whois. Mais avant d'utiliser cette bibliothèque, nous devons l'installer comme suit -
(base) D:\ProgramData>pip install python-whois
Collecting python-whois
Downloading
https://files.pythonhosted.org/packages/63/8a/8ed58b8b28b6200ce1cdfe4e4f3bbc8b8
5a79eef2aa615ec2fef511b3d68/python-whois-0.7.0.tar.gz (82kB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 164kB/s
Requirement already satisfied: future in d:\programdata\lib\site-packages (from
python-whois) (0.16.0)
Building wheels for collected packages: python-whois
Running setup.py bdist_wheel for python-whois ... done
Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\06\cb\7d\33704632b0e1bb64460dc2b
4dcc81ab212a3d5e52ab32dc531
Successfully built python-whois
Installing collected packages: python-whois
Successfully installed python-whois-0.7.0
Maintenant, en suivant une simple ligne de codes, nous pouvons vérifier la technologie utilisée par un site Web particulier -
In [1]: import whois
In [2]: print (whois.whois('microsoft.com'))
{
"domain_name": [
"MICROSOFT.COM",
"microsoft.com"
],
-------
"name_servers": [
"NS1.MSFT.NET",
"NS2.MSFT.NET",
"NS3.MSFT.NET",
"NS4.MSFT.NET",
"ns3.msft.net",
"ns1.msft.net",
"ns4.msft.net",
"ns2.msft.net"
],
"emails": [
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
],
}
Analyser une page Web signifie comprendre sa structure. Maintenant, la question se pose de savoir pourquoi il est important pour le web scraping? Dans ce chapitre, comprenons cela en détail.
Analyse de page Web
L'analyse de page Web est importante car sans analyse, nous ne sommes pas en mesure de savoir sous quelle forme nous allons recevoir les données (structurées ou non) de cette page Web après l'extraction. Nous pouvons effectuer une analyse de page Web de la manière suivante -
Affichage de la source de la page
C'est un moyen de comprendre comment une page Web est structurée en examinant son code source. Pour mettre en œuvre cela, nous devons faire un clic droit sur la page, puis sélectionner leView page sourceoption. Ensuite, nous obtiendrons les données qui nous intéressent à partir de cette page Web sous forme de HTML. Mais la principale préoccupation concerne les espaces et le formatage qui nous est difficile à formater.
Inspection de la source de la page en cliquant sur l'option Inspecter l'élément
C'est une autre façon d'analyser la page Web. Mais la différence est que cela résoudra le problème du formatage et des espaces dans le code source de la page Web. Vous pouvez l'implémenter en cliquant avec le bouton droit de la souris, puis en sélectionnant leInspect ou Inspect elementoption du menu. Il fournira des informations sur une zone ou un élément particulier de cette page Web.
Différentes façons d'extraire des données d'une page Web
Les méthodes suivantes sont principalement utilisées pour extraire des données d'une page Web -
Expression régulière
Il s'agit d'un langage de programmation hautement spécialisé intégré à Python. Nous pouvons l'utiliser à traversremodule de Python. Il est également appelé RE ou regexes ou modèles regex. À l'aide d'expressions régulières, nous pouvons spécifier certaines règles pour l'ensemble possible de chaînes que nous voulons faire correspondre à partir des données.
Si vous souhaitez en savoir plus sur les expressions régulières en général, accédez au lien https://www.tutorialspoint.com/automata_theory/regular_expressions.htmet si vous souhaitez en savoir plus sur le module re ou l'expression régulière en Python, vous pouvez suivre le lien https://www.tutorialspoint.com/python/python_reg_expressions.htm .
Exemple
Dans l'exemple suivant, nous allons extraire des données sur l'Inde de http://example.webscraping.com après avoir fait correspondre le contenu de <td> à l'aide d'une expression régulière.
import re
import urllib.request
response =
urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('<td class="w2p_fw">(.*?)</td>',text)
Production
La sortie correspondante sera comme indiqué ici -
[
'<img src="/places/static/images/flags/in.png" />',
'3,287,590 square kilometres',
'1,173,108,018',
'IN',
'India',
'New Delhi',
'<a href="/places/default/continent/AS">AS</a>',
'.in',
'INR',
'Rupee',
'91',
'######',
'^(\\d{6})$',
'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
'<div>
<a href="/places/default/iso/CN">CN </a>
<a href="/places/default/iso/NP">NP </a>
<a href="/places/default/iso/MM">MM </a>
<a href="/places/default/iso/BT">BT </a>
<a href="/places/default/iso/PK">PK </a>
<a href="/places/default/iso/BD">BD </a>
</div>'
]
Notez que dans la sortie ci-dessus, vous pouvez voir les détails sur le pays Inde en utilisant une expression régulière.
Belle soupe
Supposons que nous voulions collecter tous les hyperliens d'une page Web, nous pouvons alors utiliser un analyseur appelé BeautifulSoup qui peut être connu plus en détail à https://www.crummy.com/software/BeautifulSoup/bs4/doc/.En termes simples, BeautifulSoup est une bibliothèque Python permettant d'extraire des données de fichiers HTML et XML. Il peut être utilisé avec des requêtes, car il a besoin d'une entrée (document ou url) pour créer un objet soupe car il ne peut pas récupérer une page Web par lui-même. Vous pouvez utiliser le script Python suivant pour rassembler le titre de la page Web et les hyperliens.
Installer une belle soupe
En utilisant le pip commande, nous pouvons installer beautifulsoup soit dans notre environnement virtuel, soit en installation globale.
(base) D:\ProgramData>pip install bs4
Collecting bs4
Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
Running setup.py bdist_wheel for bs4 ... done
Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1
Exemple
Notez que dans cet exemple, nous étendons l'exemple ci-dessus implémenté avec le module Python de requêtes. nous utilisonsr.text pour créer un objet soupe qui sera ensuite utilisé pour récupérer des détails comme le titre de la page Web.
Tout d'abord, nous devons importer les modules Python nécessaires -
import requests
from bs4 import BeautifulSoup
Dans cette ligne de code suivante, nous utilisons des requêtes pour effectuer des requêtes HTTP GET pour l'url: https://authoraditiagarwal.com/ en effectuant une demande GET.
r = requests.get('https://authoraditiagarwal.com/')
Nous devons maintenant créer un objet Soup comme suit -
soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)
Production
La sortie correspondante sera comme indiqué ici -
<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal
Lxml
Une autre bibliothèque Python dont nous allons discuter pour le web scraping est lxml. Il s'agit d'une bibliothèque d'analyse HTML et XML haute performance. C'est relativement rapide et simple. Vous pouvez en savoir plus surhttps://lxml.de/.
Installation de lxml
En utilisant la commande pip, nous pouvons installer lxml soit dans notre environnement virtuel, soit en installation globale.
(base) D:\ProgramData>pip install lxml
Collecting lxml
Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5
Exemple: extraction de données à l'aide de lxml et de requêtes
Dans l'exemple suivant, nous récupérons un élément particulier de la page Web à partir de authoraditiagarwal.com en utilisant lxml et les requêtes -
Tout d'abord, nous devons importer les requêtes et le code HTML de la bibliothèque lxml comme suit -
import requests
from lxml import html
Nous devons maintenant fournir l'URL de la page Web à supprimer
url = 'https://authoraditiagarwal.com/leadershipmanagement/'
Maintenant, nous devons fournir le chemin (Xpath) à un élément particulier de cette page Web -
path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content())
Production
La sortie correspondante sera comme indiqué ici -
The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical
axis represents the hours remaining to complete the committed work.
Dans les chapitres précédents, nous avons appris à extraire les données de pages Web ou à faire du scraping Web par divers modules Python. Dans ce chapitre, examinons différentes techniques pour traiter les données qui ont été grattées.
introduction
Pour traiter les données qui ont été grattées, nous devons stocker les données sur notre machine locale dans un format particulier comme une feuille de calcul (CSV), JSON ou parfois dans des bases de données comme MySQL.
Traitement des données CSV et JSON
Tout d'abord, nous allons écrire les informations, après avoir récupéré une page Web, dans un fichier CSV ou une feuille de calcul. Comprenons d'abord à travers un exemple simple dans lequel nous allons d'abord saisir les informations en utilisantBeautifulSoup module, comme précédemment, puis en utilisant le module Python CSV, nous écrirons ces informations textuelles dans un fichier CSV.
Tout d'abord, nous devons importer les bibliothèques Python nécessaires comme suit -
import requests
from bs4 import BeautifulSoup
import csv
Dans cette ligne de code suivante, nous utilisons des requêtes pour effectuer des requêtes HTTP GET pour l'url: https://authoraditiagarwal.com/ en effectuant une demande GET.
r = requests.get('https://authoraditiagarwal.com/')
Maintenant, nous devons créer un objet Soup comme suit -
soup = BeautifulSoup(r.text, 'lxml')
Maintenant, avec l'aide des prochaines lignes de code, nous allons écrire les données saisies dans un fichier CSV nommé dataprocessing.csv.
f = csv.writer(open(' dataprocessing.csv ','w'))
f.writerow(['Title'])
f.writerow([soup.title.text])
Après avoir exécuté ce script, les informations textuelles ou le titre de la page Web seront enregistrés dans le fichier CSV mentionné ci-dessus sur votre ordinateur local.
De même, nous pouvons enregistrer les informations collectées dans un fichier JSON. Ce qui suit est un script Python facile à comprendre pour faire la même chose dans laquelle nous récupérons les mêmes informations que dans le dernier script Python, mais cette fois, les informations récupérées sont enregistrées dans JSONfile.txt en utilisant le module JSON Python.
import requests
from bs4 import BeautifulSoup
import csv
import json
r = requests.get('https://authoraditiagarwal.com/')
soup = BeautifulSoup(r.text, 'lxml')
y = json.dumps(soup.title.text)
with open('JSONFile.txt', 'wt') as outfile:
json.dump(y, outfile)
Après avoir exécuté ce script, les informations saisies, c'est-à-dire le titre de la page Web, seront enregistrées dans le fichier texte mentionné ci-dessus sur votre machine locale.
Traitement des données à l'aide d'AWS S3
Parfois, nous souhaitons enregistrer des données récupérées dans notre stockage local à des fins d'archivage. Mais que se passe-t-il si nous devons stocker et analyser ces données à grande échelle? La réponse est un service de stockage cloud nommé Amazon S3 ou AWS S3 (Simple Storage Service). Fondamentalement, AWS S3 est un stockage d'objets conçu pour stocker et récupérer n'importe quelle quantité de données de n'importe où.
Nous pouvons suivre les étapes suivantes pour stocker des données dans AWS S3 -
Step 1- Nous avons d'abord besoin d'un compte AWS qui nous fournira les clés secrètes à utiliser dans notre script Python lors du stockage des données. Cela créera un compartiment S3 dans lequel nous pourrons stocker nos données.
Step 2 - Ensuite, nous devons installer boto3Bibliothèque Python pour accéder au compartiment S3. Il peut être installé à l'aide de la commande suivante -
pip install boto3
Step 3 - Ensuite, nous pouvons utiliser le script Python suivant pour récupérer les données de la page Web et les enregistrer dans le compartiment AWS S3.
Tout d'abord, nous devons importer des bibliothèques Python pour le scraping, ici nous travaillons avec requests, et boto3 enregistrement des données dans le compartiment S3.
import requests
import boto3
Nous pouvons maintenant extraire les données de notre URL.
data = requests.get("Enter the URL").text
Maintenant, pour stocker des données dans le compartiment S3, nous devons créer un client S3 comme suit -
s3 = boto3.client('s3')
bucket_name = "our-content"
La prochaine ligne de code créera le compartiment S3 comme suit -
s3.create_bucket(Bucket = bucket_name, ACL = 'public-read')
s3.put_object(Bucket = bucket_name, Key = '', Body = data, ACL = "public-read")
Vous pouvez maintenant vérifier le bucket avec le nom our-content à partir de votre compte AWS.
Traitement des données avec MySQL
Apprenons à traiter les données avec MySQL. Si vous souhaitez en savoir plus sur MySQL, vous pouvez suivre le lienhttps://www.tutorialspoint.com/mysql/.
À l'aide des étapes suivantes, nous pouvons extraire et traiter les données dans la table MySQL -
Step 1- Tout d'abord, en utilisant MySQL, nous devons créer une base de données et une table dans lesquelles nous voulons enregistrer nos données récupérées. Par exemple, nous créons la table avec la requête suivante -
CREATE TABLE Scrap_pages (id BIGINT(7) NOT NULL AUTO_INCREMENT,
title VARCHAR(200), content VARCHAR(10000),PRIMARY KEY(id));
Step 2- Ensuite, nous devons gérer Unicode. Notez que MySQL ne gère pas l'Unicode par défaut. Nous devons activer cette fonctionnalité à l'aide des commandes suivantes qui changeront le jeu de caractères par défaut pour la base de données, pour la table et pour les deux colonnes -
ALTER DATABASE scrap CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CHANGE title title VARCHAR(200) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE pages CHANGE content content VARCHAR(10000) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Step 3- Maintenant, intégrez MySQL avec Python. Pour cela, nous aurons besoin de PyMySQL qui peut être installé à l'aide de la commande suivante
pip install PyMySQL
Step 4- Maintenant, notre base de données nommée Scrap, créée plus tôt, est prête à enregistrer les données, après avoir été extraites du Web, dans la table nommée Scrap_pages. Ici, dans notre exemple, nous allons extraire des données de Wikipédia et elles seront enregistrées dans notre base de données.
Tout d'abord, nous devons importer les modules Python requis.
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import pymysql
import re
Maintenant, établissez une connexion, c'est-à-dire intégrez cela avec Python.
conn = pymysql.connect(host='127.0.0.1',user='root', passwd = None, db = 'mysql',
charset = 'utf8')
cur = conn.cursor()
cur.execute("USE scrap")
random.seed(datetime.datetime.now())
def store(title, content):
cur.execute('INSERT INTO scrap_pages (title, content) VALUES ''("%s","%s")', (title, content))
cur.connection.commit()
Maintenant, connectez-vous à Wikipédia et récupérez-en des données.
def getLinks(articleUrl):
html = urlopen('http://en.wikipedia.org'+articleUrl)
bs = BeautifulSoup(html, 'html.parser')
title = bs.find('h1').get_text()
content = bs.find('div', {'id':'mw-content-text'}).find('p').get_text()
store(title, content)
return bs.find('div', {'id':'bodyContent'}).findAll('a',href=re.compile('^(/wiki/)((?!:).)*$'))
links = getLinks('/wiki/Kevin_Bacon')
try:
while len(links) > 0:
newArticle = links[random.randint(0, len(links)-1)].attrs['href']
print(newArticle)
links = getLinks(newArticle)
Enfin, nous devons fermer le curseur et la connexion.
finally:
cur.close()
conn.close()
Cela enregistrera les données recueillies à partir de Wikipedia dans la table nommée scrap_pages. Si vous êtes familier avec MySQL et le web scraping, alors le code ci-dessus ne sera pas difficile à comprendre.
Traitement des données avec PostgreSQL
PostgreSQL, développé par une équipe mondiale de volontaires, est un système de gestion de base de données relationnelle (RDMS) open source. Le processus de traitement des données récupérées à l'aide de PostgreSQL est similaire à celui de MySQL. Il y aurait deux changements: premièrement, les commandes seraient différentes de MySQL et deuxièmement, nous utiliserons icipsycopg2 Bibliothèque Python pour effectuer son intégration avec Python.
Si vous n'êtes pas familier avec PostgreSQL, vous pouvez l'apprendre sur https://www.tutorialspoint.com/postgresql/. Et avec l'aide de la commande suivante, nous pouvons installer la bibliothèque Python psycopg2 -
pip install psycopg2
Le scraping Web implique généralement le téléchargement, le stockage et le traitement du contenu multimédia Web. Dans ce chapitre, voyons comment traiter le contenu téléchargé depuis le Web.
introduction
Le contenu multimédia Web que nous obtenons lors du scraping peut être des images, des fichiers audio et vidéo, sous la forme de pages non Web ainsi que des fichiers de données. Mais, pouvons-nous faire confiance aux données téléchargées en particulier sur l'extension des données que nous allons télécharger et stocker dans la mémoire de notre ordinateur? Il est donc essentiel de connaître le type de données que nous allons stocker localement.
Obtenir du contenu multimédia à partir d'une page Web
Dans cette section, nous allons apprendre comment télécharger du contenu multimédia qui représente correctement le type de support basé sur les informations du serveur Web. Nous pouvons le faire avec l'aide de Pythonrequests module comme nous l'avons fait dans le chapitre précédent.
Tout d'abord, nous devons importer les modules Python nécessaires comme suit -
import requests
Maintenant, fournissez l'URL du contenu multimédia que nous voulons télécharger et stocker localement.
url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"
Utilisez le code suivant pour créer un objet de réponse HTTP.
r = requests.get(url)
À l'aide de la ligne de code suivante, nous pouvons enregistrer le contenu reçu sous forme de fichier .png.
with open("ThinkBig.png",'wb') as f:
f.write(r.content)
Après avoir exécuté le script Python ci-dessus, nous obtiendrons un fichier nommé ThinkBig.png, qui contiendrait l'image téléchargée.
Extraction du nom de fichier de l'URL
Après avoir téléchargé le contenu du site Web, nous voulons également l'enregistrer dans un fichier avec un nom de fichier trouvé dans l'URL. Mais nous pouvons également vérifier si des nombres de fragments supplémentaires existent également dans l'URL. Pour cela, nous devons trouver le nom de fichier réel à partir de l'URL.
Avec l'aide du script Python suivant, en utilisant urlparse, nous pouvons extraire le nom de fichier de l'URL -
import urllib3
import os
url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"
a = urlparse(url)
a.path
Vous pouvez observer la sortie comme indiqué ci-dessous -
'/wp-content/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg'
os.path.basename(a.path)
Vous pouvez observer la sortie comme indiqué ci-dessous -
'MetaSlider_ThinkBig-1080x180.jpg'
Une fois que vous exécutez le script ci-dessus, nous obtiendrons le nom de fichier de l'URL.
Informations sur le type de contenu de l'URL
Lors de l'extraction du contenu du serveur Web, sur demande GET, nous pouvons également vérifier ses informations fournies par le serveur Web. À l'aide du script Python suivant, nous pouvons déterminer ce que signifie le serveur Web avec le type de contenu -
Tout d'abord, nous devons importer les modules Python nécessaires comme suit -
import requests
Maintenant, nous devons fournir l'URL du contenu multimédia que nous voulons télécharger et stocker localement.
url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"
La ligne de code suivante créera un objet de réponse HTTP.
r = requests.get(url, allow_redirects=True)
Maintenant, nous pouvons obtenir quel type d'informations sur le contenu peut être fourni par le serveur Web.
for headers in r.headers: print(headers)
Vous pouvez observer la sortie comme indiqué ci-dessous -
Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type
Avec l'aide de la ligne de code suivante, nous pouvons obtenir des informations particulières sur le type de contenu, disons content-type -
print (r.headers.get('content-type'))
Vous pouvez observer la sortie comme indiqué ci-dessous -
image/jpeg
À l'aide de la ligne de code suivante, nous pouvons obtenir des informations particulières sur le type de contenu, disons EType -
print (r.headers.get('ETag'))
Vous pouvez observer la sortie comme indiqué ci-dessous -
None
Observez la commande suivante -
print (r.headers.get('content-length'))
Vous pouvez observer la sortie comme indiqué ci-dessous -
12636
Avec l'aide de la ligne de code suivante, nous pouvons obtenir des informations particulières sur le type de contenu, disons Serveur -
print (r.headers.get('Server'))
Vous pouvez observer la sortie comme indiqué ci-dessous -
Apache
Génération de vignettes pour les images
La vignette est une très petite description ou représentation. Un utilisateur peut vouloir enregistrer uniquement la vignette d'une grande image ou enregistrer à la fois l'image et la vignette. Dans cette section, nous allons créer une vignette de l'image nomméeThinkBig.png téléchargé dans la section précédente «Obtention de contenu multimédia à partir d'une page Web».
Pour ce script Python, nous devons installer la bibliothèque Python nommée Pillow, un fork de la bibliothèque d'images Python ayant des fonctions utiles pour manipuler les images. Il peut être installé à l'aide de la commande suivante -
pip install pillow
Le script Python suivant créera une vignette de l'image et l'enregistrera dans le répertoire courant en préfixant le fichier vignette avec Th_
import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
img = Image.open(infile)
img.thumbnail((128, 128), Image.ANTIALIAS)
if infile[0:2] != "Th_":
img.save("Th_" + infile, "png")
Le code ci-dessus est très facile à comprendre et vous pouvez vérifier le fichier de vignettes dans le répertoire actuel.
Capture d'écran du site Web
Dans le scraping Web, une tâche très courante consiste à prendre une capture d'écran d'un site Web. Pour mettre en œuvre cela, nous allons utiliser le sélénium et le webdriver. Le script Python suivant prendra la capture d'écran du site Web et l'enregistrera dans le répertoire actuel.
From selenium import webdriver
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser = webdriver.Chrome(executable_path = path)
browser.get('https://tutorialspoint.com/')
screenshot = browser.save_screenshot('screenshot.png')
browser.quit
Vous pouvez observer la sortie comme indiqué ci-dessous -
DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
<bound method WebDriver.quit of <selenium.webdriver.chrome.webdriver.WebDriver
(session="37e8e440e2f7807ef41ca7aa20ce7c97")>>
Après avoir exécuté le script, vous pouvez vérifier votre répertoire actuel pour screenshot.png fichier.
Génération de vignettes pour la vidéo
Supposons que nous ayons téléchargé des vidéos à partir du site Web et que nous voulions générer des miniatures pour celles-ci afin qu'une vidéo spécifique, en fonction de sa miniature, puisse être cliquée. Pour générer des vignettes pour les vidéos, nous avons besoin d'un outil simple appeléffmpeg qui peut être téléchargé depuis www.ffmpeg.org. Après le téléchargement, nous devons l'installer selon les spécifications de notre système d'exploitation.
Le script Python suivant générera une vignette de la vidéo et l'enregistrera dans notre répertoire local -
import subprocess
video_MP4_file = “C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file = 'thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
vframes', '1', thumbnail_image_file, "-y"])
Après avoir exécuté le script ci-dessus, nous obtiendrons la vignette nommée thumbnail_solar_video.jpg enregistré dans notre répertoire local.
Extraction d'une vidéo MP4 en MP3
Supposons que vous ayez téléchargé un fichier vidéo à partir d'un site Web, mais que vous n'ayez besoin que de l'audio de ce fichier pour répondre à votre objectif, alors cela peut être fait en Python à l'aide de la bibliothèque Python appelée moviepy qui peut être installé à l'aide de la commande suivante -
pip install moviepy
Maintenant, après avoir installé avec succès moviepy à l'aide du script suivant, nous pouvons convertir et MP4 en MP3.
import moviepy.editor as mp
clip = mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")
Vous pouvez observer la sortie comme indiqué ci-dessous -
[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01<00:00,
476.30it/s]
[MoviePy] Done.
Le script ci-dessus enregistrera le fichier audio MP3 dans le répertoire local.
Dans le chapitre précédent, nous avons vu comment gérer les vidéos et les images que nous obtenons dans le cadre du contenu de scraping Web. Dans ce chapitre, nous allons traiter de l'analyse de texte en utilisant la bibliothèque Python et nous en apprendrons davantage à ce sujet.
introduction
Vous pouvez effectuer une analyse de texte en utilisant la bibliothèque Python appelée Natural Language Tool Kit (NLTK). Avant de passer aux concepts de NLTK, comprenons la relation entre l'analyse de texte et le web scraping.
L'analyse des mots du texte peut nous amener à savoir quels mots sont importants, quels mots sont inhabituels, comment les mots sont regroupés. Cette analyse facilite la tâche du web scraping.
Premiers pas avec NLTK
La boîte à outils en langage naturel (NLTK) est une collection de bibliothèques Python spécialement conçue pour identifier et baliser des parties de discours trouvées dans le texte d'un langage naturel comme l'anglais.
Installation de NLTK
Vous pouvez utiliser la commande suivante pour installer NLTK en Python -
pip install nltk
Si vous utilisez Anaconda, un package conda pour NLTK peut être généré à l'aide de la commande suivante -
conda install -c anaconda nltk
Téléchargement des données de NLTK
Après avoir installé NLTK, nous devons télécharger des référentiels de texte prédéfinis. Mais avant de télécharger des référentiels de texte prédéfini, nous devons importer NLTK à l'aide deimport commande comme suit -
mport nltk
Maintenant, avec l'aide de la commande suivante, les données NLTK peuvent être téléchargées -
nltk.download()
L'installation de tous les packages disponibles de NLTK prendra un certain temps, mais il est toujours recommandé d'installer tous les packages.
Installation d'autres packages nécessaires
Nous avons également besoin d'autres packages Python comme gensim et pattern pour faire l'analyse de texte ainsi que pour construire des applications de traitement du langage naturel en utilisant NLTK.
gensim- Une bibliothèque de modélisation sémantique robuste, utile pour de nombreuses applications. Il peut être installé par la commande suivante -
pip install gensim
pattern - Utilisé pour faire gensimle package fonctionne correctement. Il peut être installé par la commande suivante -
pip install pattern
Tokenisation
Le processus de décomposition du texte donné, en unités plus petites appelées jetons, est appelé tokenisation. Ces jetons peuvent être des mots, des chiffres ou des signes de ponctuation. Il est également appeléword segmentation.
Exemple
Le module NLTK fournit différents packages pour la tokenisation. Nous pouvons utiliser ces packages selon nos besoins. Certains des packages sont décrits ici -
sent_tokenize package- Ce package divisera le texte d'entrée en phrases. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.tokenize import sent_tokenize
word_tokenize package- Ce package divisera le texte d'entrée en mots. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.tokenize import word_tokenize
WordPunctTokenizer package- Ce package divisera le texte d'entrée ainsi que les signes de ponctuation en mots. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.tokenize import WordPuncttokenizer
Tige
Dans n'importe quelle langue, il existe différentes formes de mots. Une langue comprend de nombreuses variations pour des raisons grammaticales. Par exemple, considérons les motsdemocracy, democratic, et democratization. Pour l'apprentissage automatique ainsi que pour les projets de web scraping, il est important que les machines comprennent que ces différents mots ont la même forme de base. On peut donc dire qu'il peut être utile d'extraire les formes de base des mots lors de l'analyse du texte.
Ceci peut être réalisé par la racine qui peut être définie comme le processus heuristique d'extraction des formes de base des mots en coupant les extrémités des mots.
Le module NLTK fournit différents packages pour la création de racines. Nous pouvons utiliser ces packages selon nos besoins. Certains de ces packages sont décrits ici -
PorterStemmer package- L'algorithme de Porter est utilisé par ce package de dérivation Python pour extraire la forme de base. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.stem.porter import PorterStemmer
Par exemple, après avoir donné le mot ‘writing’ comme entrée de cette racine, la sortie serait le mot ‘write’ après la tige.
LancasterStemmer package- L'algorithme de Lancaster est utilisé par ce package de dérivation Python pour extraire la forme de base. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.stem.lancaster import LancasterStemmer
Par exemple, après avoir donné le mot ‘writing’ comme entrée de cette racine, la sortie serait le mot ‘writ’ après la tige.
SnowballStemmer package- L'algorithme de Snowball est utilisé par ce package de dérivation Python pour extraire la forme de base. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.stem.snowball import SnowballStemmer
Par exemple, après avoir donné le mot «écriture» comme entrée de ce radical, la sortie serait le mot «écriture» après le radical.
Lemmatisation
Une autre façon d'extraire la forme de base des mots est la lemmatisation, visant normalement à supprimer les terminaisons flexionnelles en utilisant le vocabulaire et l'analyse morphologique. La forme de base de tout mot après la lemmatisation est appelée lemme.
Le module NLTK fournit les packages suivants pour la lemmatisation -
WordNetLemmatizer package- Il extraira la forme de base du mot selon qu'il est utilisé comme nom comme verbe. Vous pouvez utiliser la commande suivante pour importer ce package -
from nltk.stem import WordNetLemmatizer
Regrouper
La segmentation, qui consiste à diviser les données en petits morceaux, est l'un des processus importants du traitement du langage naturel pour identifier les parties du discours et les phrases courtes comme les phrases nominales. La segmentation consiste à étiqueter les jetons. Nous pouvons obtenir la structure de la phrase à l'aide d'un processus de segmentation.
Exemple
Dans cet exemple, nous allons implémenter la segmentation Noun-Phrase en utilisant le module NLTK Python. Le segment NP est une catégorie de segmentation qui trouvera les morceaux de phrases nominales dans la phrase.
Étapes de mise en œuvre de la segmentation des phrases nominales
Nous devons suivre les étapes ci-dessous pour implémenter la segmentation des phrases nominales -
Étape 1 - Définition de la grammaire des blocs
Dans un premier temps, nous définirons la grammaire du découpage. Cela comprendrait les règles que nous devons suivre.
Étape 2 - Création de l'analyseur de blocs
Maintenant, nous allons créer un analyseur de blocs. Il analyserait la grammaire et donnerait la sortie.
Étape 3 - La sortie
Dans cette dernière étape, la sortie serait produite dans un format arborescent.
Tout d'abord, nous devons importer le package NLTK comme suit -
import nltk
Ensuite, nous devons définir la phrase. Ici DT: le déterminant, VBP: le verbe, JJ: l'adjectif, IN: la préposition et NN: le nom.
sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]
Ensuite, nous donnons la grammaire sous forme d'expression régulière.
grammar = "NP:{<DT>?<JJ>*<NN>}"
Maintenant, la prochaine ligne de code définira un analyseur pour analyser la grammaire.
parser_chunking = nltk.RegexpParser(grammar)
Maintenant, l'analyseur analysera la phrase.
parser_chunking.parse(sentence)
Ensuite, nous donnons notre sortie dans la variable.
Output = parser_chunking.parse(sentence)
Avec l'aide du code suivant, nous pouvons dessiner notre sortie sous la forme d'un arbre comme indiqué ci-dessous.
output.draw()
Modèle Bag of Word (BoW) Extraction et conversion du texte sous forme numérique
Bag of Word (BoW), un modèle utile dans le traitement du langage naturel, est essentiellement utilisé pour extraire les fonctionnalités du texte. Après avoir extrait les fonctionnalités du texte, il peut être utilisé dans la modélisation d'algorithmes d'apprentissage automatique car les données brutes ne peuvent pas être utilisées dans les applications ML.
Fonctionnement du modèle BoW
Au départ, le modèle extrait un vocabulaire de tous les mots du document. Plus tard, en utilisant une matrice de termes de document, il construirait un modèle. De cette façon, le modèle BoW représente le document comme un sac de mots uniquement et l'ordre ou la structure est rejeté.
Exemple
Supposons que nous ayons les deux phrases suivantes -
Sentence1 - Ceci est un exemple du modèle Bag of Words.
Sentence2 - Nous pouvons extraire des fonctionnalités en utilisant le modèle Bag of Words.
Maintenant, en considérant ces deux phrases, nous avons les 14 mots distincts suivants -
- This
- is
- an
- example
- bag
- of
- words
- model
- we
- can
- extract
- features
- by
- using
Construire un modèle de sac de mots en NLTK
Examinons le script Python suivant qui construira un modèle BoW en NLTK.
Tout d'abord, importez le package suivant -
from sklearn.feature_extraction.text import CountVectorizer
Ensuite, définissez l'ensemble des phrases -
Sentences=['This is an example of Bag of Words model.', ' We can extract
features by using Bag of Words model.']
vector_count = CountVectorizer()
features_text = vector_count.fit_transform(Sentences).todense()
print(vector_count.vocabulary_)
Production
Cela montre que nous avons 14 mots distincts dans les deux phrases ci-dessus -
{
'this': 10, 'is': 7, 'an': 0, 'example': 4, 'of': 9,
'bag': 1, 'words': 13, 'model': 8, 'we': 12, 'can': 3,
'extract': 5, 'features': 6, 'by': 2, 'using':11
}
Modélisation de sujets: identification des modèles dans les données texte
En général, les documents sont regroupés en sujets et la modélisation de sujets est une technique permettant d'identifier les modèles dans un texte qui correspond à un sujet particulier. En d'autres termes, la modélisation de sujets est utilisée pour découvrir des thèmes abstraits ou une structure cachée dans un ensemble donné de documents.
Vous pouvez utiliser la modélisation de sujets dans les scénarios suivants -
Classification du texte
La classification peut être améliorée par la modélisation de sujets, car elle regroupe des mots similaires plutôt que d'utiliser chaque mot séparément comme fonction.
Systèmes de recommandation
Nous pouvons créer des systèmes de recommandation en utilisant des mesures de similarité.
Algorithmes de modélisation de sujet
Nous pouvons implémenter la modélisation de sujets en utilisant les algorithmes suivants -
Latent Dirichlet Allocation(LDA) - C'est l'un des algorithmes les plus populaires qui utilise les modèles graphiques probabilistes pour implémenter la modélisation thématique.
Latent Semantic Analysis(LDA) or Latent Semantic Indexing(LSI) - Il est basé sur l'algèbre linéaire et utilise le concept de SVD (Singular Value Decomposition) sur la matrice des termes du document.
Non-Negative Matrix Factorization (NMF) - Il est également basé sur l'algèbre linéaire comme LDA.
Les algorithmes mentionnés ci-dessus auraient les éléments suivants -
- Nombre de sujets: Paramètre
- Matrice document-mot: entrée
- WTM (Word Topic Matrix) et TDM (Topic Document Matrix): sortie
introduction
Le scraping Web est une tâche complexe et la complexité se multiplie si le site Web est dynamique. Selon l'audit mondial de l'accessibilité du Web des Nations Unies, plus de 70% des sites Web sont de nature dynamique et s'appuient sur JavaScript pour leurs fonctionnalités.
Exemple de site Web dynamique
Prenons un exemple de site Web dynamique et voyons pourquoi il est difficile de gratter. Ici, nous allons prendre un exemple de recherche à partir d'un site Web nomméhttp://example.webscraping.com/places/default/search.Mais comment dire que ce site Web est de nature dynamique? Il peut être jugé à partir de la sortie du script Python suivant qui tentera de récupérer les données de la page Web mentionnée ci-dessus -
import re
import urllib.request
response = urllib.request.urlopen('http://example.webscraping.com/places/default/search')
html = response.read()
text = html.decode()
re.findall('(.*?)',text)
Production
[ ]
La sortie ci-dessus montre que l'exemple de racleur n'a pas réussi à extraire les informations car l'élément <div> que nous essayons de trouver est vide.
Approches pour la récupération des données à partir de sites Web dynamiques
Nous avons vu que le grattoir ne peut pas extraire les informations d'un site Web dynamique car les données sont chargées dynamiquement avec JavaScript. Dans de tels cas, nous pouvons utiliser les deux techniques suivantes pour récupérer des données à partir de sites Web dynamiques dépendants de JavaScript:
- Ingénierie inverse JavaScript
- Rendu JavaScript
Ingénierie inverse JavaScript
Le processus appelé ingénierie inverse serait utile et nous permet de comprendre comment les données sont chargées dynamiquement par les pages Web.
Pour ce faire, nous devons cliquer sur le inspect elementonglet pour une URL spécifiée. Ensuite, nous allons cliquerNETWORK onglet pour trouver toutes les demandes faites pour cette page Web, y compris search.json avec un chemin de /ajax. Au lieu d'accéder aux données AJAX à partir du navigateur ou via l'onglet RÉSEAU, nous pouvons le faire à l'aide du script Python suivant également -
import requests
url=requests.get('http://example.webscraping.com/ajax/search.json?page=0&page_size=10&search_term=a')
url.json()
Exemple
Le script ci-dessus nous permet d'accéder à la réponse JSON à l'aide de la méthode JSON Python. De même, nous pouvons télécharger la réponse de chaîne brute et en utilisant la méthode json.loads de python, nous pouvons la charger également. Nous faisons cela à l'aide du script Python suivant. Il parcourra essentiellement tous les pays en recherchant la lettre de l'alphabet `` a '', puis en itérant les pages résultantes des réponses JSON.
import requests
import string
PAGE_SIZE = 15
url = 'http://example.webscraping.com/ajax/' + 'search.json?page={}&page_size={}&search_term=a'
countries = set()
for letter in string.ascii_lowercase:
print('Searching with %s' % letter)
page = 0
while True:
response = requests.get(url.format(page, PAGE_SIZE, letter))
data = response.json()
print('adding %d records from the page %d' %(len(data.get('records')),page))
for record in data.get('records'):countries.add(record['country'])
page += 1
if page >= data['num_pages']:
break
with open('countries.txt', 'w') as countries_file:
countries_file.write('n'.join(sorted(countries)))
Après avoir exécuté le script ci-dessus, nous obtiendrons la sortie suivante et les enregistrements seront enregistrés dans le fichier nommé countries.txt.
Production
Searching with a
adding 15 records from the page 0
adding 15 records from the page 1
...
Rendu JavaScript
Dans la section précédente, nous avons effectué une ingénierie inverse sur une page Web expliquant le fonctionnement de l'API et la manière dont nous pouvons l'utiliser pour récupérer les résultats en une seule requête. Cependant, nous pouvons faire face aux difficultés suivantes lors de la rétro-ingénierie -
Parfois, les sites Web peuvent être très difficiles. Par exemple, si le site Web est créé avec un outil de navigation avancé tel que Google Web Toolkit (GWT), le code JS résultant serait généré par la machine et difficile à comprendre et à effectuer de l'ingénierie inverse.
Certains cadres de niveau supérieur comme React.js peut rendre la rétro-ingénierie difficile en faisant abstraction d'une logique JavaScript déjà complexe.
La solution aux difficultés ci-dessus consiste à utiliser un moteur de rendu de navigateur qui analyse le HTML, applique le formatage CSS et exécute JavaScript pour afficher une page Web.
Exemple
Dans cet exemple, pour le rendu de Java Script, nous allons utiliser un module Python familier Selenium. Le code Python suivant rendra une page Web à l'aide de Selenium -
Tout d'abord, nous devons importer le pilote Web à partir du sélénium comme suit -
from selenium import webdriver
Maintenant, fournissez le chemin du pilote Web que nous avons téléchargé selon nos besoins -
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path = path)
Maintenant, fournissez l'url que nous voulons ouvrir dans ce navigateur Web maintenant contrôlé par notre script Python.
driver.get('http://example.webscraping.com/search')
Maintenant, nous pouvons utiliser l'ID de la boîte à outils de recherche pour définir l'élément à sélectionner.
driver.find_element_by_id('search_term').send_keys('.')
Ensuite, nous pouvons utiliser le script java pour définir le contenu de la boîte de sélection comme suit -
js = "document.getElementById('page_size').options[1].text = '100';"
driver.execute_script(js)
La ligne de code suivante montre que la recherche est prête à être cliquée sur la page Web -
driver.find_element_by_id('search').click()
La ligne de code suivante montre qu'elle attendra 45 secondes pour terminer la requête AJAX.
driver.implicitly_wait(45)
Maintenant, pour sélectionner les liens de pays, nous pouvons utiliser le sélecteur CSS comme suit -
links = driver.find_elements_by_css_selector('#results a')
Maintenant, le texte de chaque lien peut être extrait pour créer la liste des pays -
countries = [link.text for link in links]
print(countries)
driver.close()
Dans le chapitre précédent, nous avons vu gratter des sites Web dynamiques. Dans ce chapitre, laissez-nous comprendre le grattage de sites Web qui fonctionnent sur des entrées basées sur l'utilisateur, c'est-à-dire des sites Web basés sur des formulaires.
introduction
Ces jours-ci, le WWW (World Wide Web) se dirige vers les médias sociaux ainsi que vers les contenus générés par l'utilisateur. La question se pose donc de savoir comment accéder à ce type d'informations qui se trouvent au-delà de l'écran de connexion? Pour cela, nous devons gérer les formulaires et les connexions.
Dans les chapitres précédents, nous avons travaillé avec la méthode HTTP GET pour demander des informations, mais dans ce chapitre, nous travaillerons avec la méthode HTTP POST qui transmet les informations à un serveur Web pour stockage et analyse.
Interagir avec les formulaires de connexion
Lorsque vous travaillez sur Internet, vous devez avoir interagi plusieurs fois avec les formulaires de connexion. Ils peuvent être très simples, comme n'inclure que très peu de champs HTML, un bouton d'envoi et une page d'action ou ils peuvent être compliqués et avoir des champs supplémentaires comme le courrier électronique, laisser un message avec captcha pour des raisons de sécurité.
Dans cette section, nous allons traiter un simple formulaire de soumission à l'aide de la bibliothèque de requêtes Python.
Tout d'abord, nous devons importer la bibliothèque de requêtes comme suit -
import requests
Maintenant, nous devons fournir les informations pour les champs du formulaire de connexion.
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
Dans la prochaine ligne de code, nous devons fournir l'URL sur laquelle l'action du formulaire se produirait.
r = requests.post(“enter the URL”, data = parameters)
print(r.text)
Après avoir exécuté le script, il renverra le contenu de la page où l'action s'est produite.
Supposons que si vous souhaitez soumettre une image avec le formulaire, alors c'est très facile avec requests.post (). Vous pouvez le comprendre à l'aide du script Python suivant -
import requests
file = {‘Uploadfile’: open(’C:\Usres\desktop\123.png’,‘rb’)}
r = requests.post(“enter the URL”, files = file)
print(r.text)
Chargement des cookies depuis le serveur Web
Un cookie, parfois appelé cookie Web ou cookie Internet, est un petit élément de données envoyé depuis un site Web et notre ordinateur le stocke dans un fichier situé dans notre navigateur Web.
Dans le cadre des transactions avec les formulaires de connexion, les cookies peuvent être de deux types. Un, nous avons traité dans la section précédente, qui nous permet de soumettre des informations à un site Web et le second qui nous permet de rester dans un état permanent «connecté» tout au long de notre visite sur le site. Pour le deuxième type de formulaires, les sites Web utilisent des cookies pour savoir qui est connecté et qui ne l'est pas.
Que font les cookies?
De nos jours, la plupart des sites Web utilisent des cookies pour le suivi. Nous pouvons comprendre le fonctionnement des cookies à l'aide des étapes suivantes -
Step 1- Tout d'abord, le site authentifiera nos identifiants de connexion et les stockera dans le cookie de notre navigateur. Ce cookie contient généralement un toke généré par le serveur, un délai d'expiration et des informations de suivi.
Step 2- Ensuite, le site Web utilisera le cookie comme preuve d'authentification. Cette authentification est toujours affichée chaque fois que nous visitons le site Web.
Les cookies sont très problématiques pour les web scrapers car si les web scrapers ne gardent pas trace des cookies, le formulaire soumis est renvoyé et à la page suivante, il semble qu'ils ne se soient jamais connectés. Il est très facile de suivre les cookies avec l'aide de Python requests bibliothèque, comme indiqué ci-dessous -
import requests
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = requests.post(“enter the URL”, data = parameters)
Dans la ligne de code ci-dessus, l'URL serait la page qui agira en tant que processeur pour le formulaire de connexion.
print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)
Après avoir exécuté le script ci-dessus, nous récupérerons les cookies du résultat de la dernière requête.
Il existe un autre problème avec les cookies: les sites Web modifient parfois fréquemment les cookies sans avertissement. Ce genre de situation peut être traitérequests.Session() comme suit -
import requests
session = requests.Session()
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = session.post(“enter the URL”, data = parameters)
Dans la ligne de code ci-dessus, l'URL serait la page qui agira en tant que processeur pour le formulaire de connexion.
print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)
Notez que vous pouvez facilement comprendre la différence entre un script avec session et sans session.
Automatiser les formulaires avec Python
Dans cette section, nous allons traiter d'un module Python nommé Mechanize qui réduira notre travail et automatisera le processus de remplissage des formulaires.
Module de mécanisation
Le module Mechanize nous fournit une interface de haut niveau pour interagir avec les formulaires. Avant de commencer à l'utiliser, nous devons l'installer avec la commande suivante -
pip install mechanize
Notez que cela ne fonctionnerait qu'en Python 2.x.
Exemple
Dans cet exemple, nous allons automatiser le processus de remplissage d'un formulaire de connexion comportant deux champs à savoir l'email et le mot de passe -
import mechanize
brwsr = mechanize.Browser()
brwsr.open(Enter the URL of login)
brwsr.select_form(nr = 0)
brwsr['email'] = ‘Enter email’
brwsr['password'] = ‘Enter password’
response = brwsr.submit()
brwsr.submit()
Le code ci-dessus est très facile à comprendre. Tout d'abord, nous avons importé le module de mécanisation. Ensuite, un objet navigateur Mechanize a été créé. Ensuite, nous avons accédé à l'URL de connexion et sélectionné le formulaire. Après cela, les noms et les valeurs sont transmis directement à l'objet navigateur.
Dans ce chapitre, nous allons comprendre comment effectuer le scraping Web et le traitement du CAPTCHA qui est utilisé pour tester un utilisateur pour un humain ou un robot.
Qu'est-ce que CAPTCHA?
La forme complète de CAPTCHA est Completely Automated Public Turing test to tell Computers and Humans Apart, ce qui suggère clairement qu'il s'agit d'un test pour déterminer si l'utilisateur est humain ou non.
Un CAPTCHA est une image déformée qui n'est généralement pas facile à détecter par un programme informatique, mais un humain peut d'une manière ou d'une autre réussir à la comprendre. La plupart des sites Web utilisent CAPTCHA pour empêcher les robots d'interagir.
Chargement de CAPTCHA avec Python
Supposons que nous souhaitons vous enregistrer sur un site Web et qu'il existe un formulaire avec CAPTCHA, puis avant de charger l'image CAPTCHA, nous devons connaître les informations spécifiques requises par le formulaire. Avec l'aide du prochain script Python, nous pouvons comprendre les exigences de forme du formulaire d'inscription sur le site Web nomméhttp://example.webscrapping.com.
import lxml.html
import urllib.request as urllib2
import pprint
import http.cookiejar as cookielib
def form_parsing(html):
tree = lxml.html.fromstring(html)
data = {}
for e in tree.cssselect('form input'):
if e.get('name'):
data[e.get('name')] = e.get('value')
return data
REGISTER_URL = '<a target="_blank" rel="nofollow"
href="http://example.webscraping.com/user/register">http://example.webscraping.com/user/register'</a>
ckj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckj))
html = browser.open(
'<a target="_blank" rel="nofollow"
href="http://example.webscraping.com/places/default/user/register?_next">
http://example.webscraping.com/places/default/user/register?_next</a> = /places/default/index'
).read()
form = form_parsing(html)
pprint.pprint(form)
Dans le script Python ci-dessus, nous avons d'abord défini une fonction qui analysera le formulaire en utilisant le module python lxml, puis il imprimera les exigences du formulaire comme suit -
{
'_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
'_formname': 'register',
'_next': '/places/default/index',
'email': '',
'first_name': '',
'last_name': '',
'password': '',
'password_two': '',
'recaptcha_response_field': None
}
Vous pouvez vérifier à partir de la sortie ci-dessus que toutes les informations sauf recpatcha_response_fieldsont compréhensibles et simples. Maintenant, la question se pose de savoir comment nous pouvons gérer ces informations complexes et télécharger CAPTCHA. Cela peut être fait avec l'aide de la bibliothèque oreiller Python comme suit;
Paquet oreiller Python
Pillow est un fork de la bibliothèque d'images Python ayant des fonctions utiles pour manipuler des images. Il peut être installé à l'aide de la commande suivante -
pip install pillow
Dans l'exemple suivant, nous l'utiliserons pour charger le CAPTCHA -
from io import BytesIO
import lxml.html
from PIL import Image
def load_captcha(html):
tree = lxml.html.fromstring(html)
img_data = tree.cssselect('div#recaptcha img')[0].get('src')
img_data = img_data.partition(',')[-1]
binary_img_data = img_data.decode('base64')
file_like = BytesIO(binary_img_data)
img = Image.open(file_like)
return img
Le script python ci-dessus utilise pillowpaquet python et définition d'une fonction pour charger l'image CAPTCHA. Il doit être utilisé avec la fonction nomméeform_parser()qui est défini dans le script précédent pour obtenir des informations sur le formulaire d'inscription. Ce script enregistrera l'image CAPTCHA dans un format utile qui pourra ensuite être extrait sous forme de chaîne.
OCR: extraction de texte à partir d'une image à l'aide de Python
Après avoir chargé le CAPTCHA dans un format utile, nous pouvons l'extraire à l'aide de la reconnaissance optique de caractères (OCR), un processus d'extraction de texte à partir des images. Pour cela, nous allons utiliser le moteur Open Source Tesseract OCR. Il peut être installé à l'aide de la commande suivante -
pip install pytesseract
Exemple
Ici, nous allons étendre le script Python ci-dessus, qui a chargé le CAPTCHA en utilisant le package Pillow Python, comme suit -
import pytesseract
img = get_captcha(html)
img.save('captcha_original.png')
gray = img.convert('L')
gray.save('captcha_gray.png')
bw = gray.point(lambda x: 0 if x < 1 else 255, '1')
bw.save('captcha_thresholded.png')
Le script Python ci-dessus lira le CAPTCHA en mode noir et blanc qui serait clair et facile à passer à tesseract comme suit -
pytesseract.image_to_string(bw)
Après avoir exécuté le script ci-dessus, nous obtiendrons le CAPTCHA du formulaire d'inscription comme sortie.
Ce chapitre explique comment effectuer des tests à l'aide de web scrapers en Python.
introduction
Dans les grands projets Web, des tests automatisés du backend du site Web sont effectués régulièrement, mais les tests du frontend sont souvent ignorés. La principale raison derrière cela est que la programmation de sites Web est comme un réseau de divers langages de balisage et de programmation. Nous pouvons écrire un test unitaire pour une langue, mais cela devient difficile si l'interaction se fait dans une autre langue. C'est pourquoi nous devons avoir une suite de tests pour nous assurer que notre code fonctionne selon nos attentes.
Test avec Python
Lorsque nous parlons de tests, cela signifie de tests unitaires. Avant de plonger dans les tests avec Python, nous devons connaître les tests unitaires. Voici quelques-unes des caractéristiques des tests unitaires -
Au moins un aspect de la fonctionnalité d'un composant serait testé dans chaque test unitaire.
Chaque test unitaire est indépendant et peut également s'exécuter indépendamment.
Le test unitaire n'interfère pas avec le succès ou l'échec de tout autre test.
Les tests unitaires peuvent s'exécuter dans n'importe quel ordre et doivent contenir au moins une assertion.
Unittest - Module Python
Le module Python nommé Unittest pour les tests unitaires est livré avec toute l'installation standard de Python. Nous avons juste besoin de l'importer et le reste est la tâche de la classe unittest.TestCase qui fera ce qui suit -
Les fonctions SetUp et tearDown sont fournies par la classe unittest.TestCase. Ces fonctions peuvent s'exécuter avant et après chaque test unitaire.
Il fournit également des instructions d'assert pour permettre aux tests de réussir ou d'échouer.
Il exécute toutes les fonctions qui commencent par test_ comme test unitaire.
Exemple
Dans cet exemple, nous allons combiner le web scraping avec unittest. Nous testerons la page Wikipedia pour rechercher la chaîne 'Python'. Il fera essentiellement deux tests, d'abord si la page de titre est la même que la chaîne de recherche, c'est-à-dire "Python" ou non et le second test s'assure que la page a un contenu div.
Tout d'abord, nous importerons les modules Python requis. Nous utilisons BeautifulSoup pour le web scraping et bien sûr unittest pour les tests.
from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest
Nous devons maintenant définir une classe qui étendra unittest.TestCase. L'objet global bs serait partagé entre tous les tests. Une fonction spécifiée unittest setUpClass l'accomplira. Ici, nous allons définir deux fonctions, l'une pour tester la page de titre et l'autre pour tester le contenu de la page.
class Test(unittest.TestCase):
bs = None
def setUpClass():
url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
def test_titleText(self):
pageTitle = Test.bs.find('h1').get_text()
self.assertEqual('Python', pageTitle);
def test_contentExists(self):
content = Test.bs.find('div',{'id':'mw-content-text'})
self.assertIsNotNone(content)
if __name__ == '__main__':
unittest.main()
Après avoir exécuté le script ci-dessus, nous obtiendrons la sortie suivante -
----------------------------------------------------------------------
Ran 2 tests in 2.773s
OK
An exception has occurred, use %tb to see the full traceback.
SystemExit: False
D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Test avec du sélénium
Voyons comment utiliser Python Selenium pour les tests. Il est également appelé test de sélénium. Les deux Pythonunittest et Seleniumn'ont pas grand chose en commun. Nous savons que Selenium envoie les commandes Python standard à différents navigateurs, malgré des variations dans la conception de leur navigateur. Rappelons que nous avons déjà installé et travaillé avec Selenium dans les chapitres précédents. Ici, nous allons créer des scripts de test dans Selenium et l'utiliser pour l'automatisation.
Exemple
Avec l'aide du prochain script Python, nous créons un script de test pour l'automatisation de la page de connexion Facebook. Vous pouvez modifier l'exemple pour automatiser d'autres formulaires et connexions de votre choix, mais le concept serait le même.
Tout d'abord pour la connexion au navigateur Web, nous importerons le pilote Web à partir du module sélénium -
from selenium import webdriver
Maintenant, nous devons importer des clés à partir du module sélénium.
from selenium.webdriver.common.keys import Keys
Ensuite, nous devons fournir un nom d'utilisateur et un mot de passe pour nous connecter à notre compte Facebook
user = "[email protected]"
pwd = ""
Ensuite, indiquez le chemin du pilote Web pour Chrome.
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("http://www.facebook.com")
Nous allons maintenant vérifier les conditions en utilisant le mot-clé assert.
assert "Facebook" in driver.title
Avec l'aide de la ligne de code suivante, nous envoyons des valeurs à la section e-mail. Ici, nous le recherchons par son identifiant mais nous pouvons le faire en le recherchant par nom commedriver.find_element_by_name("email").
element = driver.find_element_by_id("email")
element.send_keys(user)
Avec l'aide de la ligne de code suivante, nous envoyons des valeurs à la section mot de passe. Ici, nous le recherchons par son identifiant mais nous pouvons le faire en le recherchant par nom commedriver.find_element_by_name("pass").
element = driver.find_element_by_id("pass")
element.send_keys(pwd)
La ligne de code suivante est utilisée pour appuyer sur entrée / connexion après avoir inséré les valeurs dans le champ e-mail et mot de passe.
element.send_keys(Keys.RETURN)
Nous allons maintenant fermer le navigateur.
driver.close()
Après avoir exécuté le script ci-dessus, le navigateur Web Chrome sera ouvert et vous pouvez voir que l'e-mail et le mot de passe sont insérés et cliqué sur le bouton de connexion.
Comparaison: unittest ou Selenium
La comparaison de l'unittest et du sélénium est difficile car si vous souhaitez travailler avec de grandes suites de tests, la rigidité syntaxique des unités est requise. D'un autre côté, si vous voulez tester la flexibilité du site Web, le test Selenium serait notre premier choix. Mais que se passerait-il si nous pouvions combiner les deux. Nous pouvons importer du sélénium dans Python unittest et tirer le meilleur parti des deux. Le sélénium peut être utilisé pour obtenir des informations sur un site Web et unittest peut évaluer si ces informations répondent aux critères de réussite du test ou non.
Par exemple, nous réécrivons le script Python ci-dessus pour l'automatisation de la connexion Facebook en les combinant comme suit -
import unittest
from selenium import webdriver
class InputFormsCheck(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(r'C:\Users\gaurav\Desktop\chromedriver')
def test_singleInputField(self):
user = "[email protected]"
pwd = ""
pageUrl = "http://www.facebook.com"
driver=self.driver
driver.maximize_window()
driver.get(pageUrl)
assert "Facebook" in driver.title
elem = driver.find_element_by_id("email")
elem.send_keys(user)
elem = driver.find_element_by_id("pass")
elem.send_keys(pwd)
elem.send_keys(Keys.RETURN)
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()