Help us understand the problem. What is going on with this article?

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

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

keng000
フリーランスで機械学習エンジニアやってます。 最近はもっぱらはてブロ。 機械学習, kubernetes, Python, Go
https://keng000.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away