Stracage sur le Web avec une belle soupe

Stracage sur le Web avec une belle soupe
Le grattage Web est une technique utilisée pour sélectionner et extraire du contenu spécifique à partir de sites Web. Par exemple, lorsque nous voulons surveiller les prix et comment ils changent, nous pouvons utiliser un grattoir Web pour extraire uniquement les informations que nous voulons d'un site Web et les jeter dans un fichier Excel. Dans ce tutoriel, nous apprendrons à gratter le Web en utilisant BeautifulSoup.

Tout d'abord, installez BeautifulSoup comme suit:

pip install BeautifulSoup4

BeautifulSoup est appliqué à un fichier HTML, et nous devons donc commencer par obtenir le contenu HTML d'une page Web. Cela se fait généralement à l'aide du module de requêtes. Dans cet exemple spécifique, nous obtiendrons le contenu HTML d'une page Web et l'afficherons. Pour cela, nous avons d'abord réglé l'URL; Dans ce cas, j'ai choisi le site Web de Common Sense Media (car il a une liste de films avec des notes, que nous pourrions être intéressés à gratter). Nous utilisons ensuite la méthode get () pour récupérer l'objet de réponse et extraire la partie HTML à l'aide de l'attribut de contenu ou de texte.

Demandes d'importation
url = "https: // www.communesmédia.org / film-revues "
corps = demandes.obtenir (URL)
body_text = corps.Contenu # ou corps.texte
imprimer (corps.contenu) # ou imprimer (corps.texte)

Maintenant, nous pouvons commencer à utiliser BeautifulSoup. Nous créons un objet BeautifulSoup qui prend deux arguments - le fichier HTML et le type d'analyseur. Il y a quatre analyseurs disponibles - HTML.Parser, LXML, LXML-XML et HTML5LIB.

De BS4 Import BeautifulSoup
Soup = BeautifulSoup (Body_Text, 'LXML')

Il faut également installer l'analyseur. Dans ce cas, j'ai choisi l'analyseur LXML, et je vais donc l'installer.

pip install lxml

Maintenant, nous pouvons faire à peu près n'importe quoi, mais nous explorerons les différentes possibilités avant de commencer le grattage Web.

(i) La méthode PARTIFFY () réécrira le texte dans un format lisible et «joli».

soupe.enjoliver()

(ii) La méthode du titre récupérera le titre.

soupe.titre

(iii) La méthode «P» extrait toutes les balises P du code HTML.

soupe.p

(iv) La méthode «A» extraire toutes les balises A du code HTML.

soupe.un

(v) La méthode find_all () trouvera tous les éléments Web qui contiennent un argument particulier. Dans ce cas, j'ai dépassé «A», donc Find_all («A») trouvera toutes les balises «A».

soupe.find_all ('a')

(vi) La méthode de recherche trouvera tous les arguments passés. Dans ce cas, nous passons l'argument ID = «Mot de passe."Il va donc rechercher le code HTML pour l'ID, et s'il correspond, récupérez la clause.

soupe.trouver (id = "mot de passe")

Donc, généralement, nous aimerions gratter une page Web pour les emplois, les films, les cours, etc., ainsi que leurs informations respectives (telles que les prix et les notations). Dans ce cas, nous sommes intéressés par un site Web, en particulier en grattant leur liste de films.

Demandes d'importation
url = "https: // www.communesmédia.org / film-revues "
corps = demandes.obtenir (URL)
body_text = corps.contenu
De BS4 Import BeautifulSoup
Soup = BeautifulSoup (Body_Text, 'LXML')

Dans ce cas particulier, le code HTML de chaque nom de film (ce que nous grattons) est lui-même dans un conteneur. Nous commençons par inspecter l'élément en question. Dans mon cas, j'ai choisi d'inspecter le titre du premier film («Till Death»).

