Scrapen der gewünschten Daten von der Website durch Verknüpfen von Python und Excel

Zweck des Schabens

Zunächst ist es wichtig zu sagen, was Sie mit der Technologie auch auf der Ebene kleiner Apps erreichen möchten.

Ich investiere hauptsächlich in Investment Trusts (im Folgenden als Investment Trust bezeichnet), aber in den letzten Jahren wurde eine Vielzahl von Investment Trust-Produkten verkauft, und ich frage mich nur.

"Ist das Produkt, das ich kaufe, wirklich gut?" "Ich denke, es gibt Produkte, die billiger und rentabler sind."

** Einmal im Jahr ** denkt über so etwas nach.

Aus diesem Grund suche ich auf der Investment Trust-Seite der Wertpapier-Website und vergleiche Produkte. Es gibt jedoch viele Punkte, die ich mir ansehen muss, z. B. den Standardpreis, das scharfe Verhältnis, die Kosten für die Verwaltung der Treuhandgebühren und sogar diejenigen, die die Suchbedingungen in gewissem Maße einschränken, sind 5 ~ Ich möchte ungefähr 10 vergleichen.

** Oh, ich möchte eine grobe Liste von Informationen in Tabellenform ...! ** **.

Dies ist der Zweck dieses Schabens.

Umgebung und Zielort

OS:Windows Programmiersprache: Python (3.8) Software: Excel (2016) Editor: Visual Studio-Code

Ein Beispiel für die Zielwebsite Jede Produktseite von Rakuten Securities (weil ich hauptsächlich Rakuten Securities verwende) https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000BRT6

Die Seitenstruktur ist für andere Produkte gleich.

Ich habe ** BeautifulSoup ** zum Scraping und ** Openpyxl ** zum Verknüpfen mit Excel verwendet. Der Grund, warum ich mich für diese Bibliotheken entschieden habe, war, dass ich nur nach ihnen gesucht habe und es viele Artikel gab, die diese Bibliotheken verwendeten. Es ist eine Faustregel für Anfänger, von einem Ort mit einer großen Menge an Informationen einzutreten. (Ich habe noch nie Python gemacht)

Offizielle Dokumentation BeautifulSoup https://www.crummy.com/software/BeautifulSoup/bs4/doc/ Openpyxl https://openpyxl.readthedocs.io/en/stable/tutorial.html

Vorbereitungen

Ich habe im Voraus eine Excel-Datei vorbereitet. WS000056.JPG

Artikel von links ・ Fondsname · Wertpapierfirma ・ Klassifizierung (z. B. ob es sich um inländische oder Industrieländer handelt) · Grundpreis ・ Nettovermögen (100 Millionen) ・ Letztes Mal Nettovermögen (100 Millionen) ・ Zunahme / Abnahme des Nettovermögens ・ Letzte Verteilung ・ Kaufgebühr ・ Verwaltungskostenquote (Kosten wie Treuhand- und Verwaltungsgebühren) ・ URL

Es wurde gemacht. Die Bedeutung der Elemente hängt nicht mit diesem Artikel zusammen, daher werde ich sie hier weglassen. Kurz gesagt, betrachten Sie es als einen Punkt zum Vergleichen der Spezifikationen von Investment Trusts. Es gibt tatsächlich noch viel mehr.

Übrigens haben "vorheriger Nettoinventarbetrag (100 Millionen)" und "Erhöhung / Verringerung des Nettovermögens" numerische Werte und Funktionen im Voraus festgelegt. Ich möchte die Differenz zwischen "Nettovermögen (100 Millionen)" und "vorherigem Nettovermögen (100 Millionen)" ziehen.

Da die "URL" auch im Voraus bekannt ist, werde ich sie von Anfang an schreiben.

Übrigens handelt es sich bei den diesmal zu erfassenden Daten ** nur um öffentliche Informationen, für die keine Anmeldung usw. erforderlich ist **. Ich erhalte keine Informationen darüber, welche Produkte ich gekauft habe, wie viel und wie viele.

