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.
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
Ich habe im Voraus eine Excel-Datei vorbereitet.
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.
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 **.
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.
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')
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')
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')
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