[PYTHON] Crawlen der Website eines Wertpapierunternehmens

Einführung

In letzter Zeit ist Crawlen in der Community, der ich angehöre, sehr beliebt, deshalb wollte ich es selbst ausprobieren.

Erstens ist der Zielbildschirm. スクリーンショット 2019-12-21 9.46.50.png Kannst du alleine kriechen und wütend werden? In Bezug auf diesen Punkt denke ich, dass es kein Problem gibt, wenn es auf keiner Website für kommerzielle Zwecke verwendet wird, daher würde ich gerne glauben, dass es in Ordnung ist. Jetzt möchte ich den "Investment Index" auf diesem Bildschirm crawlen.

Ausführungsumgebung, Tools

Die Ausführungsumgebung ist wie folgt

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.1
BuildVersion:	19B88

$ python --version
Python 3.7.4

Das Tool verwendet weiterhin "Schöne Suppe". Installieren Sie das Paket über den Befehl pip.

$ pip install beautifulsoup4

Andere Pakete verwenden "Anfragen" für den Site-Zugriff.

Login, Seitenzugriff

Implementieren Sie den Anmeldevorgang, da für den zu crawlenden Bildschirm eine Anmeldung erforderlich ist. Gleichzeitig wird die Zugriffsverarbeitung auf den Zielbildschirm implementiert. Es ist so.

app.py


class Scraper():

    def __init__(self, user_id, password):
        self.base_url = "https://site1.sbisec.co.jp/ETGate/"
        self.user_id = user_id
        self.password = password
        self.login()

    def login(self):
        post = {
                'JS_FLG': "0",
                'BW_FLG': "0",
                "_ControlID": "WPLETlgR001Control",
                "_DataStoreID": "DSWPLETlgR001Control",
                "_PageID": "WPLETlgR001Rlgn20",
                "_ActionID": "login",
                "getFlg": "on",
                "allPrmFlg": "on",
                "_ReturnPageInfo": "WPLEThmR001Control/DefaultPID/DefaultAID/DSWPLEThmR001Control",
                "user_id": self.user_id,
                "user_password": self.password
                }
        self.session = requests.Session()
        res = self.session.post(self.base_url, data=post)
        res.encoding = res.apparent_encoding

    def financePage_html(self, ticker):
        post = {
                "_ControlID": "WPLETsiR001Control",
                "_DataStoreID": "DSWPLETsiR001Control",
                "_PageID": "WPLETsiR001Idtl10",
                "getFlg": "on",
                "_ActionID": "stockDetail",
                "s_rkbn": "",
                "s_btype": "",
                "i_stock_sec": "",
                "i_dom_flg": "1",
                "i_exchange_code": "JPN",
                "i_output_type": "0",
                "exchange_code": "TKY",
                "stock_sec_code_mul": str(ticker),
                "ref_from": "1",
                "ref_to": "20",
                "wstm4130_sort_id": "",
                "wstm4130_sort_kbn":  "",
                "qr_keyword": "",
                "qr_suggest": "",
                "qr_sort": ""
                }

        html = self.session.post(self.base_url, data=post)
        html.encoding = html.apparent_encoding
        return html

    def get_fi_param(self, ticker):
        html = self.financePage_html(ticker)
        soup = BeautifulSoup(html.text, 'html.parser')
        print(soup)

Ausführen mit "Benutzer-ID", "Passwort" und Wertpapiernummer als Argumenten. Der Anmelde- und Seitenzugriff ist einfach. Ich verwende die Post-Informationen aus der URL und dem "Anfragen" -Paket. Ich habe versucht, das Zugriffsergebnis als Text mit der Funktion BeautifulSoup (html.text, 'html.parser') auszugeben, um zu überprüfen, ob ordnungsgemäß darauf zugegriffen wurde.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html lang="ja">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="text/css" http-equiv="Content-Style-Type"/>
<meta content="text/javascript" http-equiv="Content-Script-Type"/>
<meta content="IE=EmulateIE8" http-equiv="X-UA-Compatible"/><!--gethtml content start-->
<!-- header_domestic_001.html/// -->
・
・
・
<h4 class="fm01"><em>Investitionsindex</em> 20/09. Amtszeit (Ries)</h4>
</div>
</div>
<div class="mgt5" id="posElem_19-1">
<table border="0" cellpadding="0" cellspacing="0" class="tbl690" style="width: 295px;" summary="Investitionsindex">
<col style="width:75px;"/>
<col style="width:70px;"/>
<col style="width:80px;"/>
<col style="width:65px;"/>
<tbody>
<tr>
<th><p class="fm01">Erwartete PER</p></th>
<td><p class="fm01">23.86 mal</p></td>
<th><p class="fm01">Erwartetes EPS</p></th>
<td><p class="fm01">83.9</p></td>
</tr>
<tr>
<th><p class="fm01">Leistung PBR</p></th>
<td><p class="fm01">5.92 mal</p></td>
<th><p class="fm01">Leistung BPS</p></th>
<td><p class="fm01">338.33</p></td>
</tr>
<tr>
<th><p class="fm01">Erwartete Dividendenzinsen</p></th>
<td><p class="fm01">0.45%</p></td>
<th><p class="fm01">Erwartete 1 Aktiendividende</p></th>
<td><p class="fm01">9〜10</p></td>
・
・
・
</script>
<script language="JavaScript" type="text/javascript">_satellite.pageBottom();</script></body>
</html>