Der Zweck ist nur, Finanzprodukte selbst zu vergleichen.

Schaben

Bereiten Sie sich zunächst auf die Verwendung von Beautiful Soup vor.

fund.py


import requests, bs4

Da davon ausgegangen wird, dass diesmal auf mehrere URLs in Rakuten Securities zugegriffen wird, wird im Voraus eine Methode definiert, die URLs als Argumente verwendet.

fund.py


#Rakuten Securities
def GetRakutenFund(url):
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")

Da wir bereits entschieden haben, welche Elemente wir erhalten möchten, definieren wir auch die Klasse.

fund.py


#Fondsinformationsklasse
class FundInfo:
    def __init__(self):
        self.name = ''
        self.company = ''
        self.category = ''
        self.baseprice = ''
        self.assets = 0
        self.allotment = 0
        self.commision = ''
        self.cost = 0

** Speichern Sie die von der GetRakutenFund-Methode erfassten Informationen in der FundInfo-Instanz **.

Holen Sie sich jetzt die Informationen, um die gewünschten Informationen von dieser Site zu erhalten. https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000BRT6

Obwohl es solide ist, werden wir die Elemente identifizieren, indem wir die Entwicklertools vollständig nutzen. Als Ergebnis wurde festgestellt, dass die Struktur wie folgt ist.

Artikelname Name der Klasse
Fondsname fund-name
Einstufung fund-type
Grundpreis value-01
Nettovermögen value-02
Letzte Verteilung value-02
Kaufgebühr no-fee
Verwaltungskostensatz Kein Klassenname

Wenn der Klassenname eindeutig ist, können Sie die Daten leicht abrufen, diesmal scheint dies jedoch nicht der Fall zu sein. Das Nettovermögen und die neuesten Ausschüttungen verwenden denselben Klassennamen und Der Verwaltungskostensatz hatte keinen Klassennamen.

Wenn ich es dieses Mal nicht durch den Klassennamen angeben konnte, habe ich so etwas wie ** das Element eine Ebene höher genommen und es in das Inhaltsarray eingefügt **. キャプチャ.PNG

Dieses Bild ist in einer Klasse namens tbl-fund-summary zusammengefasst. Daraus habe ich das Element mit dem Klassennamen value-02 extrahiert.

fund.py


fundsummary = soup.find("table", attrs={"class", "tbl-fund-summary"})
elements = fundsummary.find_all("span", attrs={"class", "value-02"})
fundinfo.assets = elements[0].text
fundinfo.allotment = elements[1].text

Wir konnten Elemente [0] als Nettoinventarbetrag und Elemente [1] als letzte Ausschüttung identifizieren.

Geben Sie die Verwaltungskostenquote auf die gleiche Weise an. キャプチャ2.PNG

Dieser Gegenstand war ein einzelner td-Gegenstand in der Klasse, die als Treuhandgebühr des li-Elements bezeichnet wurde.

fund.py


costs = soup.find("li", attrs={"class", "trust-fee"})
elements = costs.find_all("td")
fundinfo.cost = elements[0].text

Schließlich macht die GetRakutenFund-Methode Folgendes:

fund.py


#Rakuten Securities
def GetRakutenFund(url):
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")

    fundinfo = FundInfo()
    #Fondsname, Klassifizierung
    fundinfo.name = soup.select_one('.fund-name').text
    fundinfo.company = 'Rakuten'
    fundinfo.category = soup.select_one('.fund-type').text
    #Grundpreis, Nettovermögen, letzte Ausschüttung
    fundsummary = soup.find("table", attrs={"class", "tbl-fund-summary"})
    elemnt = fundsummary.select_one('.value-01')
    fundinfo.baseprice = elemnt.text + elemnt.nextSibling
    elements = fundsummary.find_all("span", attrs={"class", "value-02"})
    fundinfo.assets = elements[0].text
    fundinfo.allotment = elements[1].text
    #Verwaltungskosten wie Kauf- und Treuhandgebühren
    fundinfo.commision = soup.select_one('.no-fee').text
    costs = soup.find("li", attrs={"class", "trust-fee"})
    elements = costs.find_all("td")
    fundinfo.cost = elements[0].text

    return fundinfo

