ログインが必要なサイトからDL

投稿者: | 2023-02-28
  • ブラウザのCookieにサーバー側との「セッションID」が保存される。そのセッションIDでサーバーは接続元の本人確認を行っているイメージ。
  • GET: 呉れ(丸見え)
  • POST: 送る(多少隠蔽)
# JSON本 P264

import requests, os, time, json
import urllib.parse
from bs4 import BeautifulSoup

# 初期設定
LOGIN_URL = "https://uta.pw/sakusibbs/users.php?action=login&m=try"
JSON_FILE = 'login_data.json'

# サンプルアカウント
USER_ID = 'JSON-PY'
PASSWORD = 'zR78fGp_zTSlgzLb'

# セッションを開始する
session = requests.session()

def login_to_site():
    # ログイン処理
    html = session.post(
            LOGIN_URL,
                {
                'username_mmlbbs6': USER_ID,
                'password_mmlbbs6': PASSWORD,
                }
            ).text
    
    time.sleep(1)

    # マイページのURLを得る
    mypage = None
    soup = BeautifulSoup(html, 'html.parser')
    for a in soup.select('#header_menu_linkbar > a'):
        if a.text == '★マイページ':
            mypage = a.attrs['href']
            # 絶対URLに変換
            mypage = urllib.parse.urljoin(LOGIN_URL, mypage)
            print(f'{mypage=}')
        if mypage is None:
            print('ログインに失敗しました')
            quit()

    # マイページを取得する
    html = session.get(mypage).text
    # html = requests.get(mypage).text
    time.sleep(1)
    soup = BeautifulSoup(html, 'html.parser')

    # 作品一覧を取得
    works = []
    for li in soup.select('#mmlist > li'):
        a = li.find('a')
        link = urllib.parse.urljoin(mypage, a.attrs['href'])
        name = a.text
        print(name, link)
        comments = get_comments(link)

        # 作品を追加
        works.append({
            'name': name,
            'link': link,
            'comments': comments,
        })

    return works


def get_comments(artwork_url):
    # 作品ページを取得
    html = session.get(artwork_url).text
    time.sleep(1)
    soup = BeautifulSoup(html, 'html.parser')
    # コメントを取得
    comments = []
    for div in soup.select('#commentArea .comment'):
        comments.append(div.text)
        print(f'comment={div.text}')
    return comments

if __name__ == '__main__':
    works = login_to_site()
    # JSONファイルに保存
    with open(JSON_FILE, 'w', encoding='utf-8') as fp:
        json.dump(works, fp, indent=4, ensure_ascii=False)