Im vorherigen Beitrag habe ich rllib und Anfragen verwendet, um die Elemente der Webseite abzurufen.
Hier werden wir daran arbeiten, nur die notwendigen Daten daraus zu extrahieren. Um genau zu sein, wird diese Extraktionsarbeit als Schaben bezeichnet.
Es gibt die folgenden Methoden zum Schaben.
Betrachten Sie HTML oder XML als einfache Zeichenfolge und extrahieren Sie die erforderlichen Teile. Mit dem re-Modul der Python-Standardbibliothek können Sie beispielsweise beliebige Zeichenfolgen relativ flexibel abrufen.
Grundsätzlich wird diese Methode am häufigsten verwendet. Es gibt mehrere Bibliotheken, die das Scraping von HTML usw. durchführen. Sie können es einfach tun, indem Sie es verwenden.
Die typischen Module in der Python-Bibliothek sind wie folgt.
Wir werden die in XML und HTML verwendeten Begriffe anhand von in XML geschriebenen Seiten erläutern. XML ist dieselbe Auszeichnungssprache wie HTML und eine erweiterbarere Sprache. Lassen Sie uns den Code der XML-Seite von Yahoo! News als Beispiel erhalten.
import requests
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
print(r.text)
>>>Ausgabeergebnis
<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" version="2.0">
<channel>
<title>Yahoo!Nachrichtenthemen-Haupt</title>
<link>https://news.yahoo.co.jp/</link>
<description>Yahoo!Wir bieten die neuesten Überschriften in den JAPAN News Topics.</description>
<language>ja</language>
<pubDate>Thu, 06 Dec 2018 19:42:33 +0900</pubDate>
<item>
<title>Maßnahmen gegen "Gehirnermüdung", die Sie nicht kennen</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>
......(Folgendes wird weggelassen)......
Der erhaltene Code enthält eine Beschreibung wie
Titel heißt Elementname
BeautifulSoup ist eine einfache und leicht zu merkende Scraping-Bibliothek. Wir werden weiterhin erklären, wie Sie es auf der XML-Seite von Yahoo! News einfach verwenden können.
#Bibliotheken und Module importieren
from bs4 import BeautifulSoup
import requests
# yahoo!Erhalten Sie wichtige Nachrichtendaten
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
# BeautifulSoup()Sie können den Dateinamen oder die URL für nicht direkt angeben
soup = BeautifulSoup(r.text, "xml")
Die BeautifulSoup-Methode ruft die angegebene Webseite ab. Geben Sie im ersten Argument die HTML-Zeichenfolge als Str-Typ oder Byte-Typ an. Geben Sie den Parser im zweiten Argument an. Ein Parser ist ein Programm, das eine Syntaxanalyse durchführt. In diesem Fall wird die HTML-Zeichenfolge Element für Element analysiert und zur Vereinfachung der Verwendung konvertiert.
Die Parser, die mit Beautiful Soup verwendet werden können, sind wie folgt. Wählen Sie den richtigen Parser für Ihren Zweck.
Nachdem Sie den entsprechenden Parser angegeben haben, können Sie die Webseite analysieren. Lassen Sie uns jetzt einen Teil bekommen.
Es gibt verschiedene Möglichkeiten, ein Element für die Erfassung anzugeben. Hier werden jedoch die folgenden beiden verwendet.
Wenn Sie den Tag-Namen, das Attribut oder beides in der Suchmethode für die analysierten Daten angeben Holen Sie sich nur das erste erscheinende Element, das es erfüllt. Außerdem findet die find_all-Methode auch alle angegebenen Elemente in einer Liste.
Wenn Sie einen CSS-Selektor mit der Methode select_one für analysierte Daten angeben Holen Sie sich nur das erste erscheinende Element, das es erfüllt. Außerdem ruft die select-Methode auch alle angegebenen Elemente in der Liste ab.
import requests
from bs4 import BeautifulSoup
# yahoo!Erhalten Sie wichtige Nachrichtendaten
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
#Mit XML analysieren
soup = BeautifulSoup(r.text, "xml")
#Extrahieren Sie nur das erste Element des Titel-Tags
print(soup.find("title"))
print()
#Extrahieren Sie alle Elemente des Titel-Tags
print(soup.find_all("title"))
>>>Ausgabeergebnis
<title>Yahoo!Nachrichtenthemen-Haupt</title>
[<title>Yahoo!Nachrichtenthemen-Haupt</title>,
<title>Go Iyama gewinnt die 43. Amtszeit und stellt einen neuen Rekord auf</title>,
<title>Werden Mitsuki Takahata und Sakaguchi weiterhin miteinander ausgehen?</title>,
<title>Mieko Hanada heiratete erneut unter 13 Jahren</title>,
....(Folgendes wird weggelassen)
Der CSS-Selektor ist eine Ausdrucksmethode, die Elemente angibt, die dekoriert werden sollen, z. B. Zeichenfolgen mit CSS. Wenn Sie beispielsweise "body> h1" angeben, erhalten Sie das Element h1, bei dem es sich um die direkte untergeordnete Beziehung des body-Elements handelt.
#(Erste Hälfte weggelassen)
#Extrahiert nur das allererste h1-Element im body-Element
print(soup.select_one("body > h1"))
print()
#Extrahiert alle h1-Elemente im body-Element
print(soup.select("body > h1"))
Das h3-Tag blieb wie in den im vorherigen Abschnitt erfassten Informationen. Dies liegt daran, dass das Tag ebenfalls zur Liste hinzugefügt wurde. Mit Text können Sie nur den Text in jedem der abgerufenen Elemente abrufen.
import requests
from bs4 import BeautifulSoup
# yahoo!Erhalten Sie wichtige Nachrichtendaten
r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
#Mit XML analysieren
soup = BeautifulSoup(r.text, "xml")
#Extrahieren Sie das Element des Titel-Tags
titles = soup.find_all("title")
#Rufen Sie die Elemente einzeln mit der for-Anweisung aus der Liste ab
#Sie können Text verwenden, um Tags zu entfernen und nur Text auszugeben
for title in titles:
print(title.text)
>>>Ausgabeergebnis
Yahoo!Nachrichtenthemen-Haupt
Auf Explosion, grobe Fahrlässigkeit usw. untersuchen.
NEWS Koyama News jeden.Verschwinde
Mieko Hanada heiratete erneut unter 13 Jahren
...
Bisher habe ich nur eine Webseite abgekratzt In Wirklichkeit denke ich, dass Sie oft mehrere Seiten wie "nächste Seite" abkratzen.
Um mehrere Seiten zu kratzen, müssen Sie alle URLs der Seiten abrufen, die Sie kratzen möchten.
Die Übungswebseite hat unten eine Seitenzahl Da das Verbindungsziel für jedes festgelegt ist, scheint es gut, es zu erhalten. Die verknüpfte URL wird im href-Attribut des -Elements beschrieben.
for url in soup.find_all("a"):
print(url.get("href"))
import requests
from bs4 import BeautifulSoup
#Holen Sie sich die Übungswebseite von Aidemy
authority = "http://scraping.aidemy.net"
r = requests.get(authority)
#Mit lxml analysieren
soup = BeautifulSoup(r.text, "lxml")
#Links für Seitenübergänge finden<a>Holen Sie sich das Element
urls = soup.find_all("a")
# -----Die URL, die Sie kratzen möchten_Holen Sie sich zur Liste-----
url_list = []
# url_Fügen Sie die URL jeder Seite zur Liste hinzu
for url in urls:
url = authority + url.get("href")
url_list.append(url)
#Ausgabeliste
print(url_list)
Im vorherigen Abschnitt konnten wir die URLs auflisten, die wir erhalten wollten.
Wiederholen Sie das Scraping für jede der erfassten URLs Sie können verschiedene Informationen wie Fotoname und Alter erhalten.
Wenn Sie die erfassten Informationen in die Datenbank schreiben oder in eine Datei schreiben Es steht für die Datenverarbeitung zur Verfügung.
import urllib.request
import requests
from bs4 import BeautifulSoup
#Holen Sie sich die Übungswebseite von Aidemy
authority = "http://scraping.aidemy.net"
r = requests.get(authority)
#Mit lxml analysieren
soup = BeautifulSoup(r.text, "lxml")
#Links für Seitenübergänge finden<a>Holen Sie sich das Element
urls = soup.find_all("a")
# -----Die URL, die Sie kratzen möchten_Holen Sie sich zur Liste-----
url_list = []
# url_Fügen Sie die URL jeder Seite zur Liste hinzu
for url in urls:
url = authority + url.get("href")
url_list.append(url)
# -----Den Titel eines Fotos kratzen-----
#Erstellen Sie eine Scraping-Funktion
def scraping(url):
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "lxml")
#Antworte hier
photos = soup.find_all("h3")
photos_list = []
#Bitte vervollständigen Sie die folgenden Angaben
for photo in photos:
photo = photo.text
photos_list.append(photo)
return photos_list
for url in url_list:
print(scraping(url))
Recommended Posts