Dans le post précédent, j'ai utilisé rllib et les requêtes pour obtenir les éléments de la page Web.
Ici, nous allons travailler pour en extraire uniquement les données nécessaires. Pour être précis, ce travail d'extraction est appelé grattage.
Il existe les méthodes suivantes pour le grattage.
Considérez HTML ou XML comme une simple chaîne de caractères et extrayez les parties nécessaires. Par exemple, vous pouvez utiliser le module re de la bibliothèque standard Python pour récupérer des chaînes de caractères arbitraires avec une relative flexibilité.
Fondamentalement, cette méthode est la plus utilisée. Il existe plusieurs bibliothèques qui effectuent du scraping à partir de HTML, etc. Vous pouvez facilement le faire en l'utilisant.
Les modules typiques inclus dans la bibliothèque Python sont les suivants.
Nous expliquerons les termes utilisés en XML et HTML à l'aide de pages écrites en XML. XML est le même langage de balisage que HTML et est un langage plus extensible. Prenons le code de la page XML de Yahoo! News comme exemple.
import requests
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
print(r.text)
>>>Résultat de sortie
<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" version="2.0">
<channel>
<title>Yahoo!Sujets d'actualité-Majeur</title>
<link>https://news.yahoo.co.jp/</link>
<description>Yahoo!Nous fournissons les dernières rubriques présentées dans JAPAN News Topics.</description>
<language>ja</language>
<pubDate>Thu, 06 Dec 2018 19:42:33 +0900</pubDate>
<item>
<title>Mesures contre la «fatigue cérébrale» dont vous n'êtes pas conscient</title>
<link>https://news.yahoo.co.jp/pickup/6305814</link>
<pubDate>Thu, 06 Dec 2018 19:35:20 +0900</pubDate>
<enclosure length="133" url="https://s.yimg.jp/images/icon/photo.gif" type="image/gif">
</enclosure>
<guid isPermaLink="false">yahoo/news/topics/6305814</guid>
</item>
......(Ce qui suit est omis)......
Il y a une description comme
le titre s'appelle le nom de l'élément
BeautifulSoup est une bibliothèque de scraping simple et facile à retenir. Je vais continuer à vous expliquer comment l'utiliser facilement en utilisant la page XML de Yahoo! News.
#Importer des bibliothèques et des modules
from bs4 import BeautifulSoup
import requests
# yahoo!Obtenez des données d'actualité clés
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
# BeautifulSoup()Vous ne pouvez pas spécifier directement le nom de fichier ou l'URL pour
soup = BeautifulSoup(r.text, "xml")
La méthode BeautifulSoup obtient la page Web spécifiée. Dans le premier argument, spécifiez la chaîne de caractères HTML comme type str ou type octets. Spécifiez l'analyseur dans le deuxième argument. Un analyseur est un programme qui effectue une analyse de syntaxe. Dans ce cas, la chaîne de caractères HTML est analysée élément par élément et convertie pour en faciliter l'utilisation.
Les analyseurs qui peuvent être utilisés avec Beautiful Soup sont les suivants. Choisissez le bon analyseur pour vos besoins.
Maintenant que vous avez spécifié l'analyseur approprié, vous êtes prêt à analyser la page Web. Maintenant, obtenons n'importe quelle partie.
Il existe plusieurs façons de spécifier un élément pour l'acquisition, mais ici nous utiliserons les deux suivantes.
Si vous spécifiez le nom de la balise, l'attribut ou les deux dans la méthode de recherche pour les données analysées Obtenez uniquement le premier élément apparaissant qui le satisfait. De plus, la méthode find_all obtient également tous les éléments spécifiés dans une liste.
Si vous spécifiez un sélecteur CSS avec la méthode select_one pour les données analysées Obtenez uniquement le premier élément apparaissant qui le satisfait. En outre, la méthode de sélection obtient également tous les éléments spécifiés dans la liste.
import requests
from bs4 import BeautifulSoup
# yahoo!Obtenez des données d'actualité clés
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
#Analyser avec xml
soup = BeautifulSoup(r.text, "xml")
#Extraire uniquement le premier élément de la balise de titre
print(soup.find("title"))
print()
#Extraire tous les éléments de la balise de titre
print(soup.find_all("title"))
>>>Résultat de sortie
<title>Yahoo!Sujets d'actualité-Majeur</title>
[<title>Yahoo!Sujets d'actualité-Majeur</title>,
<title>Go Iyama remporte le 43e mandat et établit un nouveau record</title>,
<title>Est-ce que Mitsuki Takahata et Sakaguchi continueront à sortir ensemble?</title>,
<title>Mieko Hanada s'est remariée à moins de 13 ans</title>,
....(Ce qui suit est omis)
Le sélecteur CSS est une méthode d'expression qui spécifie les éléments à décorer tels que les chaînes de caractères avec CSS. Par exemple, si vous spécifiez "body> h1", vous obtiendrez l'élément h1, qui est la relation enfant directe de l'élément body.
#(Première moitié omise)
#Extrait uniquement le tout premier élément h1 de l'élément body
print(soup.select_one("body > h1"))
print()
#Extrait tous les éléments h1 de l'élément body
print(soup.select("body > h1"))
La balise h3 est restée telle qu'elle était dans les informations acquises dans la section précédente. En effet, la balise a également été ajoutée à la liste. Avec le texte, vous ne pouvez récupérer que le texte de chacun des éléments récupérés.
import requests
from bs4 import BeautifulSoup
# yahoo!Obtenez des données d'actualité clés
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
#Analyser avec xml
soup = BeautifulSoup(r.text, "xml")
#Extraire l'élément de la balise de titre
titles = soup.find_all("title")
#Obtenez les éléments un par un de la liste à l'aide de l'instruction for
#Vous pouvez utiliser du texte pour supprimer des balises et afficher uniquement du texte
for title in titles:
print(title.text)
>>>Résultat de sortie
Yahoo!Sujets d'actualité-Majeur
Rechercher une explosion, une négligence grave, etc.
ACTUALITÉS Koyama news chaque.Descendez
Mieko Hanada s'est remariée à moins de 13 ans
...
Jusqu'à présent, je n'ai gratté qu'une seule page Web En réalité, je pense que vous grattez souvent plusieurs pages telles que "page suivante".
Pour gratter plusieurs pages, vous devez obtenir toutes les URL des pages que vous souhaitez gratter.
La page Web de l'exercice a un numéro de page en bas Étant donné que la destination du lien est définie pour chacun, il semble bon de l'obtenir. L'URL liée est décrite dans l'attribut href de l'élément .
for url in soup.find_all("a"):
print(url.get("href"))
import requests
from bs4 import BeautifulSoup
#Obtenez la page Web de la pratique d'Aidemy
authority = "http://scraping.aidemy.net"
r = requests.get(authority)
#Analyser avec lxml
soup = BeautifulSoup(r.text, "lxml")
#Pour rechercher des liens pour les transitions de page<a>Obtenez l'élément
urls = soup.find_all("a")
# -----L'URL que vous souhaitez supprimer_Accéder à la liste-----
url_list = []
# url_Ajoutez l'URL de chaque page à la liste
for url in urls:
url = authority + url.get("href")
url_list.append(url)
#Liste de sortie
print(url_list)
Dans la section précédente, nous avons pu lister les URL que nous voulions obtenir.
Répéter le scraping pour chacune des URL acquises Vous pouvez obtenir diverses informations telles que le nom et l'âge de la photo.
De plus, si vous écrivez les informations acquises dans la base de données ou si vous les écrivez dans un fichier Il sera disponible pour le traitement des données.
import urllib.request
import requests
from bs4 import BeautifulSoup
#Obtenez la page Web de la pratique d'Aidemy
authority = "http://scraping.aidemy.net"
r = requests.get(authority)
#Analyser avec lxml
soup = BeautifulSoup(r.text, "lxml")
#Pour rechercher des liens pour les transitions de page<a>Obtenez l'élément
urls = soup.find_all("a")
# -----L'URL que vous souhaitez supprimer_Accéder à la liste-----
url_list = []
# url_Ajouter l'URL de chaque page à la liste
for url in urls:
url = authority + url.get("href")
url_list.append(url)
# -----Gratter le titre d'une photo-----
#Créer une fonction de grattage
def scraping(url):
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "lxml")
#Répondez ici
photos = soup.find_all("h3")
photos_list = []
#Veuillez compléter ce qui suit pour la déclaration
for photo in photos:
photo = photo.text
photos_list.append(photo)
return photos_list
for url in url_list:
print(scraping(url))
Recommended Posts