Ich konnte erfolgreich auf den Zielbildschirm zugreifen und den HTML-Code als Text abrufen.

Block für Block aus HTML holen

Ich konnte den HTML-Code als Text abrufen, aber so wie er jetzt ist, enthält er viele Tags und CSS. Deshalb werde ich die notwendigen Teile der Reihe nach extrahieren. Versuchen Sie zunächst, den Block zu erhalten, der den "Investitionsindex" enthält. Verwenden Sie die Funktion "find_all ()" von "BeautifulSoup", um einen bestimmten Block abzurufen. Der "Investment Index" ist in den folgenden Blöcken auf dem Bildschirm enthalten. スクリーンショット 2019-12-21 16.27.54.png Dieser Block befindet sich in <div id =" clmSubArea "> in HTML. Geben Sie nun "

" für die Funktion "find_all ()" an.

app.py


    def get_fi_param(self, ticker):

        dict_ = {}
        html = self.financePage_html(ticker)
        soup = BeautifulSoup(html.text, 'html.parser')
        div_clmsubarea = soup.find_all('div', {'id': 'clmSubArea'})[0]
        print(div_clmsubarea)

Wenn du das machst

<div id="clmSubArea">
<div class="mgt10">
<table border="0" cellpadding="0" cellspacing="0" class="tbl02" summary="layout">
<tbody>
・
・
・
<h4 class="fm01"><em>Investitionsindex</em> 20/09. Amtszeit (Ries)</h4>
</div>
</div>
<div class="mgt5" id="posElem_19-1">
・
・
・
</tr>
</tbody>
</table>
</div>

Ich konnte den Zielblock bekommen.

String holen

Zu diesem Zeitpunkt wird dieselbe Arbeit wiederholt, bis die gewünschte Zeichenkette erhalten wird. Lass uns alles auf einmal machen.

app.py


    def get_fi_param(self, ticker):

        dict_ = {}
        html = self.financePage_html(ticker)
        soup = BeautifulSoup(html.text, 'html.parser')
        div_clmsubarea = soup.find_all('div', {'id': 'clmSubArea'})[0]
        table = div_clmsubarea.find_all('table')[1]
        p_list = table.tbody.find_all('p', {'class': 'fm01'})
        per = p_list[1].string.replace('\n', '')
        print('Erwartete PER:' + per)

Holen Sie sich den "

" - Block des "Investment Index" und holen Sie sich alle "

". Wenn Sie die Zeichenfolge in "

" erhalten, ist der Vorgang abgeschlossen.

$ python -m unittest tests.test -v
test_lambda_handler (tests.test.TestHandlerCase) ...Erwartete PER:23.86 mal

Es ist fertig. Danach ist die Verwendung einfacher, wenn Sie die erhaltene Zeichenfolge in JSON usw. verarbeiten.

Am Ende

Durch Crawlen konnte ich die gewünschten Informationen ganz einfach von der Website abrufen. Ich denke, dass es in vielerlei Hinsicht eine nützliche Technologie ist, wenn Sie die Nutzungskapazität richtig halten. Ich werde diesen Code mit mehreren Wertpapiercodes kompatibel machen und ihn bis zur Auflistung in HTML erstellen. Wenn dabei etwas ausgegeben werden kann, möchte ich es zu einem anderen Zeitpunkt beschreiben.

Recommended Posts

Crawlen der Website eines Wertpapierunternehmens
Ich habe versucht, den Pferderennplatz Teil 2 zu kriechen und abzukratzen
Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-