自分基準

自分の思ったことを気ままにメモ代わりに書いていこうかと

PythonのHTTPRequestを使ったスクレイピングの一部変更

前回PythonのHTTPRequestを用いて口座残高を取得するプログラムを書いたが、ほんの少し(数行)だけ減らすことができ、かつGETやPOSTが分かりやすく書くことができたため一部更新

http://www.jibunkijyun.net/entry/2016/08/28/231619www.jibunkijyun.net

変更点①:インポート

前回の通信ではCookieを有効にするため以下の文をの1行目と3行目が必要だったが下の1行目にまとめる事ができた

変更前
from urllib.request import build_opener, HTTPCookieProcessor
from urllib.parse import urlencode
from http.cookiejar import CookieJar
import re
変更後
import requests
import codecs
import re

変更点②:クッキーの定義

こちらは結局書かなくてはいけないので省略にはなっていないが分かりやすくなったと思う。

変更前
opener = build_opener(HTTPCookieProcessor(CookieJar()))
変更後
s = requests.Session()

変更点③:リクエストの方法

以前の方法であれば送るdataがあればPOST、なければGETに自動的になっていたが変更後は自分でPOSTかGETを決めPOSTであればdataを付けるようにした。

手間は増えたがぱっと見てどちらの要求か分かりやすいのでこちらに変更した。

変更前
#クッキーの設定
opener = build_opener(HTTPCookieProcessor(CookieJar()))
#GETの要求
res = opener.open(url)
#POSTの送信
res = opener.open(url, data)
変更後
#クッキーの定義
s = requests.Session()
#GETの要求
res = s.get(url)
#POSTの送信
res = s.post(url, data)

ソースコード全容

変更前
from urllib.request import build_opener, HTTPCookieProcessor
from urllib.parse import urlencode
from http.cookiejar import CookieJar
import re

# HTTP通信時にCookie処理を有効化
opener = build_opener(HTTPCookieProcessor(CookieJar()))

# ログインに使う送信データ
#実際はChromeのデベロッパーモードなどで1回通信して抜き出す
#1回抜き出せば今後も使える
post = {
    "JS_FLG":"1",
    "BW_FLG":"chrome,52",
    "_ControlID":"WPLE****",
    "_DataStoreID":"DSWPLETl*****",
    "_PageID":"WPLETl******",
    "_ActionID":"login",
    "getFlg":"on",
    "allPrmFlg":"on",
    "_ReturnPageInfo":"***",
    "user_id":"*****",
    "user_password":"*****",
    "ACT_login.x":"80",
    "ACT_login.y":"13"
    }
data = urlencode(post).encode('utf-8')

#トップページのurl
url = "https://site1.sbisec.co.jp/ETGate/"

#sbiにログイン
res = opener.open(url, data)

#口座管理ページのURL
#実際はURLをコピペして貼り付ける
kouzakanri = "https://site1.sbisec.co.jp/ETGate/?_ControlID=WPLETac***"
res = opener.open(kouzakanri)

#response(bytes)はHTMLのソースコードなので.read()で読み出す
html = res.read()
#bytes型をデコード
shift = html.decode('Shift_JIS')

#現金残高抜き出し,cash.group()で参照可能
try:
    cash = re.search("現金残高等[\">\'=<\/0-9A-Z\ra-z \n,]*",shift)
    cash = re.search("[0-9]*,[0-9]*",cash.group())
    cash.group()
except AttributeError:
    cash = re.search("現金残高等[\">\'=<\/0-9A-Z\ra-z \n,]*",shift)
    cash = re.search("[0-9]*",cash.group())
    cash.group()

#株式評価額
try:
    stock = re.search("株式<\/div>[\r\n]*(.)*[\r\n]*(.)*",shift)
    stock = re.search("[0-9]*,[0-9]*",stock.group())
    stock.group()
except AttributeError:
    stock = re.search("株式<\/div>[\r\n]*(.)*[\r\n]*(.)*",shift)
    stock = re.search("[0-9]*",stock.group())
    stock.group()

print("株式買付余力:" + cash.group())
print("株式評価額 :" + stock.group())
変更後
import requests
import codecs
import re
import urllib.parse

url = "https://site1.sbisec.co.jp/ETGate/"

post = {
    "JS_FLG":"1",
    "BW_FLG":"chrome,52",
    "_ControlID":"WPLE****",
    "_DataStoreID":"DSWPLETl*****",
    "_PageID":"WPLETl******",
    "_ActionID":"login",
    "getFlg":"on",
    "allPrmFlg":"on",
    "_ReturnPageInfo":"***",
    "user_id":"*****",
    "user_password":"*****",
    "ACT_login.x":"80",
    "ACT_login.y":"13"
    }

#クッキーの定義
s = requests.Session()
#post送信
res = s.post(url,data=post)
#口座管理のURL
stock_account_page = "https://site1.sbisec.co.jp/ETGate/?_ControlID=WPLETac***"
#GETの送信
res = s.get(stock_account_page)
#レスポンスをshift-jisに変換
res.encoding = "shift-jis"

#現金残高抜き出し,cash.group()で参照可能
try:
    cash = re.search("現金残高等[\">\'=<\/0-9A-Z\ra-z \n,]*",res.text)
    cash = re.search("[0-9]+,[0-9]+",cash.group())
    cash.group()
except AttributeError:
    cash = re.search("現金残高等[\">\'=<\/0-9A-Z\ra-z \n,]*",res.text)
    cash = re.search("[0-9]+",cash.group())
    cash.group()

#株式評価額
try:
    stock = re.search("株式<\/div>[\r\n]*(.)*[\r\n]*(.)*",res.text)
    stock = re.search("[0-9]+,[0-9]+",stock.group())
    stock.group()
except AttributeError:
    stock = re.search("株式<\/div>[\r\n]*(.)*[\r\n]*(.)*",res.text)
    stock = re.search("[0-9]+",stock.group())
    stock.group()

print("株式買付余力:" + cash.group())
print("株式評価額 :" + stock.group())