手動ログイン後のHTMLを取得できなかった。ログイン前のHTMLだけしか取得できない模様。

ブツ

前回まで

ソースコード

0.py

#!/usr/bin/env python3.7
# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By

url = "https://monaledge.com/mypage"
user_data_dir_path = '/home/pi/.config/chromium'
profile_dir_name = 'Profile 3'

options = webdriver.ChromeOptions()
options.add_argument(f'--user-data-dir={user_data_dir_path}')
options.add_argument(f'--profile-directory={profile_dir_name}')

chrome_service = fs.Service(executable_path='/usr/bin/chromedriver')
driver = webdriver.Chrome(options=options, service=chrome_service)
#driver.get(url)
driver.execute_script(f"window.open('{url}');")

#time.sleep(30)
#driver.close()

time.sleep(30)

def yet_login():
    username = driver.find_element(By.CSS_SELECTOR, "div.display-1").text
    print('username:', username)
    elements = driver.find_elements(By.CSS_SELECTOR, "a")
    urls = list(map(lambda e: e.get_attribute('href'), elements))
    print(len(urls), urls)
    elements = list(filter(lambda x: x.startswith('/article/'), urls))
    print(len(elements))
    if 0 < len(elements): return False
    return True

while yet_login():
    time.sleep(3)

print('ログイン済みであることを確認しました!')

# クリックボタンを押す
#browser.find_elements_by_css_selector("header button")[-1].click()

実行するとブラウザが起動する。

python3.7 0.py

mpurseが起動したあとパスワードを入力しログインするも、取得できるHTMLはログイン前のものだった。そのため自分の記事番号が取得できなかった。無念。

モナレッジにログインできなかった件

上記のようなコードを書いては起動してを何度か繰り返していました。するとモナレッジにログインできなくなってモナレッジにログインできなかった件の経緯に至りました。

分析

BANされた?

私はBANされたのだと思いました。WEBサービスの中にはパスワードの総当りで不正ログインを試みるクラッカーがいます。それへの対処として一定の頻度でログインを試みたら不審者としてそのIPアドレスからのアクセスを禁止する処置をとることがあります。今回のことはそれかと思いました。

もっとも、ふつうは一定時間内にログイン失敗回数が一定回数に達したときだと思います。私は毎回ログインに成功していたので不正ログイン扱いされるとは思えません。でも、それしか思い当たる節がありませんでした。

サーバが落ちた

その後らいう様からツイッターで教えていただいた所、バックエンドのAPIサーバが落ちていたとのことでした。

もしこの作業がサーバダウンにつながるとしたら過剰リクエストにより負荷がかかりすぎたときだと思います。けれど今回のコードでモナレッジのサーバにリクエストしているのはdriver.execute_script(f"window.open('{url}');")の1回だけのはず。それ以降の3秒ごとにループしている処理ではリクエストはせずHTML解析しているだけなのでサーバ負荷はかかっていないと思います。

私は何度もこのコードの動作確認をしました。でもブラウザが立ち上がり、mpurseが表示され、パスワードを入力し、mpurseのボタンを2回押してログインされるまで、少なく見積もって15秒でした。これは体感で測ったので正確ではありません。でもサーバが過剰負荷で落ちるほどの頻度でアクセスしているとも思えません。

コードを変えながらやっていたので繰り返した回数までは覚えていませんが、いくら多くても三十回もやってないと思います。サーバが落ちるような負荷ではないと思うのですが、サーバのスペックも知らないので何とも言えません。

タイミング

ただ、私はこの作業をしているときにログインできなくなりました。タイミング的にこれが無関係とも思えません。けれどサーバが落ちるようなこととも思えず。

原因不明

はたしてこれは私のせいだったのか。正直よくわかりません。でもタイミング的に怪しいので、とりあえず私がやったことを報告しておきます。ここまでが経緯のすべてです。復旧したので別にどうでもいいかもしれませんが念の為。

これからどうするか

モナレッジから自分の記事のマークダウンをすべて取得したいと思ってはじめたことですが、結局ログイン後のHTMLを取得することはできませんでした。それについては何か方法があるはずだと思うのですが、それを見つけるためには実際に動作させる必要があります。けれどこのまま続けていいものか疑問です。

モナレッジにログインできなくなったのはサーバダウンのようですが、その原因がよくわかりません。私がやった作業が原因である可能性も否定できないので、念の為ここでやめておこうと思います。

もし仮にやるとしても一日一回とか、限りなく少ない回数だけやるほうがいいでしょう。

あるいはいっそ自動化をあきらめて、手動でポチポチやりながらバックアップをとると決めたほうが良さそうです。そうしようかな。うん、とりあえずそうしよう。