Lorsque vous inspectez l'élément, vous remarquerez que ce que nous recherchons - le titre de film «Till Death» - est contenu dans une balise «div» avec la classe «Content-Content-Wrapper."Cette première balise" div "continuera de se réapparaître dans le code HTML car chaque titre de film est contenu dans une telle balise" div ". Et donc nous disons que pour chaque div dans Divs, nous souhaitons sélectionner la balise sous-«div» avec une classe différente de «vues vues vues vues-champ-champ.«Après cela, nous voyons une balise« forte »avec la classe« Content sur le terrain.«Alors nous refaisons la même chose. Et enfin, notre titre lui-même est imbriqué d'une balise «A», nous sélectionnons donc la balise «A».

Divs = soupe.find_all ("div", class _ = "contenu-content-wrapper")

Veuillez noter ici qu'après la classe de mots, il y a un soulignement. Ce soulignement distingue la classe de code HTML des classes Python. Nous avons donc écrit le code qui extraire la balise «div» avec la classe «Content-Content-Wornper."

Ensuite, vous écrivez:

# divs = soupe.find_all ("div", 'class': 'contenu-contenu-wrapper')
pour div dans les divs:
divs2 = div.find_all ("div", class _ = "vues-champ vues-champ de champ-référence-review-tent-prod-title")
pour div dans divs2:
forts = div.find_all ("Strong", classe _ = "Field-Content")
Pour les forts forts:
aa = fort.find_all ("a")
pour a en aa:
imprimer (un.texte)

Les boucles pour choisir chaque film. Enfin, lorsque nous voulons sélectionner le texte, nous disons un.texte. Ce dernier imprimera chaque titre de film, et d'une telle manière, nous pouvons gratter ce que nous voulons.

Maintenant, supposons que nous souhaitions enregistrer ces données dans un fichier CSV; C'est possible aussi. Pour écrire à CSV, vous devez d'abord importer le module CSV. Tout d'abord, ouvrons le fichier où nous voulons que les informations soient stockées. Ici, nous passerons trois arguments - le nom du fichier, le mode et si nous voulons une nouvelle ligne ou non. Ici, nous ajoutons une nouvelle ligne égale à rien pour empêcher le fichier CSV d'ajouter des retours (ou de nouvelles lignes vides) après chaque entrée. Deuxièmement, nous passons le fichier à la méthode écrivain (). Troisièmement, nous écrivons une nouvelle ligne. Dans ce cas, j'appelle ma nouvelle ligne «films» parce que c'est l'en-tête de ce qui va suivre.

Importer CSV
file = Open ("film.csv "," w ", newline =")
file_write = csv.écrivain (fichier)
file_write.writerow (['films'])

Quatrièmement, au lieu d'imprimer simplement la variable «A», nous le dépouillerons des espaces vides, puis utiliserons la méthode writerow () pour l'écrire dans le fichier CSV.

pour div dans les divs:
divs2 = div.find_all ("div", class _ = "vues-champ vues-champ de champ-référence-review-tent-prod-title")
pour div dans divs2:
forts = div.find_all ("Strong", classe _ = "Field-Content")
Pour les forts forts:
aa = fort.find_all ("a")
pour a en aa:
file_write.writerow ([a.texte.bande()])

L'ensemble du code ressemblerait à ceci:

Demandes d'importation
url = "https: // www.communesmédia.org / film-revues "
corps = demandes.obtenir (URL)
body_text = corps.contenu
De BS4 Import BeautifulSoup
Soup = BeautifulSoup (Body_Text, 'LXML')
Divs = soupe.find_all ("div", class _ = "contenu-content-wrapper")
Importer CSV
file = Open ("film.csv "," w ", newline =")
file_write = csv.écrivain (fichier)
file_write.writerow (['films'])
pour div dans les divs:
divs2 = div.find_all ("div", class _ = "vues-champ vues-champ de champ-référence-review-tent-prod-title")
pour div dans divs2:
forts = div.find_all ("Strong", classe _ = "Field-Content")
Pour les forts forts:
aa = fort.find_all ("a")
pour a en aa:
file_write.writerow ([a.texte.bande()])

Ce n'est qu'un exemple simple. En réalité, le grattage Web est si puissant que vous pouvez gratter et surveiller à peu près n'importe quelle page Web.

Codage heureux!