Stracage sur le Web avec module de scroty Python

Stracage sur le Web avec module de scroty Python
La compétence du grattage Web est devenue dorée aujourd'hui, alors découvrons comment nous pouvons obtenir les données nécessaires à partir des pages Web. Dans cet article, nous parlons de la bibliothèque Scrapy Python, de ce qu'elle peut faire et comment l'utiliser. Commençons.

Pourquoi Scrapy?

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 à Lightning Speed. La vitesse est d'une grande importance dans le calcul, et le scrothés fonctionne à ce sujet en visitant les sites Web de manière asynchrone et en faisant beaucoup de travail de fond, ce qui facilite la tâche.

Il convient de dire que Python a d'autres bibliothèques qui peuvent être utilisées pour gratter les données des sites Web, mais aucun n'est comparable au Scrapy en ce qui concerne l'efficacité.

Installation

Voyons rapidement comment cette bibliothèque puissante peut être installée sur votre machine.

Comme pour la majorité des bibliothèques Python, vous pouvez installer le scrapie à l'aide du module PIP:

PIP Install Scrapy

Vous pouvez vérifier si l'installation a réussi en important Scrapy dans le shell interactif de Python.

$ python
Python 3.5.2 (par défaut, 14 septembre 2017, 22:51:06)
[GCC 5.4.0 20160609] sur Linux

Tapez «Help», «Copyright», «Crédits» ou «Licence» pour plus d'informations.

>>> Importer Scrapy

Maintenant que nous avons fini avec l'installation, passons dans l'épaisseur des choses.

Création d'un projet de grattage Web

Pendant 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.

Dans le répertoire de votre choix, exécutez la commande suivante:

SCRAPY startProject Webctraper

Cela créerait un répertoire appelé webscraper Dans le répertoire actuel et le scracy.Fichier CFG. Dans le webscraper Le répertoire aurait __init__.py, articles.py, biens intermédiaires.Py, pipelines.py, paramètres.py fichiers et un répertoire appelé araignées.

Nos fichiers d'araignée I.e. Le script qui fait le webscraping pour nous serait stocké dans le araignées annuaire.

Écrire notre araignée

Avant d'aller de l'avant pour écrire notre araignée, on s'attend à ce que nous sachions déjà quel site Web nous voulons gratter. Aux fins de cet article, nous grattons un exemple de site Web de webscraping: http: // exemple.webscraping.com.

Ce site Web a juste des noms de pays et leurs drapeaux, avec différentes pages et nous allons supprimer trois des pages. Les trois pages sur lesquelles nous travaillions sont:

http: // Exemple.webscraping.com / lieux / par défaut / index / 0
http: // Exemple.webscraping.com / lieux / par défaut / index / 1
http: // Exemple.webscraping.com / lieux / par défaut / index / 2

De retour à notre araignée, nous allons créer un sampon_pider.py dans le répertoire des araignées. Du terminal, un simple Toucher Sample_spider.py La commande aiderait à créer un nouveau fichier.

Après avoir créé le fichier, nous le remplirions avec les lignes de code suivantes:

Scrapie d'importation
Pider des échantillons de classe (Scrapie.Araignée):
name = "échantillon"
start_urls = [
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 0 ",
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 1 ",
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 2 "
]]
Def Parse (soi, réponse):
page_number = réponse.URL.Split ('/') [- 1]
file_name = "page .html ".format (page_number)
avec open (file_name, 'wb') en tant que fichier:
déposer.Écrire (réponse.corps)

Du niveau supérieur du répertoire du projet, exécutez la commande suivante:

échantillon de crawl de scracy

Rappelons que nous avons donné notre Piance d'échantillons Classe A nom attribut goûter.

Après avoir exécuté cette commande, vous remarqueriez que trois fichiers nommés page0.HTML, Page1.html, page2.HTML sont enregistrés dans le répertoire.

Jetons un coup d'œil à ce qui se passe avec le code:

Scrapie d'importation

Nous importons d'abord la bibliothèque dans notre espace de noms.

Pider des échantillons de classe (Scrapie.Araignée):
name = "échantillon"

