In letzter Zeit ist Crawlen in der Community, der ich angehöre, sehr beliebt, deshalb wollte ich es selbst ausprobieren.
Erstens ist der Zielbildschirm. 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.
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.
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.
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.
Dieser Block befindet sich in <div id =" clmSubArea ">
in HTML.
Geben Sie nun "
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.
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 "