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())