この記事はRoboBrowserを使ってWebページにログインしてクローリング - TILの転載です
最近、下の本を読んでいる。RoboBrowserと言うものがあるらしいので、使ってみたときのメモ
Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド- | 加藤 耕太 |本 | 通販 | Amazon
なんか、フォームに入力したりするときには Requests で行うのは面倒らしいので、 RoboBrowser を使用するっぽい。
インストール
pip install robobrowser
RoboBrowserは内部でBeautifulSoupを使用しているため、BeautifulSoup4とRequestsは一緒にインストールされる
nanacoのサイトにログインし、残高確認をしてみる
RoboBrowserを使ったプログラムの作成で、nanacoのサイトにログインして、残高を表示するプログラムを作ってみた
ソースはGitHubにあげた
tamago324/post_nanaco_slack: Get nanaco balance info
フォームの送信
フォームを送信するには、まず、フォームを取得する。フォームを取得するには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などで要素を取得できる。
>>> browser.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')