RoboBrowserを使ってWebページにログインしてクローリング
最近、下の本を読んでいる。RoboBrowserと言うものがあるらしいので、使ってみたときのメモ
Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-
- 作者: 加藤耕太
- 出版社/メーカー: 技術評論社
- 発売日: 2016/12/16
- メディア: 大型本
- この商品を含むブログ (3件) を見る
なんか、フォームに入力したりするときには Requests で行うのは面倒らしいので、 RoboBrowser を使用するっぽい。
インストール
pip install robobrowser
RoboBrowserは内部でBeautifulSoupを使用しているため、BeautifulSoup4とRequestsは一緒にインストールされる
nanacoのサイトにログインし、残高確認をしてみる
RoboBrowserを使ったプログラムの作成で、nanacoのサイトにログインして、残高を表示するプログラムを作ってみた
ソースはGitHubにあげた
フォームの送信
フォームを送信するには、まず、フォームを取得する。フォームを取得するにはRoboBrowser.get_form()
を使う。引数にformのidを渡すことでフォームを取得できる。
ログインのフォームを取得する
>>> from robobrowser import RoboBrowser >>> browser = RoboBrowser() >>> browser.open('https://www.nanaco-net.jp/pc/emServlet') >>> form = browser.get_form(id='login_card') >>> form <RoboForm _PageID=SCBS_PCB1001, _DataStoreID=DSBS_PCB1001_Control, _SeqNo=1509980487174_[ACTIVE]_ExecuteThread:__19__for_queue:__weblogic.kernel.Default_(self-tuning)___, _ControlID=BS_PCB1001_Control, _WID=NoWID, _ORGWID=, _WIDManager=, _preProcess=, _TimeOutControl=, _WIDMode=0, _WindowName=, _ReturnPageInfo=, XCID=, SECURITY_CD=, ACT_ACBS_do_LOGIN2=>
テキストボックスに入力する
テキストボックスの name を指定し、value属性に値を代入する
>>> form['XCID'].value = '1234567891234567' >>> form['SECURITY_CD'].value = '1234567'
フォームの送信
送信するときにはRoboBrowser.submit_form()
を使う。引数に値を入力したフォームを渡す。送信後の状態が browser に入っているため、selectなどで要素を取得できる。
>>> brawser.submit_form(form) >>> browser.select('#cardzan > span.time') [<span class="time">2017年11月05日23時59分時点</span>]
あとはごちゃごちゃ取っていく(適当)
書いている最中になんかエラーが出た
エラー内容
/Users/tamago324/.local/share/virtualenvs/robobrowser-zDYVPytv/lib/python3.6/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. The code that caused this warning is on line 60 of the file nanaco_zan.py. To get rid of this warning, change code that looks like this: BeautifulSoup(YOUR_MARKUP}) to this: BeautifulSoup(YOUR_MARKUP, "html.parser") markup_type=markup_type)) Traceback (most recent call last): File "nanaco_zan.py", line 60, in <module> main() File "nanaco_zan.py", line 13, in main loginedForm = login(browser) File "nanaco_zan.py", line 40, in login browser['XCID'].value = NANACO_NUM TypeError: 'RoboBrowser' object is not subscriptable
解決策
インスタンス生成時にparserを指定すればいいらしい
>>> browser = RoboBrowser(parser='html.parser')