前提
pythonで特定のWebサイトからデータをスクレイピングするプログラムを作っています。
pythonのバージョンは3.10.7、使用OSはWindows11です。
質問者はpython初心者です。
実現したいこと
https://en-hyouban.com/company/00008059864/
こちらのサイトの、”年収・給与の納得度”、”勤務時間の納得度”、”休日・休暇の納得度”、”職場の人間関係の満足度”の数値を抜き出したいです。まずは”年収・給与の納得度”である「70」という数字をスクレイピングすることを目標にプログラムを書きました。ただし、該当のサイトはアカウントを作ってログインしないと数字が見れない設計になっています。したがって、先ずはSeleniumでログイン処理を行ってから、スクレイピングを行う設計にしました。
”年収・給与の納得度”の箇所に該当するhtmlのコードは、以下になります。
html
1 <div class="mb-2 mt-3"> 2 <div class="d-flex justify-content-between align-items-end"> 3 <span class="fsize-14 font-size-2 font-weight-bold">年収・給与の納得度</span> 4 <span class="font-roboto d-inline-block mb-n1"> 5 <span class="fsize-28 font-change-24 font-weight-bold "> 6 70 7 </span> 8 % 9 </span> 10 </div> 11 <div class="progress rounded-0 h-5 progress-bg"> 12 <div class="progress-bar bg-F89F19 p-w-70"></div> 13 </div> 14</div>
該当のソースコード
ログイン処理を行うところから書くと長すぎてしまうので、該当部分だけを抜き出して書いています。
Seleniumで以下に示すソースコードは、ログイン後、上述のhttps://en-hyouban.com/company/00008059864/に遷移したところから実行するプログラムです。
span
タグで、クラスがfsize-28 font-change-24 font-weight-bold
であるものをfind
メソッドで取り出しています。
また、該当箇所のCSSセレクタを用いてselect
メソッドを用いる手法も試しています。
python
1#インターバルとURLの設定 2INTERVAL = 2.5 3URL = "https://en-hyouban.com/" 4 5#ドライバー設定 6from selenium import webdriver 7driver = webdriver.Chrome(executable_path = "C:\mypg\py\chromedriver.exe")#自分のドライバーのパス 8#サイトにアクセス 9driver.get(URL) 10import time 11time.sleep(INTERVAL) 12 13#ログインボタンをクリック 14ele_btn_log = driver.find_element_by_xpath('//*[@id="company-view-header-menu"]/div[2]/div[1]/a') 15driver.get(ele_btn_log.get_attribute("href")) 16 17time.sleep(INTERVAL) 18 19#ログインIDを記入 20ele_logid = driver.find_element_by_xpath('//*[@id="email"]') 21ele_logid.send_keys(mymail)#自分のメールアドレス 22 23#ログインパスワードを記入 24ele_logpwd = driver.find_element_by_xpath('//*[@id="password"]') 25ele_logpwd.send_keys(mypwd)#自分のパスワード 26 27#ボタンクリック 28ele_btn_log2 = driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/button') 29ele_btn_log2.click() 30time.sleep(INTERVAL) 31 32coop_url = "https://en-hyouban.com/company/00008059864/" 33driver.get(coop_url) 34 35#urlを取得 36res = requests.get(coop_url) 37 38#スープで解析、パーサーはPython’s html.parser 39soup = BeautifulSoup(res.text, "html.parser") 40 41#findメソッドで取り出してみる 42element_find = soup.find("span", class_="fsize-28 font-change-24 font-weight-bold ") 43#selectメソッドで取り出してみる 44element_sel = soup.select("#progressChart1 > div > div.col-sm-12 > div.mb-2.mt-3 > div.d-flex.justify-content-between.align-items-end > span.font-roboto.d-inline-block.mb-n1 > span") 45 46print(element_find) 47print(element_sel)
発生している問題・エラーメッセージ
取り出せていません...
ログイン前のデータを取り出してしまっているようです。
python
1None 2[<span class="fsize-28 font-change-24 font-weight-bold"> 3<a href="https://en-hyouban.com/user/register/?companytop_satisfaction"><img alt="hide-salary-size" class="button_register_size2" src="https://d1uoy7w9kqjh3s.cloudfront.net/images/button_register.png"/></a> 4</span>]
試したこと
https://teratail.com/questions/342435などを参照し、回答の手法を試しましたが、目的のデータを得られませんでした。
また、上記WebサイトのcURLをこのページ(https://curlconverter.com/python/)でrequestsに変換したところ、以下のようになりました。
python
1import requests 2 3response = requests.get('http://^')
補足情報(FW/ツールのバージョンなど)
上記pythonコードで抽出した文字列の中に、<a href="https://en-hyouban.com/user/register/?companytop_satisfaction">
というタグがありましたが、このリンクに見覚えがあり、調べてみたところログインしていない状態でWebサイトにアクセスしたときに出る、会員登録を促すURLと同一のものでした。ログインなしでアクセスしたときの、htmlソースを以下に付記しておきます。
html
1 <div class="mb-2 mt-3"> 2 <div class="d-flex justify-content-between align-items-end"> 3 <span class="fsize-14 font-size-2 font-weight-bold">年収・給与の納得度</span> 4 <span class="font-roboto d-inline-block mb-n1"> 5 <span class="fsize-28 font-change-24 font-weight-bold "> 6 <a href="https://en-hyouban.com/user/register/?companytop_satisfaction"><img class="button_register_size2" alt="hide-salary-size" src="https://d1uoy7w9kqjh3s.cloudfront.net/webp-images/button_register.webp"></a> 7 </span> 8 % 9 </span> 10 </div> 11 <div class="progress rounded-0 h-5 progress-bg"> 12 <div class="progress-bar bg-F89F19 p-w-70"></div> 13 </div> 14</div>
上記のサイトに関して、スクレイピング対策としてどのような手法を取っているのか、質問タイトルの状態から類推できることがあればご教示いただきたいです。よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー