Pourquoi Scrap?
Scrapy est une bibliothèque de grattage Web robuste, qui offre la possibilité de télécharger des pages Web, des images et toutes les données auxquelles vous pourriez penser à une vitesse fulgurante. La vitesse est d'une grande importance dans le calcul, et Scrapy y travaille en visitant des sites Web de manière asynchrone et en effectuant beaucoup de travail en arrière-plan, ce qui rend la tâche plus facile.
Il faut dire que Python a d'autres bibliothèques qui peuvent être utilisées pour extraire les données des sites Web, mais aucune n'est comparable à Scrapy en termes d'efficacité.
Installation
Regardons rapidement comment cette puissante bibliothèque peut être installée sur votre machine.
Comme pour la majorité des bibliothèques Python, vous pouvez installer Scrapy à l'aide du module pip :
pip installer ScrapyVous pouvez vérifier si l'installation a réussi en important scrapy dans le shell interactif de Python.
$ pythonPython 3.5.2 (par défaut, 14 sept. 2017, 22:51:06)
[CCG 5.4.0 20160609] sur Linux
Tapez "aide", "droit d'auteur", "crédits" ou "licence" pour plus d'informations.
>>> importer scrapyMaintenant que nous avons terminé l'installation, entrons dans le vif du sujet.
Création d'un projet de grattage Web
Lors de l'installation, le mot-clé scrapy a été ajouté au chemin afin que nous puissions utiliser le mot-clé directement à partir de la ligne de commande. Nous en profiterions tout au long de notre utilisation de la bibliothèque.
Depuis le répertoire de votre choix exécutez la commande suivante :
scrapy startproject webscraperCela créerait un répertoire appelé grattoir dans le répertoire courant et scrapy.fichier cfg. Dans le grattoir répertoire aurait __init__.py, articles.py, middlewares.py, canalisations.py, paramètres.py fichiers et un répertoire appelé araignées.
Nos fichiers spider je.e. le script qui fait le webscraping pour nous serait stocké dans le araignées annuaire.
Écrire notre araignée
Avant de commencer à écrire notre araignée, il est prévu que nous sachions déjà quel site Web nous voulons gratter. Pour les besoins de cet article, nous grattons un exemple de site Web de grattage Web : http://example.grattage web.com.
Ce site Web ne contient que des noms de pays et leurs drapeaux, avec différentes pages et nous allons supprimer trois des pages. Les trois pages sur lesquelles nous travaillerions sont :
http://exemple.grattage web.com/places/default/index/0
http://exemple.grattage web.com/places/default/index/1
http://exemple.grattage web.com/places/default/index/2
De retour à notre spider, nous allons créer un sample_spider.py dans le répertoire des araignées. Depuis le terminal, un simple toucher sample_spider.py la commande aiderait à créer un nouveau fichier.
Après avoir créé le fichier, nous le remplirons avec les lignes de code suivantes :
importation scrapyclasse SampleSpider(scrapy.Araignée):
nom = "échantillon"
start_urls = [
"http://exemple.grattage web.com/places/default/index/0",
"http://exemple.grattage web.com/places/default/index/1",
"http://exemple.grattage web.com/places/default/index/2"
]
def parse(self, response):
numéro_page = réponse.URL.diviser('/')[-1]
nom_fichier = "page.html".format(numéro_page)
avec open(file_name, 'wb') comme fichier :
déposer.écrire (réponse.corps)
Depuis le niveau supérieur du répertoire du projet, exécutez la commande suivante :
échantillon d'explorationRappelons que nous avons donné notre ÉchantillonSpider Classe A Nom attribut goûter.
Après avoir exécuté cette commande, vous remarquerez que trois fichiers nommés page0.html, page1.html, page2.html sont enregistrés dans le répertoire.
Voyons ce qui se passe avec le code :
importation scrapyNous importons d'abord la bibliothèque dans notre espace de noms.
classe SampleSpider(scrapy.Araignée):nom = "échantillon"
Ensuite, nous créons une classe d'araignée que nous appelons ÉchantillonSpider. Notre araignée hérite de râpeux.Araignée. Toutes nos araignées doivent hériter de scrapy.Araignée. Après avoir créé la classe, nous donnons à notre araignée un Nom attribut, ce Nom l'attribut est utilisé pour invoquer l'araignée depuis le terminal. Si vous vous en souvenez, nous avons exécuté le échantillon d'exploration commande pour exécuter notre code.
start_urls = ["http://exemple.grattage web.com/places/default/index/0",
"http://exemple.grattage web.com/places/default/index/1",
"http://exemple.grattage web.com/places/default/index/2"
]
Nous avons également une liste d'urls pour l'araignée à visiter. La liste doit être appelée start_urls. Si vous souhaitez donner à la liste un nom différent, nous devrons définir un start_requests fonction qui nous donne plus de capacités. Pour en savoir plus, vous pouvez consulter la documentation scrapy.
Quoi qu'il en soit, n'oubliez pas d'inclure le http:// ou https:// pour vos liens, sinon vous devrez faire face à une erreur de schéma manquante.
def parse(self, response):Nous allons ensuite déclarer une fonction d'analyse et lui donner un paramètre de réponse. Lorsque le code est exécuté, la fonction d'analyse est évoquée et l'objet de réponse est envoyé dans lequel contient toutes les informations de la page Web visitée.
numéro_page = réponse.URL.diviser('/')[-1]nom_fichier = "page.html".format(numéro_page)
Ce que nous avons fait avec ce code est de diviser la chaîne contenant l'adresse et d'enregistrer le numéro de page seul dans un numéro de page variable. Ensuite, nous créons un nom de fichier variable en insérant le numéro de page dans la chaîne qui serait le nom de fichier des fichiers que nous serions en train de créer.
avec open(file_name, 'wb') comme fichier :déposer.écrire (réponse.corps)
Nous avons maintenant créé le fichier et nous écrivons le contenu de la page Web dans le fichier en utilisant le corps attribut de la réponse objet.
Nous pouvons faire plus que simplement enregistrer la page Web. La bibliothèque BeautifulSoup peut être utilisée pour analyser le corps.réponse. Vous pouvez consulter ce tutoriel BeautiulSoup si vous n'êtes pas familier avec la bibliothèque.
De la page à scrapper, voici un extrait du html contenant les données dont nous avons besoin :
Vous remarquerez que toutes les données nécessaires sont enfermées dans des balises div, nous allons donc réécrire le code pour analyser le code html.
Voici notre nouveau script :
de l'importation bs4 BeautifulSoup
classe SampleSpider(scrapy.Araignée):
nom = "échantillon"
start_urls = [
"http://exemple.grattage web.com/places/default/index/0",
"http://exemple.grattage web.com/places/default/index/1",
"http://exemple.grattage web.com/places/default/index/2"
]
def parse(self, response):
numéro_page = réponse.URL.diviser('/')[-1]
nom_fichier = "page.SMS".format(numéro_page)
avec open(file_name, 'w') comme fichier :
html_content = BeautifulSoup(réponse.corps, "lxml")
div_tags = html_content.find("div", "id": "résultats")
country_tags = div_tags.find_all("div")
country_name_position = zip(range(len(country_tags)), country_tags)
pour la position, country_name dans country_name_position :
déposer.écrire("numéro de pays : \n".format(position + 1, country_name.texte))
Le code est à peu près le même que le code initial, mais j'ai ajouté BeautifulSoup à notre espace de noms et j'ai changé la logique de la fonction d'analyse.
Regardons rapidement la logique.
def parse(self, response):Ici, nous avons défini la fonction d'analyse et lui avons donné un paramètre de réponse.
numéro_page = réponse.URL.diviser('/')[-1]nom_fichier = "page.SMS".format(numéro_page)
avec open(file_name, 'w') comme fichier :
Cela fait la même chose que discuté dans le code initial, la seule différence est que nous travaillons avec un fichier texte au lieu d'un fichier html. Nous enregistrerions les données grattées dans le fichier texte, et non l'ensemble du contenu Web en html comme précédemment.
html_content = BeautifulSoup(réponse.corps, "lxml")Ce que nous avons fait dans cette ligne de code est d'envoyer le réponse.corps comme argument à la bibliothèque BeautifulSoup, et a attribué les résultats au html_content variable.
div_tags = html_content.find("div", "id": "résultats")En prenant le contenu html, nous l'analysons ici en recherchant un div étiquette qui a également et identifiant attribut avec résultats comme c'est la valeur, alors nous arrivons à l'enregistrer dans un balises_div variable.
country_tags = div_tags.find_all("div")Rappelez-vous que les pays existaient dans div balises aussi, maintenant nous obtenons simplement tous les div balises et les enregistrer sous forme de liste dans le pays_tags variable.
country_name_position = zip(range(len(country_tags)), country_tags)pour la position, country_name dans country_name_position :
déposer.écrire("numéro de pays : \n".format(position + 1, country_name.texte))
Ici, nous parcourons la position des pays parmi toutes les balises de pays puis nous enregistrons le contenu dans un fichier texte.
Donc dans votre fichier texte, vous auriez quelque chose comme :
pays numéro 1 : Afghanistanpays numéro 2 : Îles Aland
pays numéro 3 : Albanie
…
Conclusion
Scrapy est sans aucun doute l'une des bibliothèques les plus puissantes du marché, elle est très rapide et télécharge essentiellement la page Web. Il vous donne ensuite la liberté de faire ce que vous voulez avec le contenu Web.
Nous devons noter que Scrapy peut faire beaucoup plus que ce que nous avons vérifié ici. Vous pouvez analyser les données avec les sélecteurs Scrapy CSS ou Xpath si vous le souhaitez. Vous pouvez lire la documentation si vous avez besoin de faire quelque chose de plus complexe.