Wenn Sie mit dem Herumkratzen vertraut sind, sollte es eine intelligentere Beschreibungsmethode geben.

Und der Aufrufer der Methode. Da es von der Hauptverarbeitungsdatei getrennt ist, wird fund.py als Fonds importiert.

main.py


nam = fund.GetRakutenFund('https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000BRT6')

Verknüpfung mit Excel

Ich konnte die gewünschten Informationen als Instanz des FundInfo-Typs abrufen. Gießen Sie diese Daten in Excel.

Ich möchte Openpyxl verwenden, bitte installieren Sie es zuerst von Pip usw. Schreiben Sie nach der Installation eine Importanweisung.

exceloperator.py


import openpyxl

Definieren Sie dann eine Methode zur Durchführung der Excel-Verarbeitung.

exceloperator.py


def WriteExcel(fund_info_list):

Es gab ** 4 ** URLs, die ich vorher noch nicht geschrieben hatte, aber diesmal Informationen erhalten wollte. Daher möchte ich 4 FundInfo-Instanzen in einer Liste (fund_info_list) speichern, sie als Argumente an die Methode übergeben, die die Excel-Verarbeitung ausführt, und die Verarbeitung in einer Schleife durchführen.

Laden Sie zunächst das zuvor vorbereitete Excel. Holen Sie sich dann das Arbeitsblatt, das Sie verarbeiten möchten. In diesem Fall ist das Blatt "Fonds" das Ziel.

exceloperator.py


#r ignoriert die Escape-Sequenz
wb = openpyxl.load_workbook(r'Excel-Dateipfad')
ws = wb['Fonds']

Wenn ein Pfad als Argument angegeben wird, sind Schrägstriche usw. in einer Windows-Umgebung nicht gut. Wenn Sie r hinzufügen, wird die Escape-Sequenz ignoriert.

Jetzt müssen Sie nur noch jedes Element von FundInfo in der Liste auf die entsprechende Zelle setzen. In meinem Fall sind diesmal die 6. und 7. Spalte Elemente, um die Differenz zur vorherigen Bestätigung zu ermitteln, sodass ich die Daten nicht aktualisieren werde. Es schien eine Möglichkeit zu geben, sie in ein Array zu packen, aber vorerst habe ich die Methode gewählt, sie einzeln festzulegen.

exceloperator.py


row = 2
for fund in fund_info_list:
    col = 1
    #Die 6. und 7. Spalte können nicht aktualisiert werden
    ws.cell(column=col, row=row, value=fund.name)
    col += 1
    ws.cell(column=col, row=row, value=fund.company)
    col += 1
    ws.cell(column=col, row=row, value=fund.category)
    col += 1
    ws.cell(column=col, row=row, value=fund.baseprice)
    col += 1
    ws.cell(column=col, row=row, value=float(fund.assets.replace(',', '')))
    col += 3
    ws.cell(column=col, row=row, value=int(fund.allotment))
    col += 1
    if fund.commision == 'Keiner':
        ws.cell(column=col, row=row, value=0)
    else:
        ws.cell(column=col, row=row, value=fund.commision)
    col += 1
    ws.cell(column=col, row=row, value=fund.cost)
    row += 1

Eine andere Sache, die zu beachten ist, ist, dass ich den Nettoinventarbetrag (Vermögenswerte) und die letzte Verteilung (Zuteilung) als numerischen Typ behandeln möchte, also konvertiere ich sie numerisch und setze sie in die Zelle. Da die Möglichkeit besteht, dass der Nettoinventarbetrag ein durch 1000 getrenntes Komma enthält, haben wir einen Prozess zum Entfernen des Kommas hinzugefügt. Die Kaufgebühr wird auf der Website als "Keine" angegeben (ich kaufe sie nur), aber es ist einfacher, sie als 0 Yen zu behandeln als "Keine", daher konvertiere ich sie hier.

