テクノロジー
内定者サイトスクレイピングしちゃいなYo!
はじめに
みなさんはWEBサイトをスクレイピングしたことありますか?
僕は入社前に内定者サイトをスクレイピングしたことがあります。
そこで、スクレイピングをやってみたい人のために、内定者サイトをスクレイピングしたときのことを記事に書きました。
※入社した今、既に内定者サイトは閉鎖されており、スクショも撮っていなかったので画像などはないのですが、イラストでイメージしてもらえれば幸いです。
もともとスクレイピングに関する経験があったわけではなく手探りでやっていった結果なので、いろいろ間違いや不正確な記述があると思いますが、参考程度にご覧ください!
スクレイピングとは
スクレイピングという言葉を聞いたことがあるでしょうか?
wikipedeaによると
らしいです。
例えば、全国のカラオケチェーン店で一番平日昼のフリータイムが安い店舗を探したいとします。
500個近いすべての店舗のサイトを見れば、一番安い店を見つけることができるでしょう。
しかし、この作業には膨大な手間がかかり、見逃しなどもあるかもしれません。そういった作業を自動化できるのがスクレイピングです。
上記の例で言うと、まずカラオケ店の公式サイトから店舗一覧や各店舗のサイトへのリンクを取得して、それぞれの店舗のサイトにアクセスします。
次に、そのサイトのhtmlを解析することによってほしい情報(平日昼のフリータイム料金)を取得します。
これはあくまでイメージなので実際はこんな簡単にうまくはいかないと思いますが、こういったことがライブラリを使えば意外と簡単にできちゃいます。面倒な仕事はコンピューターにさせちゃいましょう!!
注意点
スクレイピングは、法律的にグレーなところがあります。実際、過去に逮捕者も出ているようです。
趣味の範囲でやっている限りは逮捕されることはあまりないと思われますが、サーバーの負荷にならないように適宜スリープを入れるなどして、迷惑にならないようにしましょう。
内定者サイトをスクレイピングした背景
以前の内定者サイトがどのようなものだったのかは知らないのですが、
私の時は、内定者の自己紹介ページ、チャット機能、採用部からのお知らせなどいろいろな機能があって、僕は入社後にマイナビで働く日を想像しながら日夜眺めていました。
ただ一つ、内定者サイトに不満がありました。
それは、自己紹介ページにおいて、職種での絞り込みが出来ないことです。
内定者サイトの一覧画面からは職種が分からず、総合職も含めた全同期の中からなかなかシステム職の同期を見つけることが難しかったです。
エリアでの絞り込みはできたので、システム職が働くことになる東京(関東だったかも?)を選択すればある程度絞り込むことはできたのですが、総合職の割合が多いため、システム職の同期を効率的に見ていくことができませんでした。
そこで、研修でPythonを使うということは聞いていたので、就職前の3月にPythonの復習も兼ねて内定者サイトをスクレイピングしてシステム職の同期を見つけてみようと考えました。
環境・言語・ライブラリ
今回は、以下のような環境でスクレイピングを行いました。
- windows
- Python
- Selenium
- Beautiful Soup
実装の概要
実際のコードの処理の流れにそって、説明していきたいと思います。
次のような順番でプログラムは処理を行います。
- ログイン
- それぞれの内定者の自己紹介ページに行く
- htmlを解析してシステム職か判断する
詳しくは、以下で説明します。
ログイン
内定者サイトは全世界に公開されているわけではなく、パスワードなどを入力してログインする必要があります。
ログインが必要ないサイトと比べていろいろめんどくさくなるのですが、今回はPythonのSeleniumというライブラリを使用することによって、比較的簡単に侵入(?)することができました。
Seleniumは UI テストを自動化する目的で開発されたWeb ブラウザの操作を自動化するためのツールです。パスワードのフォームを選択してそこにパスワードを記述する処理を書いてあげればログインすることが出来ます。
ちなみに、1日に10回くらいログインすると警戒されて、CAPTCHA(私はロボットではありません的なやつ)が追加されるので、そうなったらお手上げでした。
僕は当時、夜から作業を始めて、CAPTCHAが出てきたら寝る、という生活をしていました。
個々の内定者の自己紹介ページに行く
ログイン状態を維持したまま、自己紹介ページの東京エリアのリンクを選択して移動します。
ページネーションが実装されており、1ページあたり20人しか表示されていないので、そのページの最後の人のページをみたら、次のページへのリンクを選択しなければなりません。
また、最後のページの最後の内定者に到達したらそこで処理を終了します。
こういった細々とした場合分けに結構手間をとられた気がします。
また、サーバーへ過剰な負荷を与えないよう、1人の自己紹介ページに行くたびに1秒スリープをさせました。そのせいもあってすべての内定者をチェックするのに数分くらいかかってた気がします。
システム職か判断する
個々の内定者の自己紹介ページのhtmlをBeautiful Soupによって解析します。htmlを解析し、職種の所の文字列だけを抜き出し、それがITエンジニアなら、名前と自己紹介ページのurlをリストに格納します。
内定者サイトの場合、ddというクラス名の表の3行目に職種名があったので、そこの値を抜き出しました。
なお、職種は内定者が記入するものではなくもともと設定されている項目なので、表記の仕方が人によって違うなどの問題はありませんでした。
実際にプログラムの実行結果を見て頂きたいのですが、内定者サイトは既に閉鎖されており試すことが出来ないので、ここでは「マイナビ」を例にして簡単なスクレイピングを行い、Beautiful Soupを利用したスクレイピングの威力をご覧頂こうと思います。
まず、requestsというライブラリを使用して、「マイナビ」の内容を取得します。
from bs4 import BeautifulSoup
import requests
url = "https://job.mynavi.jp/2024/?utm_medium=e-cpc&utm_source=google-text&utm_campaign=2661271774_16693468728&gclid=CjwKCAjw1ICZBhAzEiwAFfvFhKXVJyim0w6ZeJF2VcnY3NUXfVxN-q_KMSNR0gC_ylFNhcS9TGrCaRoChUAQAvD_BwE"
r = requests.get(url)
soup = BeautifulSoup(r.text, "lxml")
Beautiful Soupのprettifyというメソッドを利用すると、「マイナビ」の内容を見やすく整理してくれます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/>
<title>
マイナビ2024 - 学生向けインターンシップ・就職情報サイト
</title>
<meta content="学生向けインターンシップ・就職情報サイト。インターンシップ情報や就活スケジュールなどの就活準備コンテンツを提供しています。" name="description"/>
<meta content="noarchive" name="robots"/>
<meta content="telephone=no" name="format-detection"/>
<meta content="summary" name="twitter:card"/>
<meta content="@mynavi2024" name="twitter:site"/>
<meta content="マイナビ2024 - 学生向けインターンシップ・就職情報サイト" property="og:title"/>
...
...
あとは、取得したい箇所のCSSセレクタを指定することによって好きな情報をとってこれます。
print(soup.find_all('title'))
# <title>マイナビ2024 - 学生向けインターンシップ・就職情報サイト</title>を取得
print(soup.find_all('p', class_='list-hdg'))
# <p class="list-hdg"><b>広告</b></p>, <p class="list-hdg"><b>福祉サービス</b></p>, <p class="list-hdg"><b>福祉サービス</b></p>
このように、わずか数行のコードでサイトから好きな情報をとってくることが出来ました。あとは取得した文字列で場合分けしても良いし、いろいろなサイトに回って情報を収集しても良いです。
夢が広がりますね!
その後
実は、システム職の名前が分かったところで満足して、それぞれの内定者ページを見に行くことはしていませんでした。本末転倒です。
しかも入社してしばらくして22卒の内定者サイトは閉鎖してしまったので、もう何も残されていません。。
ただ、内定者サイトで予習なんてしなくても仲良くなれる良い同期に恵まれたのでオッケーということにしています👌
ぜひみなさんも、スクレイピングを使ってめんどくさい作業は全てコンピューターに任せましょう!
※本記事は2022年12月時点の内容です。