エンジニアを目指してるんだから、転職活動も自動化しなきゃでしょ!
エンジニアを目指すものとして、転職サイトからコピペでエクセルにまとめる、みたいなことはしたくない。全部自動化してなんぼでしょ!ということで作ってみた。
装備を整える
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import openpyxl
import datetime
試行錯誤する中でいろいろとインポートしたのでいるものといらないだろうものが混在している。ただ、決して動かなくなっても悲しいのでそのまま残している。
- requests:webサイトのhtml情報を取得できるライブラリ
- BeautifulSoup:htmlからタグやらクラスやらを取得できるライブラリ
- selenium:上記2つと似たようなこともできるし、webページのボタンをクリックしたりテキストボックスに入力したりなどの操作ができる。めちゃ便利で今回ほぼこのライブラリを使った。
- openpyel:エクセルの操作を自動化できるライブラリ
- time:あんまり高速で情報を取得するとサーバーに負担がかかって怒られるらしいのでtime.sleep()をつかうのがよいみたい
- datetime:今日の日付とかを取得できる便利なライブラリ
そもそもライブラリってなに
いろんなプログラムを集めたファイル。お道具箱。
seleniumってお道具箱の中に、webdriverとかいろんな道具が入ってるから、使いたいときに出して使う。
ブラウザを起動してサイトへ飛ぶ
url = "https://tenshoku.mynavi.jp/"
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)
今回はマイナビ転職を選択した。はじめはdodaにしようと思ったのだが、うまくいかなかった。原因はよくわからないけど、JavaScripyをつかった動的な処理が多かったりしてうまくいかなかったんじゃないかと考えている。
1. 変数 url に目当てのサイトのURLを代入する。
2. driver = webdriver.Chrome():chromeが起動する。地味に感動する。
3. driver.get(url):1.で指定したurlに飛ぶ。
4. time.sleep():怒られたくないので少し休む。どのタイミングでどのくらい寝てればいいか分かっていない。
自動でクリックしたり入力する
クリック
a = driver.find_element(By.XPATH,'クリックしたい範囲のxpath')
a.click()
time.sleep(1)
webページの要素をクリックしたい。そんなときに使えるコードがこれ。
1. driver.find_element():By.○○によってタグを指定出来たり、クラス名を指定できたりする。たくさんあって覚えられないのでその都度調べている。
2. xpath:html上の住所みたいなもので、とりあえずこれを指定しておけば動く。class名とかは別の場所でも同じものが使われてたりして、うまく動かなかったりする。
3. 変数.click()で取得した要素をクリックする。
入力
i = driver.find_element(By.XPATH,'入力したい範囲のxpath')
i.send_keys("未経験")
time.sleep(1)
1. 要素の指定まではクリックと同じ
2. 変数.send_keys("XXXX"):テキストボックスに入力できる。
この操作を繰り返して勤務地とか職種とかを選択した。
情報を取得
h = driver.find_elements(By.TAG_NAME,'h3')
h_list = [x.text for x in h]
print(h_list)
time.sleep(3)
マイナビ転職は会社名や給与などの要素がきれいにタグやクラスで分けられていたので取得しやすかった。
1. 会社名がh3でタグで囲まれていたので指定して、
2. リスト内包表記でリスト化する。
リスト内法表記ってなに
一行でリストがつくれる便利な書き方。
- 書式:A = [変数名 for 繰り返す処理]
h_list = [x.text for x in h]
xにhで取得してきた情報を順番に代入してリスト化している。
取得した情報をエクセルに入力する
wb = openpyxl.load_workbook('エクセル.xlsx')
today = datetime.date.today()
wb.create_sheet(title=str(Today))
ws_today = wb[str(Today)]
1. 空のエクセルファイルを作って、pythonファイルと同じファイルに入れとく。
2. openpyxl.load_workbook('エクセル.xlsx'):つかいたいファイルをロードする。それでも同じディレクトリにありません、みたいなエラーが出たらエクセルファイルまでのパスを入力すれば動く。
- ファイルのパスを確認する方法
※この方法でパスを確認したら¥マークを / に書き換えないといけない。めんどくさい。
3. 今日の日付を取得する
4. エクセルファイルに今日の日付が名前のシートを作成する
wb.create_sheet(title=today)
だとエラーが出た。titleにはint情報は入らないみたい。
5. 作ったワークシートを指定してあげる。
for i in range(len(h_list)):
ws_today.cell(row=i*5+1,column=1).value = h_list[i]
wb.save('エクセル.xlsx')
6. セルに入力していく
for文を使ってリストの0番目から順番にセルに入力していく。
- rowが列、columnが行。
- rowは縦。50音表のあいうえお。
- columnは横。あかさたな。
※rowとcolumnの値はきれいにまとまるように調整しよう。
7. saveを忘れずに
6までは2でロードしたファイルに操作をしていたけど、実は元のファイルには反映されていない。
ここでwb.save('エクセル2.xlsx')とかにするとエクセル2っていう新しいファイルが作られて、そこにこれまでの操作が反映される。
完成
1分くらいで50社の情報がエクセルにきれいにまとめられた。
おもいのほかうまくいってうれしい。
今後は
- 自動で毎日実行
- 完了したらラインに通知がいく
みたいな機能も追加したい!