この記事では、リクナビNEXTにおける募集内容をスクレイピングしていきます。
過去に行ったTwitterやAmazonに比べれば、需要は全然ないと思います。
でも、転職サイトのデータを残すことには価値があると考えています。
だから、リクナビNEXTをスクレイピングします。
そして、そのデータを保存することにしました。
昨日の記事において、データを保存する理由を説明しています。
理由というか、宣言になりますね。
そして、本記事ではその宣言の補足をします。
それだけでは、何も価値はない記事です。
そのため、リクナビNEXTをスクレイピングするコードを載せます。
スクレイピングの一例として参考にしてみてください。
本記事の内容
- 転職サイトにおける募集内容のアーカイブ化
- リクナビNEXTの求人募集ページをスクレイピングする
- リクナビNEXTの求人募集ページをスクレイピングするサンプルコード
それでは、上記に沿って解説していきます。
転職サイトにおける募集内容のアーカイブ化
昨日の記事で以下のように書いています。
でも、それならば企業を判断する情報が手に入りません。 なお、上場企業でない限り、業績や従業員数を追いかけるのは困難です。 じゃあ、どうすればいいのか? 保存しておけばいいのです。 誰が? とりあえずは、興味のある企業を自分で追い続けてください。
これを書きながら、とても違和感を感じていました。
自分でできれば誰も苦労などしないだろうと。
確かに、頑張って検索すればどこかにキャッシュや魚拓はあるかもしれません。
でも、それらは簡単には見つけられません。
また、各人が自分で転職サイトの特定企業を追い続けるのも無理ゲーです。
そもそも、いつ目当ての企業が募集をするかどうかもわかりませんので。
だから、私自身の書いたことに対して「無責任」を感じました。
そのときは、「無責任」だと認めたくないから、違和感だったのでしょう。
この違和感を解消するため、自分の言葉に責任を持つために動きます。
まずは、以下の中からリクナビNEXTをターゲットにします。
- マイナビ転職
- リクナビNEXT
- doda(デューダ)
- エン転職
- イーキャリア
リクナビNEXTにおける募集内容のアーカイブ化を目指します。
もう、これはやります。
それほど需要がなくてもやります。
リクナビNEXTの求人募集ページをスクレイピングする
ここからは技術の話です。
正直言って、リクナビNEXTはスクレイピングするのは簡単です。
そのため、細かい説明はしません。
まず、動的コンテンツに対応する必要がありません。
一部で動的コンテンツはあります。
以下がjsで表示されています。

でも、これは同一画面内の表示をjsで取得して表示しているだけです。
ファーストビューで見せたい情報を見せているに過ぎません。
そのため、コンテンツ取得のためにjsでサーバには問い合わせていません。
この発想は、勉強になりますね。
jsで情報を要約して、ファーストビューに持っていくと。
スクレイピングする側の視点では、この部分が最も興味深かったです。
それ以外は、本当にクセのないページとなります。
リクナビNEXTの求人募集ページをスクレイピングするサンプルコード
Pythonでスクレイピングしています。
Seleniumを使う必要すらありませんでした。
Seleniumに関しては、以下の記事で詳細を説明しています。
以下のサンプルコードはコピペで動くはずです。
もちろん、ライブラリがインストールされている前提となります。
2020年08月07日時点では元気に動いています。
import requests from bs4 import BeautifulSoup # User-Agent user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" def get_html(url, params=None, headers=None): try: # データ取得 resp = requests.get(url, params=params, headers=headers) resp.encoding = 'shift_jis' # 文字コード #print(resp.text) # 要素の抽出 soup = BeautifulSoup(resp.text, "html.parser") return soup except Exception as e: return None def get_text_by_class(soup, class_name): text = soup.find(class_=class_name).text text = text.strip() return text def get_key_from_value(d, val): keys = [k for k, v in d.items() if v == val] if keys: return keys[0] return None # 募集概要マスター def get_master_offer(): d = {} d["job"] = "仕事内容" d["skill"] = "求めている人材" d["location"] = "勤務地" d["salary"] = "給与" d["work_time"] = "勤務時間" d["holiday"] = "休日・休暇" d["benefits"] = "待遇・福利厚生" return d # 会社概要マスター def get_master_company_info(): d = {} d["company_name"] = "社名" d["date"] = "設立" d["representative"] = "代表者" d["capital"] = "資本金" d["sales"] = "売上高" d["employees"] = "従業員数" d["office"] = "事業所" d["industry"] = "業種" d["business"] = "事業内容" return d if __name__ == '__main__': # 結果 result = {} # 募集概要 d_offer = get_master_offer() # 会社概要 d_heading = get_master_company_info() # データ取得 url = "https://next.rikunabi.com/company/cmi3631612001/nx2_rq0019322789/" params = {} headers = {"User-Agent": user_agent} soup = get_html(url, params, headers) if soup != None: # タイトル title = get_text_by_class(soup, "rn3-companyOfferHeader__heading") result["title"] = title # タイトル period = get_text_by_class(soup, "rn3-companyOfferHeader__period") result["period"] = period # 募集概要 elems_offer_info = soup.find_all(class_="rn3-companyOfferRecruitment__info") for elem_offer_info in elems_offer_info: heading = get_text_by_class(elem_offer_info, "rn3-companyOfferRecruitment__heading") text = get_text_by_class(elem_offer_info, "rn3-companyOfferRecruitment__text") key = get_key_from_value(d_offer, heading) if key: result[key] = text # 会社概要 elems_company_info = soup.find_all(class_="rn3-companyOfferCompany__info") for elem_company_info in elems_company_info: heading = get_text_by_class(elem_company_info, "rn3-companyOfferCompany__heading") text = get_text_by_class(elem_company_info, "rn3-companyOfferCompany__text") key = get_key_from_value(d_heading, heading) result[key] = text else: print("エラー") print(result)
なお、別の募集内容を取得する場合は以下のuRLを変更します。
url = "https://next.rikunabi.com/company/cmi3631612001/nx2_rq0019322789/"
「cmi3631612001」は、会社コードのようです。
「nx2_rq0019322789」(正確にはrq0019322789)が、求人コードのようです。
あくまで、サイトを外部から解析しての判断です。