matsulibの日記

Ingredients as Code

PythonでCookieを使ってWebサイトにログイン

相変わらずスクレイピングの勉強中。

参考サイト
Python2とPython3でHTTP POST+Cookie処理の比較 - yattの日記
Python | saito's memo
urllib2でCookieを使う - ひきメモ

Python3でニコニコ動画にログインして自分で投稿した動画を保存してみた。虚しい。

from urllib.request import build_opener, HTTPCookieProcessor
from urllib.parse import urlencode, parse_qs
from http.cookiejar import CookieJar
from lxml.html import fromstring

# Cookie利用opener
opener = build_opener(HTTPCookieProcessor(CookieJar()))

encoding = 'utf_8'  # Webサイトの文字コード

post = {
    'mail_tel': '****@gmail.com',
    'password': '********'
}
data = urlencode(post).encode('utf_8')

# ログインCookieを取得
response = opener.open('https://secure.nicovideo.jp/secure/login', data)

# レスポンスの読込、保存
# with open('out.html', 'w', encoding=encoding) as f:
#     f.write(response.read().decode(encoding))
response.close()

# FLVファイルのURLを取得
video_id = 'sm22328060'
with opener.open('http://www.nicovideo.jp/api/getflv?v=' + video_id) as response:
    flv_url = parse_qs(response.read().decode(encoding), encoding=encoding)['url'][0]

# 動画ページのCookieを取得(FLVファイルのダウンロードに必要)
# ついでにタイトルを取得
with opener.open('http://www.nicovideo.jp/watch/' + video_id) as response:
    doc = fromstring(response.read().decode(encoding))
    title = doc.head.find('title').text.split(' - ')[0]
    # ファイル名に使えない記号を削除
    for c in '\/?:*"><|':
        title = title.replace(c, '')

# ファイルをダウンロード
with open(title + '.flv', 'wb') as f:
    with opener.open(flv_url) as response: 
        f.write(response.read())

他のサイトでも上のコードのpostの中身が違うだけでログインまでの流れは概ね同じっぽいけど、Amazonでは「Cookieを有効にしろ」と言われてログインできなかった。HTMLのことがまだよく分かってない。