Progateの学習項目をスクレイピングして進捗表を作成した
はじめに
先ほど呟いたように、進捗表作成のために、レッスン項目をスクレイピングしていく。
Pythonでスクレイピングを行う。スクレイピング対象は、Progate道場レッスンの各レッスン。進捗表のタスクに記入するために、WEBページからテキストを一括でもってきたい。これをてさぎょうでやろうとすると、一見一見コピペする必要があり時間がかかる。10件ならいいが、100件あったとしたら・・・ pic.twitter.com/2oQ8SAs5fF
— 柴田浩貴 (@2021_shibata) July 27, 2024
ゴール
googleスプレッドシートで作成した以下の進捗表の「タスク」に、スクレイピングで取得したProgateのレッスン項目が入力されていること。
ゴールまでのステップ
- PythonでProgateのレッスン項目をスクレイピングするようなコードを書く
- 1のコードを実行する
- 出力結果をコピー&ペーストして進捗表を完成させる
ライブラリのインポート
requestsとBeautifulSoupをインポートした(1~2行目)。
この二つのライブラリについては、以前書いた記事を参考にしていただきたい。
ページのURLをurlという変数に代入し(4行目)、urlから取得した解析のためのHTMLの情報をresponseという変数に代入する(5行目)。
responseのHTMLを出力しようとした(7行目)。
1行目でエラー発生。requestsモジュールがないために起こっているエラー。
以下の手順でインストールしていこう。
いろんな処理が走って、インストールが完了したようだ。
再び、Pythonの実行を試みると、別のエラーが発生。今度は、bs4モジュールがないのが原因。
以下の手順で、インストールしていこう。
こちらもいろんな処理が走り、無事インストールが完了したようだ。
必要な2つのモジュールのインストールが完了したところで、再び、ページ内容の取得を試みた。
次に発生したエラーは、ImportError。タイポが原因のようだ。BeautilfulSoupとしてしまっていた。
BeautifulSoupに修正した。
HTML取得
HTML情報を持ってくることができた。
解析のために、このHTMLに対して、BeautifulSoupを使用する。
今回は、先ほど取得したWEBサイトの情報がresponse.textとなる。
7行目で、soupにBeautifulSoupのオブジェクトを代入した。こういったものをオブジェクトと呼ぶべきなのかについては、別の記事で検討していきたい。
このsoupに対して、selectメソッドを使用していく。(以下の1つ目の方法)
reactのデータは取得できない
今回取得したい要素のセレクタは、chapter-listの中にある。しかし、reactからデータを持ってきているようで、HTMLでは取得できなかった。
要素の検証で確認すると、react-chapter-listの中に、chapter-listがあった。元のHTMLでは出現しておらず、reactの処理を行った結果、chapter-listが出力されたと考えられる。
要素の検証で、セレクタをコピーしたものを、selectメソッドの引数に指定して(8行目)、出力してみたら(9行目)、空のリストだった。
HTML要素をローカルにコピー&ペーストして解析
一度、要素の検証でHTMLをコピーしたものを、自分のサーバーにアップして、それをスクレイピング対象にしてみよう。
と思ったが、ローカルで解析できる方法を見つけた。
レッスンの項目名が含まれている以下の部分をhtmlファイルにした。
ブラウザで開くとこんな感じ。
同階層においたので、./ファイル名でurlを指定した(4行目)。with文、openとreadを使用して、ローカルのファイルの読み込みを行い、変数rに代入した(5~6行目)。BeautifulSoupの第一引数には、変数rを指定した(8行目)。
selectメソッドに渡したのは、今回取得したいレッスン名を囲っているa要素のセレクタ(9行目)。
elemsには(10行目)、以下のリストが入っている。
resson_ttl(10行目)を出力すると、以下のようになる。
ここからテキストを抜き出すために、for文の中身で、textメソッドを使用した(11行目)。そうすると、以下のように、綺麗にテキスト部分を抜き出すことができた。
進捗表の作成
最後のステップを進めていこう。進捗表のタスク部分に上記をコピーしたものを貼り付けた。
PLUSという文字を取り除くために、D列に「SUBSTITUTE(Aセル, “PLUS”, “”)」を入力した。
それをコピーして、値で貼り付ける。D列は削除し、完了のチェックボックスを追加して、進捗表が完成した。
コメントを残す