LoginSignup
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-15

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モジュールなどでデコードします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5