tech

勉強のために、各社の社説を収集してデータベース化する 追加編その1

認証付きのページを突破できるように改造したのでシリーズに追加。

シリーズ一覧はこちら

【まとめ】勉強のために、各社の社説を収集してデータベース化する

はじめに 企画が終了したので、後々の利便性も考えてまとめておきます。 この投稿は、pythonで各新聞社の社説を楽して収集するために作成したプログラムの作成過程をまとめています。 簡単な仕様要求と設計 ...

続きを見る

ログインしてからスクレイピングできるようにする

社説には、あまり関係ないが各新聞社は会員向けの限定ページを配信しています。

これらのページは、「ログイン」しないと閲覧できないので、ログインする機能をselenium版に追加しました。
なお、ログインのページ構造は新聞社ごとに異なっているので、今回は例によってサンプルです。

サンプルコード

 python
login_b = driver.find_element(By.LINK_TEXT, "ログインする")
driver.execute_script("arguments[0].click();", login_b)
#後半
driver.find_element(By.ID, "toaru_form_id").send_keys("ご自分のアカウントID")
driver.find_element(By.ID, "toaru_form_Password").send_keys("ご自分のアカウントのパスワード")
driver.find_element(By.CSS_SELECTOR, ".btnM1").click()

コードの説明

多くの有料記事の場合、記事の途中で「ここから先は会員限定」みたいな風に書いてあって、ログインページへ行くボタンがあると思います。
上の2行はログインページへ遷移するコードになります。
1番目の行が、ログインページへ遷移するボタンを特定する動きをします。
そして、下の行でそのボタンをクリックしてページ遷移します。
今回はボタンのテキストが「ログインする」だったので、そのテキストが書かれたボタンを探すようにしています。
ほかの文字だったり、ボタン自体が図だったりした場合はその要素を検索するようにfindを変更してください。

後半の3行は、大体どのページでも同じだと思います。
1行目でログイン用のアカウントを記入します。
2行目でパスワードを記入します。
3行目、最後に送信相当のボタンを押します。
例によって、それぞれのフォームやボタンを特定する方法は、各webページで異なるので、実際にブラウザを開いてソースコードを見ながら試してください。

これらがうまく実行されれば、認証後のページに飛んで、記事が全文表示されると思います。

注意ポイント


上記のように平文でパスワードをコードに書いています。
Gitなどに公開する場合は十分注意してください。

少しずるいやり方

Google chromeの拡張機能に、webページの操作をそのままseleniumのコードに書き起こしてくれるアドオンがあります。
「selenium コード生成」などで検索すると情報がたくさん出てきます。
とりあえず、このアドオンを利用して、どのようなコードになるか初めに確認するの一手です。
ただし、このコードをそのまま利用するのはあまりお勧めできません。
良くも悪くもそのままの操作をコードにしているので、不要なクリックやスクロールがコード化される場合があります。
生成されたコードはきちんとご自身で読んで、自分のコードとして理解できるようにすべきでしょう。

遭遇したエラー

かくいう管理人もseleniumの自動コード生成を利用して、そのコードを部分引用しようとました。
そしてエラーに当たりました。備忘録も兼ねて記載します。

login_b = driver.find_element(By.LINK_TEXT, "ログインする").click

の部分でエラーはいた。

Message: element click intercepted: Element

というメッセージが出てボタンが押せない。
この後の具体的なメッセージは記載しないが、どうやら指定と別の要素を押そうとしているようだ。
ネットで調べると、押下したい要素がそもそも画面にないのでエラーになっている、など理由が書いてあった。
本当かはが怪しいが、解決策が重要なので記載の解決策を実行する。

結果的に実行できた。
内容は簡単で、要素を抽出してから下記で実行する。

 python
login_b = driver.find_element(By.LINK_TEXT, "ログインする")
driver.execute_script("arguments[0].click();", login_b)

あとがき

会員限定の記事もうまくスクラップしたかったので、作ってみましたが、結構うまくいきました。
ログインページへの遷移さえうまくいけば、ログインのやり方自体は多くのwebサイトで同様ですので使いまわしできそうです。
他に流用できそうな案件がないか探してみようと思います。では、また。

-tech
-, ,