Python
curl
python2.7

PycURLでログイン、レスポンスを受け取る

More than 1 year has passed since last update.

pythonのcURLライブラリ「PycURL」にて、
ログイン認証を経てHTMLなりjsonなりのレスポンスを受け取る方法。

要はどうやってcookieを保存して、cookieを添えたリクエストを送るのかと言うお話です。

PycURLの基本

こちらが大変参考になります。
インストールから各種HTTPメソッドの送り方など。
お世話になりました。
PycURLでHTTPリクエストあれこれ

ログイン(cooikeの保存)

ログインして、そのcookieを保存するには以下の様にして行います。
(簡略化のため、例外処理・UserAgent・タイムアウトなど一切無視します。)

login.py
import pycurl
import io

curl = pycurl.Curl()
curl.setopt(pycurl.URL,'https://www.xxx.com/login.php' )
curl.setopt(pycurl.POST, 1)
curl.setopt(pycurl.HTTPPOST, [('email', 'qqq@ppp'), ('pass', 'qqqppp')])
curl.setopt(pycurl.COOKIEJAR,'cookie.txt')

#以下2行は、コマンドラインにレスポンスを表示させないための記述。本質ではない。
b = io.BytesIO()
curl.setopt(pycurl.WRITEFUNCTION, b.write)

curl.perform()

ここで大切なことは、
「ログインした時のcookieを'./cookie.txt'に保存して」
と言うオプションを加えるには、下記の様に記すということです。

curl.setopt(pycurl.COOKIEJAR,'cookie.txt')

後ほど、このcookieを添えて、ログイン認証が必要なページに対してリクエストを送ります。


リクエスト送信先、およびパラメータ名は、
ログインページのソースを参照するか、通信履歴(chromeの検証→Networkタブ)から調べると良いと思います。
また、ログインに必要なパラメータが増える場合、リストの要素をそのまま増やせば良いです。

curl.setopt(pycurl.URL,'https://www.xxx.com/login.php' )
curl.setopt(pycurl.POST, 1)
curl.setopt(pycurl.HTTPPOST, [('para1', 'aaa'), ('para2', 'bbb'), ('para3', 'ccc'), ...])


ログイン認証が必要なページのレスポンスを受け取る

ログインが必要なxxx.comのmainページのHTMLを受け取る想定で記します。

request_page.py
import pycurl
import io

curl = pycurl.Curl()
curl.setopt(pycurl.URL,'https://www.xxx.com/main' )
curl.setopt(pycurl.COOKIEFILE,'cookie.txt')
b = io.BytesIO()
curl.setopt(pycurl.WRITEFUNCTION, b.write)

try:
  curl.perform()
  ret = b.getvalue()
  http_code = curl.getinfo(pycurl.HTTP_CODE)

except Exception as e:
  ret = str(e)

ここで大切なことは、
ログインを経て生成されたcookie.txtを添えてリクエストを送るには、

curl.setopt(pycurl.COOKIEFILE,'cookie.txt')

と記述すると言うことです。

cookieを保存するときは pycurl.COOKIEJAR
cookieを使用するときは pycurl.COOKIEFILE



次に、レスポンスを受け取ります。

b = io.BytesIO()
curl.setopt(pycurl.WRITEFUNCTION, b.write)
ret = b.getvalue()

これでret内にはmainページのHTMLがstr型で格納されていて、他の変数同様加工が可能です。
当然jsonをリクエストすることも可能です。
その場合受け取るレスポンスはstr型のため、jsonモジュールなどでデコードします。