Oh, ich möchte ein Inkrement ... (C # er murmelt)

Speichern Sie es am Ende richtig. Wenn Sie den Pfad der geöffneten Datei angeben, wird diese überschrieben und gespeichert.

exceloperator.py


wb.save(r'Excel-Dateipfad')

Der ganze Code

Es ist ein Anfänger, der nicht schön ist, also schauen Sie bitte.

main.py


import fund, exceloperator

#Hauptfunktion
#<Keine Kauf- / Bargebühren> Nissei TOPIX Index Fund
nam = fund.GetRakutenFund('https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000BRT6')
#Tawara No Road Bestand in Industrieländern
am_one = fund.GetRakutenFund('https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000CMK4')
#eMAXIS Slim Emerging Market Aktienindex
emax_emarging = fund.GetRakutenFund('https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000F7H5')
#eMAXIS Slim US-Aktie (S & P500)
emax_sp500 = fund.GetRakutenFund('https://www.rakuten-sec.co.jp/web/fund/detail/?ID=JP90C000GKC6')

#Schreiben Sie an EXCEL
fund_info_list = [nam, am_one, emax_emarging, emax_sp500]
exceloperator.WriteExcel(fund_info_list)

fund.py


#Schaben mit schöner Suppe 4
import requests, bs4

#Fondsinformationsklasse
class FundInfo:
    def __init__(self):
        self.name = ''
        self.company = ''
        self.category = ''
        self.baseprice = ''
        self.assets = 0
        self.allotment = 0
        self.commision = ''
        self.cost = 0
    
#Rakuten Securities
def GetRakutenFund(url):
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")

    fundinfo = FundInfo()
    #Fondsname, Klassifizierung
    fundinfo.name = soup.select_one('.fund-name').text
    fundinfo.company = 'Rakuten'
    fundinfo.category = soup.select_one('.fund-type').text
    #Grundpreis, Nettovermögen, letzte Ausschüttung
    fundsummary = soup.find("table", attrs={"class", "tbl-fund-summary"})
    elemnt = fundsummary.select_one('.value-01')
    fundinfo.baseprice = elemnt.text + elemnt.nextSibling
    elements = fundsummary.find_all("span", attrs={"class", "value-02"})
    fundinfo.assets = elements[0].text
    fundinfo.allotment = elements[1].text
    #Verwaltungskosten wie Kauf- und Treuhandgebühren
    fundinfo.commision = soup.select_one('.no-fee').text
    costs = soup.find("li", attrs={"class", "trust-fee"})
    elements = costs.find_all("td")
    fundinfo.cost = elements[0].text

    return fundinfo

exceloperator.py


#Excel-Operation mit openpyxl
import openpyxl

def WriteExcel(fund_info_list):
    #r ignoriert die Escape-Sequenz
    wb = openpyxl.load_workbook(r'Excel-Dateipfad')
    ws = wb['Fonds']
    
    row = 2
    for fund in fund_info_list:
        col = 1
        #Die 6. und 7. Spalte können nicht aktualisiert werden
        ws.cell(column=col, row=row, value=fund.name)
        col += 1
        ws.cell(column=col, row=row, value=fund.company)
        col += 1
        ws.cell(column=col, row=row, value=fund.category)
        col += 1
        ws.cell(column=col, row=row, value=fund.baseprice)
        col += 1
        ws.cell(column=col, row=row, value=float(fund.assets.replace(',', '')))
        col += 3
        ws.cell(column=col, row=row, value=int(fund.allotment))
        col += 1
        if fund.commision == 'Keiner':
            ws.cell(column=col, row=row, value=0)
        else:
            ws.cell(column=col, row=row, value=fund.commision)
        col += 1
        ws.cell(column=col, row=row, value=fund.cost)
        row += 1

    wb.save(r'Excel-Dateipfad')

Excel-Datei nach dem Scraping

WS000055.JPG

Impressionen

Möglicherweise haben Sie zum ersten Mal anständigen Python-Code geschrieben. Ich bin froh, dass ich die gewünschte Bewegung erreichen konnte. Ich habe immer noch viel Grammatik ...

Solange meine Hauptaufgabe das Geschäft ist, ist es schwierig, die Technologie zu schreiben, die ich bei der Arbeit verwende ... Es gibt nicht viele Geschichten im Job, die ich verrückt schreiben kann.

Er sagte, dass Excel auch seine Zusammenarbeit mit Python verstärken wird. (Ist es besser, xlwings zu verwenden?) Eigentlich liebe ich Excel insgeheim. Wenn ich also Excel verwenden kann, möchte ich es weiterhin verwenden. (Verlangen)

Recommended Posts

Scrapen der gewünschten Daten von der Website durch Verknüpfen von Python und Excel
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
(Sonstige Hinweise) Datenaktualisierungsmuster von der CSV-Datenerfassung / -verarbeitung durch Python nach Excel
Führen Sie Python aus Excel aus
Das von Python berechnete VIF und das von Excel berechnete VIF sind unterschiedlich.
Sammeln Sie Daten zum maschinellen Lernen, indem Sie aus biobasierten öffentlichen Datenbanken kratzen
Visualisieren Sie die Pflanzenaktivität aus dem Weltraum mithilfe von Satellitendaten und Python
[Python] Zufällige Datenextraktion / -kombination aus DataFrame mit Random und Pandas
Automatische Erfassung von Genexpressionsdaten durch Python und R.
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Lesen Sie die Excel-Tabelle und wiederholen Sie den Prozess zeilenweise Python VBA
Scraping mit Node, Ruby und Python
Python, Ausbeute, Rückkehr und manchmal Ausbeute von
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
Lesen und verwenden Sie Python-Dateien aus Python
Über Python, aus und importieren, als
Hashing von Daten in R und Python
[Python] Informationen zu Scraping-Objektiven von price.com
Extrahieren und zeichnen Sie die neuesten Bevölkerungsdaten aus den von der Stadt bereitgestellten PDF-Daten
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
[Python] Eine Geschichte über das Sammeln von Twitter-Kontonamen aus Handle-Namen (wie @ 123456) durch Kombinieren von BeautifulSoup- und Excel-Eingabe / Ausgabe.
Ich habe versucht, Konversationsdaten von ASKfm zu kratzen
Abrufen von Eigenschaftsinformationen durch Scraping mit Python
Datenpipeline-Aufbau mit Python und Luigi
Empfangen Sie Textdaten von MySQL mit Python
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Socket-Kommunikation und Multithread-Verarbeitung durch Python
Verwenden Sie den PostgreSQL-Datentyp (jsonb) von Python
Python: Lesen von JSON-Daten von der Web-API
Konvertieren Sie Excel-Daten mit Python in JSON
Python-Datenstruktur und interne Implementierung ~ Liste ~
Struktur und Betrieb der Python-Daten (Python-Lernnotiz ③)
Portieren und Ändern des Doublet-Solvers von Python2 auf Python3.
[Python] Webanwendung von 0! Hands-on (4) -Datenformung-
Scraping von Websites mit JavaScript in Python
Zeichnen Sie Daten einfach in Shell und Python
Scraping von einer authentifizierten Site mit Python
Socket-Kommunikation in C-Sprache und Python
Organisieren Sie mit Python nach Ordnern getrennte Daten
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Üben des Web-Scrapings mit Python und Selen
Einfaches Web-Scraping mit Python und Ruby
[Hinweis] Führen Sie Python-Code aus Excel aus (xlwings)
[Python] Lesen Sie die HTML-Datei und üben Sie das Scraping
Durch Verknüpfen von Maya mit Excel oder Tabellenkalkulationen ~
Kommunikation verschlüsselter Daten zwischen Python und C #
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Python - Lesen Sie Daten aus einer numerischen Datendatei und suchen Sie die multiple Regressionslinie.
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Maschinelles Lernen mit Docker (40) mit Anaconda (40) "Hands-On Data Science und Python Machine Learning" von Frank Kane