Ensuite, nous créons une classe d'araignée que nous appelons Piance d'échantillons. Notre araignée hérite de brassard.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, ceci nom L'attribut est utilisé pour invoquer l'araignée du terminal. Si vous vous souvenez, nous avons dirigé le échantillon de crawl de scracy commande pour exécuter notre code.

start_urls = [
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 0 ",
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 1 ",
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 2 "
]]

Nous avons également une liste d'URL à visiter Spider. La liste doit être appelée start_urls. Si vous souhaitez donner à la liste un nom différent, nous devions définir un start_requests fonction qui nous donne plus de capacités. Pour en savoir plus, vous pouvez consulter la documentation de scracy.

Quoi qu'il en soit, n'oubliez pas d'inclure le http: // ou https: // pour vos liens, vous devez faire face à une erreur de schéma manquant.

Def Parse (soi, réponse):

Nous allons ensuite de l'avant pour 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é.

page_number = réponse.URL.Split ('/') [- 1]
file_name = "page .html ".format (page_number)

Ce que nous avons fait avec ce code, c'est diviser la chaîne contenant l'adresse et enregistrer le numéro de page seul dans un numéro de page variable. Ensuite, nous créons un nom de fichier variable insérant le numéro de page Dans la chaîne, ce serait le nom de fichier des fichiers que nous créons.

avec open (file_name, 'wb') en tant que 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 à l'aide du corps attribut du réponse objet.

Nous pouvons faire plus que d'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.

À partir de la page à supprimer, voici un extrait du HTML contenant les données dont nous avons besoin:









Afghanistan

Iles Aland

Vous remarqueriez que toutes les données nécessaires sont enfermées dans des balises Div, nous allons donc réécrire le code pour analyser le HTML.
Voici notre nouveau script:

Scrapie d'importation
De BS4 Import BeautifulSoup
Pider des échantillons de classe (Scrapie.Araignée):
name = "échantillon"
start_urls = [
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 0 ",
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 1 ",
"Http: // Exemple.webscraping.com / lieux / par défaut / index / 2 "
]]
Def Parse (soi, réponse):
page_number = réponse.URL.Split ('/') [- 1]
file_name = "page .SMS".format (page_number)
avec open (file_name, 'w') en tant que fichier:
html_content = belle (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.écriture ("numéro de pays : \ n".format (position + 1, country_name.texte))

Le code est à peu près le même que celui initial, mais j'ai ajouté BeautifulSoup à notre espace de noms et j'ai changé la logique dans la fonction d'analyse.

Jetons un coup d'œil à la logique.

Def Parse (soi, réponse):

Ici, nous avons défini la fonction d'analyse et lui avons donné un paramètre de réponse.

page_number = réponse.URL.Split ('/') [- 1]
file_name = "page .SMS".format (page_number)
avec open (file_name, 'w') en tant que fichier:

Cela fait la même chose que celle discutée dans le code intial, 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 fait précédemment.

html_content = belle (réponse.corps, "lxml")

Ce que nous avons fait dans cette ligne de code, c'est d'envoyer 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")

Prenant le contenu HTML, nous l'analysons ici en recherchant un div Tag qui a également et identifiant attribuer résultats Comme c'est la valeur, alors nous pouvons l'enregistrer dans un div_tags variable.

country_tags = div_tags.find_all ("div")

Rappelez-vous que les pays existaient div Tags aussi, maintenant nous obtenons simplement tous les div Tags et les enregistrer comme une liste dans le country_tags variable.

country_name_position = zip (range (len (country_tags)), country_tags)
pour la position, country_name dans country_name_position:
déposer.écriture ("numéro de pays : \ n".format (position + 1, country_name.texte))

Ici, nous itérons à travers 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: Afghanistan
Pays numéro 2: îles d'Aland
Pays numéro 3: Albanie

Conclusion

Scrapy est sans aucun doute l'une des bibliothèques les plus puissantes du marché, il est très rapide et télécharge essentiellement la page Web. Il vous donne alors la liberté de tout ce que vous souhaitez avec le contenu Web.

Nous devons noter que Scrapy peut faire bien plus que ce que nous avons vérifié ici. Vous pouvez analyser les données avec Scrapy CSS ou XPATH SELECTORS si vous le souhaitez. Vous pouvez lire la documentation si vous avez besoin de faire quelque chose de plus complexe.