Web Scraping für Anfänger in Python (1) Verbesserte Version

Dieser Artikel ist eine quellenverbesserte Version des vorherigen Artikels Web-Scraping für Anfänger mit Python (1). Durch die Änderung der Verwendung der bs4-Methode konnte ich die Tatsache verbessern, dass beim Extrahieren von Schlagzeilen von Yahoo News am Ende zusätzliche Dinge angezeigt werden. Dies ist also ein Memo.

Roadmap zum Erlernen des Web Scraping in Python

(1) Schaffen Sie das Zielmaterial vorerst erfolgreich vor Ort ab. ← Immer noch hier </ font> (2) Verknüpfen Sie die Ergebnisse von lokal abgekratzt mit einer Google-Tabelle. (3) cron wird automatisch lokal ausgeführt. (4) Fordern Sie die kostenlose automatische Ausführung auf dem Cloud-Server heraus. (Google Compute Engine) (5) Fordern Sie die kostenlose automatische Ausführung ohne Server in der Cloud heraus. (Vielleicht Cloud-Funktionen + Cloud Scheduler)

Funktionen des Beispiel-PGM (1)

・ Erhalten Sie Website-Informationen mithilfe von Anfragen ・ Analysieren Sie HTML mit Beautiful Soup ~~ ・ Suchen Sie mit der Bibliothek nach einer bestimmten Zeichenfolge, die nach Zeichenfolgen suchen kann (Überschriften-News identifizieren) ~~ </ font> ・ Extrahieren Sie Titel und Links eindeutig nur mit der bs4-Methode </ font>

  • Zeigen Sie alle Nachrichtentitel und Links aus der Liste der erfassten Ergebnisse auf der Konsole an

Vorherige Beispielquelle

requests-test.py


import requests
from bs4 import BeautifulSoup
import re

#Laden Sie Website-Informationen mithilfe von Anfragen herunter
url = 'https://news.yahoo.co.jp/'
response = requests.get(url)
#print(response.text)
print('url: ',response.url)
print('status-code:',response.status_code) #Normalerweise HTTP-Statuscode[200 OK]
print('headers[Content-Type]:',response.headers['Content-Type']) #Da Header ein Wörterbuch sind, können Sie den Schlüssel zum Inhalt angeben-Typ Ausgabe
print('encoding: ',response.encoding) #Codierung

#BeautifulSoup()Website-Informationen und Parser erworben in"html.parser"geben
soup = BeautifulSoup(response.text, "html.parser")

#Im href-Attribut"news.yahoo.co.jp/pickup"Extrahieren Sie nur diejenigen, die enthalten
elems = soup.find_all(href = re.compile("news.yahoo.co.jp/pickup"))

#Der Titel und der Link der extrahierten Nachrichten werden auf der Konsole angezeigt.
for elem in elems:
    print(elem.contents[0])
    print(elem.attrs['href'])

Diese Beispielquelle

Suchen Sie die Klasse'topicsList mit der CSS-Auswahl Find_all'li'tag Finde den Tag

requests-test.py


import requests
from bs4 import BeautifulSoup

#Laden Sie Website-Informationen mithilfe von Anfragen herunter
url = 'https://news.yahoo.co.jp/'
response = requests.get(url)

#BeautifulSoup()Website-Informationen und Parser erworben in"html.parser"geben
soup = BeautifulSoup(response.text, "html.parser")
print('soup: ',type(soup))

topicsindex = soup.find('div', class_='topicsList')
#topicsindex = soup.find('div', attrs={'class': 'topicsList'})
print('topicsindex: ',type(topicsindex))

####Weise(1)
#Drehen Sie nach dem Extrahieren mit li, während Sie a mit der for-Anweisung extrahieren
topics = topicsindex.find_all('li')
#print(topics)
print('topics',type(topics))

#Der Titel und der Link der extrahierten Nachrichten werden auf der Konsole angezeigt.
for topic in topics:
    print(topic.find('a').contents[0])
    print(topic.find('a').attrs['href'])

####Weise(2)
#Nachdem Sie das a-Tag in der Listeneinschlussnotation extrahiert haben, drehen Sie es mit der for-Anweisung
headlines = [i.find('a') for i in topicsindex.find_all('li')]
print(headlines)
print(type(headlines))
#Der Titel und der Link der extrahierten Nachrichten werden auf der Konsole angezeigt.
for headline in headlines:
    print(headline.contents[0])
    print(headline.attrs['href'])

Dieses Mal habe ich auch gelernt, wie man bs4 auf verschiedene Arten extrahiert. Entwickeln Sie eine Strategie, während Sie das HTML von Yahoo! News grob analysieren, das schwierig und schwer zu verstehen ist. スクリーンショット 2020-09-12 17.58.47.png

Die Hauptthemen der Top-News sind

  • Definieren Sie in der Klasse "TopicsList" </ font> ・ </ font>, während Nachrichten mit dem darin enthaltenen Zeichen verbunden werden -Links werden mit dem href-Attribut des 'a'tag <grüner Rahmen> </ font> angehängt Da es sich um eine Komposition handelt, ist es eine Strategie, sie der Reihe nach herauszuziehen.

Der Code um Suppe und Fund ist unten.

requests-test.py


