Ich möchte eine Einführung in die Praxis des Web Scraping mit Python schreiben.
Mit Ausnahme des allgemeinen Teils möchte ich einen Stil wählen, der das Fühlen versteht.
Schließlich: "Greifen Sie stündlich auf den Nihon Keizai Shimbun zu und notieren Sie den durchschnittlichen Nikkei-Aktienkurs zu diesem Zeitpunkt in CSV."
Ich möchte ein Programm machen.
Es ist eine Notiz. Lesen Sie es sorgfältig. [Fall der Zentralbibliothek der Stadt Okazaki (Librahack-Fall) - Wikipedia](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B % E4% B8% AD% E5% A4% AE% E5% 9B% B3% E6% 9B% B8% E9% A4% A8% E4% BA% 8B% E4% BB% B6) Liste der Vorsichtsmaßnahmen für das Web-Scraping
Sprache: Python 2.7.12 Bibliotheken: urllib2, BeautifulSoup, csv, datetime, time
urllib2 ist erforderlich, um auf die URL zuzugreifen. BeautifulSoup ist wie ein XML-Parser, der die Dateien öffnet, auf die Sie zugreifen und die Sie erhalten Diese Bibliothek wird benötigt, wenn Sie mit CSV-Dateien arbeiten. datetime ist eine Bibliothek zum Abrufen von Zeit
urllib2 wird installiert, wenn Sie Python installieren. Verwenden Sie den Befehl pip, um Beautiful Soup zu installieren
shell.sh
$ pip install beautifulsoup4
Greifen Sie zunächst mit Python auf den Nihon Keizai Shimbun zu und holen Sie sich den HTML-Code.
Machen Sie es danach zu einer Form, die von Beautiful Soup verarbeitet werden kann.
Der Seitentitel wird aus dem Formular abgerufen, das verarbeitet und ausgegeben werden kann.
Auch dieses Mal kann es schwierig sein, das Bild zu verstehen, wenn Sie nur den Titel der Seite erhalten. Daher möchte ich das Titelelement und den Titel aus den Titelelementen erhalten.
getNikkeiWebPageTitle.py
# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup
#URL für den Zugriff
url = "http://www.nikkei.com/"
#HTML für den Zugriff auf die URL wird zurückgegeben →<html><head><title>Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version</title></head><body....
html = urllib2.urlopen(url)
#Behandeln Sie HTML mit schöner Suppe
soup = BeautifulSoup(html, "html.parser")
#Holen Sie sich das Titelelement →<title>Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version</title>
title_tag = soup.title
#Elementzeichenfolge abrufen → Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version
title = title_tag.string
#Titelelement ausgeben
print title_tag
#Titel als Zeichenfolge ausgeben
print title
Wenn Sie dies tun, werden die folgenden Ergebnisse zurückgegeben:
shell.sh
$ python getNikkeiWebPageTitle.py
<title>Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version</title>
Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version
Apropos
print.py
print soup.title.string
Ähnliche Ergebnisse können auch in diesem Fall erhalten werden.
Ich denke, Sie haben eine ungefähre Vorstellung davon.
Das Ziel dieses Mal ist es, "stündlich auf den Nihon Keizai Shimbun zuzugreifen und den durchschnittlichen Aktienkurs von Nikkei zu diesem Zeitpunkt in CSV aufzuzeichnen". Wenn Sie den Programmablauf überprüfen
Header wird nicht für CSV verwendet.
Machen wir das.
Rufen Sie zunächst die Seite mit dem durchschnittlichen Aktienkurs von Nikkei auf.
Die Theorie ist, die URL im Voraus selbst im Browser nachzuschlagen.
Wenn Sie es nachschlagen, finden Sie es auf der Seite "Nihon Keizai Shimbun-> Market-> Stock".
Ich werde das vorherige Programm verwenden
getNikkeiHeikin.py
# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup
#URL für den Zugriff
url = "http://www.nikkei.com/markets/kabu/"
#HTML für den Zugriff auf die URL wird zurückgegeben →<html><head><title>Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version</title></head><body....
html = urllib2.urlopen(url)
#Behandeln Sie HTML mit schöner Suppe
soup = BeautifulSoup(html, "html.parser")
#Titel als Zeichenfolge ausgeben
print soup.title.string
Dies gibt den Titel aus.
shell.sh
$ python getNikkiHeikin.py
>>Lagerbestand: Markt: Nikkei elektronische Version
Als nächstes erhalten Sie den durchschnittlichen Aktienkurs von Nikkei.
Lassen Sie uns Nihon Keizai Shimbun> Markt> Aktie in Ihrem Browser öffnen.
Der durchschnittliche Aktienkurs von Nikkei ist von oben nach unten auf dieser Seite aufgeführt.
Um dies zu erreichen, müssen wir den Speicherort dieser Daten in HTML finden.
Klicken Sie mit der rechten Maustaste auf den durchschnittlichen Aktienkurs von Nikkei und klicken Sie auf "Überprüfen".
Dann denke ich, dass der Bildschirm so aussehen wird
Class = "mkc-stock_prices" im span-Element.
Jetzt kennen Sie die Position.
Lassen Sie uns tatsächlich mit Beautiful Soup drucken.
getNikeiHeikin.py
# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup
#URL für den Zugriff
url = "http://www.nikkei.com/markets/kabu/"
#HTML für den Zugriff auf die URL wird zurückgegeben →<html><head><title>Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version</title></head><body....
html = urllib2.urlopen(url)
#Behandeln Sie HTML mit schöner Suppe
soup = BeautifulSoup(html, "html.parser")
#Alle Span-Elemente extrahieren → Alle Span-Elemente werden im Array zurückgegeben →[<span class="m-wficon triDown"></span>, <span class="l-h...
span = soup.find_all("span")
#Deklarieren Sie es zuerst, damit beim Drucken kein Fehler auftritt.
nikkei_heikin = ""
#Klasse von allen Span-Elementen für Minuten="mkc-stock_prices"Suchen Sie nach dem, der geworden ist
for tag in span:
#Elemente, für die keine Klasse festgelegt ist, sind Tags.get("class").pop(0)Vermeiden Sie den Fehler mit try, da dies zu einem Fehler führt, da dies nicht möglich ist
try:
#Klasse vom Tag="n"Extrahieren Sie die n-Zeichenfolge von. Da können mehrere Klassen gesetzt werden
#Die Funktion get gibt als Array zurück. Also die Array-Funktion Pop(0)Entfernt den Anfang der Sequenz um
# <span class="hoge" class="foo"> → ["hoge","foo"] → hoge
string_ = tag.get("class").pop(0)
#Mkc in der extrahierten Klassenzeichenfolge-stock_Überprüfen Sie, ob es als Preise festgelegt ist
if string_ in "mkc-stock_prices":
# mkc-stock_Da die Preise festgelegt sind, wird die Zeichenfolge in Tags eingeschlossen.Beginnen Sie mit einer Zeichenfolge
nikkei_heikin = tag.string
#Da die Extraktion abgeschlossen ist, werde ich für Minuten beenden
break
except:
#Pfad → Nichts tun
pass
#Gibt den extrahierten durchschnittlichen Nikkei-Aktienkurs aus.
print nikkei_heikin
Ergebnis
shell.sh
$ python getNikeiHeikin.py
>>18,513.12
Die Erklärung des Codes wird grundsätzlich in den Kommentar eingefügt
Um den Fluss einfach auszudrücken
Es ist ein Fluss.
Der Ablauf dieses Programms kann in den meisten Situationen verwendet werden Der Vorteil ist, dass es nicht so schwierig ist und in den meisten Situationen angewendet werden kann. Wenn sich das span-Element in ein anderes Element ändert oder sich der Inhalt der Klasse ändert, kann es nicht ausgegeben werden.
Geben Sie dieses Ergebnis an csv aus und wiederholen Sie es jede Stunde
getNikeiHeikin.py
# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup
from datetime import datetime
import csv
import time
time_flag = True
#Lass es für immer laufen
while True:
#Wenn die Zeit nicht 59 Minuten beträgt, warten Sie 58 Sekunden
if datetime.now().minute != 59:
#1 Minute, weil es nicht 59 Minuten sind(58 Sekunden)Warten Sie eine Weile(誤差がないとは言い切れないので58 Sekundenです)
time.sleep(58)
continue
#Öffnen Sie csv im Append-Modus → Öffnen Sie csv hier, da das Öffnen von csv einige Zeit in Anspruch nimmt, wenn die Datei groß wird
f = open('nikkei_heikin.csv', 'a')
writer = csv.writer(f, lineterminator='\n')
#Es sind 59 Minuten, aber ich kann erst in Sekundenschnelle nach 59 Sekunden aussteigen, um zur richtigen Zeit zu messen.
while datetime.now().second != 59:
#Warten Sie 1 Sekunde, da es nicht 00 Sekunden sind
time.sleep(1)
#Der Vorgang wird schnell abgeschlossen und zweimal wiederholt. Warten Sie hier eine Sekunde.
time.sleep(1)
#Erstellen Sie einen Datensatz, der in csv beschrieben werden soll
csv_list = []
#Holen Sie sich die aktuelle Zeit in Jahr, Monat, Tag, Stunde, Minute, Sekunde
time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
#Fügen Sie die Zeit in die erste Spalte ein
csv_list.append(time_)
#URL für den Zugriff
url = "http://www.nikkei.com/markets/kabu/"
#HTML für den Zugriff auf die URL wird zurückgegeben →<html><head><title>Wirtschafts-, Aktien-, Geschäfts- und politische Nachrichten:Nikkei elektronische Version</title></head><body....
html = urllib2.urlopen(url)
#Behandeln Sie HTML mit schöner Suppe
soup = BeautifulSoup(html, "html.parser")
#Alle Span-Elemente extrahieren → Alle Span-Elemente werden im Array zurückgegeben →[<span class="m-wficon triDown"></span>, <span class="l-h...
span = soup.find_all("span")
#Deklarieren Sie es zuerst, damit beim Drucken kein Fehler auftritt.
nikkei_heikin = ""
#Klasse von allen Span-Elementen für Minuten="mkc-stock_prices"Suchen Sie nach dem, der geworden ist
for tag in span:
#Elemente, für die keine Klasse festgelegt ist, sind Tags.get("class").pop(0)Vermeiden Sie den Fehler mit try, da dies zu einem Fehler führt, da dies nicht möglich ist
try:
#Klasse vom Tag="n"Extrahieren Sie die n-Zeichenfolge von. Da können mehrere Klassen gesetzt werden
#Die Funktion get gibt als Array zurück. Also die Array-Funktion Pop(0)Entfernt den Anfang der Sequenz um
# <span class="hoge" class="foo"> → ["hoge","foo"] → hoge
string_ = tag.get("class").pop(0)
#Mkc in der extrahierten Klassenzeichenfolge-stock_Überprüfen Sie, ob es als Preise festgelegt ist
if string_ in "mkc-stock_prices":
# mkc-stock_Da die Preise festgelegt sind, wird die Zeichenfolge in Tags eingeschlossen.Beginnen Sie mit einer Zeichenfolge
nikkei_heikin = tag.string
#Da die Extraktion abgeschlossen ist, werde ich für Minuten beenden
break
except:
#Pfad → Nichts tun
pass
#Der extrahierte durchschnittliche Nikkei-Aktienkurs wird im Laufe der Zeit ausgegeben.
print time_, nikkei_heikin
#Notieren Sie den Nikkei-Durchschnitt in der zweiten Spalte
csv_list.append(nikkei_heikin)
#Zu csv hinzufügen
writer.writerow(csv_list)
#Schließen, um eine Beschädigung der Datei zu verhindern
f.close()
Im Fluss sprechen
Deshalb
Wenn Sie dies weiterhin tun, wird einmal pro Stunde darauf zugegriffen, um den Nikkei-Durchschnitt zu ermitteln und aufzuzeichnen.
Sie können alles tun, indem Sie dies anwenden
Beispielsweise können Sie zum Zeitpunkt des Verkaufs in einem langen Fluss in Südamerika einen Wagen mit hoher Geschwindigkeit (sogenannte Skriptgruppe) hinzufügen. .. ..
Ich empfehle es nicht sehr
Dann!
Sammlung von Python-Web-Scraping-Techniken "Es gibt keinen Wert, der nicht abgerufen werden kann" JavaScript-Unterstützung [10.000 Anfragen pro Sekunde !?] Explosives Web-Scraping beginnend mit der Sprache Go [Golang] [Für Anfänger] Betreff: Genetischer Algorithmus ab Null [Künstliche Intelligenz]
Recommended Posts