soup = BeautifulSoup(response.text, "html.parser")
topicsindex = soup.find('div', class_='topicsList')
topics = topicsindex.find_all('li')
for topic in topics:    
    print(topic.find('a').contents[0])
    print(topic.find('a').attrs['href'])

Das Folgende ist ein Ausdruck dieses Attributs.

requests-test.py


print('soup: ',type(soup))
print('topicsindex: ',type(topicsindex))
print('topics: ',type(topics))
print('topic: ',type(topic))

Klicken Sie hier für die Ergebnisse.

bash


soup:  <class 'bs4.BeautifulSoup'>
topicsindex:  <class 'bs4.element.Tag'>
topics:  <class 'bs4.element.ResultSet'>
topic:  <class 'bs4.element.Tag'>

Der Suppenzustand ist das Objekt 'Schöne Suppe', Der Zustand, in dem die Klasse mit dem CSS-Selektor gefunden wird, ist das 'Tag'-Objekt. Das li-Tag find_all ist ein 'ResultSet'-Objekt (obwohl es in der Dokumentation nicht enthalten ist). Sie können sehen, dass das Listentyp "ResultSet" vom Python-Typ und seine einzelnen Elemente auch "Tag" -Objekte sind. Da jedes Element'topic'of'topics 'ein Tag-Objekt ist, können Methoden wie find verwendet werden. Der Zeichenfolgenteil (dh der Nachrichtentitel), der von Tags im Inhalt umgeben ist. Das href-Attribut kann auch extrahiert werden.

Wie es geht (1) Drehen Sie nach dem Extrahieren mit dem li-Tag, während Sie das a-Tag mit der for-Anweisung extrahieren Methode (2) Nachdem Sie das a-Tag in der Listeneinschlussnotation extrahiert haben, drehen Sie es mit der for-Anweisung Ich habe zwei ausprobiert, aber beide liefern das gleiche Ergebnis. Themen mit Fotos wie beim letzten Mal werden nicht mehr auf seltsame Weise extrahiert!

bash


Docomo-Konto Informationen von gefälschten HP erhalten?
https://news.yahoo.co.jp/pickup/6370962
Politische Worte, um zurückzutreten
https://news.yahoo.co.jp/pickup/6370953
Zwei Menschen starben in Flammen nach einem Autounfall in Hakone
https://news.yahoo.co.jp/pickup/6370970
Im alten Grabhügel?Hinweis in der HP Umfragekarte
https://news.yahoo.co.jp/pickup/6370965
Gehirnkrankheit bei der fetalen ausgewählten Abtreibung
https://news.yahoo.co.jp/pickup/6370957
Berge von Altmetall in den Vororten Warum
https://news.yahoo.co.jp/pickup/6370958
Fujii 2 Kronen Wand 5 aufeinanderfolgende Niederlagen gegen Toyoshima Ryuo
https://news.yahoo.co.jp/pickup/6370961
Der 17-jährige "neue und jüngste Spieler" wird geboren
https://news.yahoo.co.jp/pickup/6370964

Übrigens ist die Person, die das a-Tag im Voraus mit Methode (2) extrahiert hat, ein gewöhnliches Objekt vom Typ "Liste". Wenn Sie sich die Elementüberprüfung von Chrom ansehen, können Sie nichts verstehen, Wenn Sie es bisher extrahieren, können Sie sehen, dass es eine einfache Form ist, die für Anfänger einfach ist.

bash


<class 'list'>
[<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:1;" href="https://news.yahoo.co.jp/pickup/6370962">Docomo-Konto Informationen von gefälschten HP erhalten?</a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:2;" href="https://news.yahoo.co.jp/pickup/6370953">Politische Worte, um zurückzutreten<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:3;" href="https://news.yahoo.co.jp/pickup/6370970">Zwei Menschen starben in Flammen nach einem Autounfall in Hakone<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:4;" href="https://news.yahoo.co.jp/pickup/6370965">Im alten Grabhügel?Hinweis in der HP Umfragekarte</a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:5;" href="https://news.yahoo.co.jp/pickup/6370957">Gehirnkrankheit bei der fetalen ausgewählten Abtreibung<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:6;" href="https://news.yahoo.co.jp/pickup/6370958">Berge von Altmetall in den Vororten Warum<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:7;" href="https://news.yahoo.co.jp/pickup/6370961">Fujii 2 Kronen Wand 5 aufeinanderfolgende Niederlagen gegen Toyoshima Ryuo</a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:8;" href="https://news.yahoo.co.jp/pickup/6370964">Der 17-jährige "neue und jüngste Spieler" wird geboren</a>]

Nachwort

Dieses Mal habe ich verschiedene Dinge ausprobiert, während ich mir das offizielle Dokument angesehen habe. Der königliche Weg besteht darin, einen Blick auf die Websites unserer Vorgänger zu werfen und auf diese zu verweisen, während die offiziellen Dokumente im Mittelpunkt stehen. https://www.crummy.com/software/BeautifulSoup/bs4/doc/ (Englisch: Beautiful Soup Version 4.9.1 vom 13. September 2020) http://kondou.com/BS4/ (Japanisch: Beautiful Soup Version 4.2.0 vom 13. September 2020)

Recommended Posts