今回MENTAの案件で求人サイトをスクレイピングしましたので、その内容についてざっくりとにはなりますがご紹介したいと思います。
対象サイト
今回スクレイピングした求人サイトは「しゅふJOB」(https://part.shufu-job.jp/tokyo)というサイトになります。
このサイトの東京都に求人を出している会社名をスクレイピングしてほしいという依頼内容でした※
(要件については一部変更して記載しています)
Pythonで求人サイトをスクレイピングするサンプルコード
こういった求人サイトではrequestsでスクレイピングすると非同期処理で返されている情報がうまく取得できないことがあるのでSeleniumというブラウザを自動操作するツールを使用すると捗ります
関連記事:「Selenium」でブラウザを自動操作してWebサイトをスクレイピングする
でSeleniumに使用するWebdriverはGooglechromeのバージョンアップなどで使えなくなることが多いのでバージョンをchrome-driver-managerというライブラリで自動設定する仕組みにしています。webdriver-managerなど必要なモジュールのPIPインストールのコマンドについては↓の記事に書いてあります
関連記事:SeleniumのChromeDriverの更新・バージョン管理を自動化する方法
で以下が実際のコードになります。処理の流れとしては各職種ごとにページ数を判定し、ページ数だけURLの後ろに/page-○という数字を増やすことで職種の各ページを自動的に遷移して、そのHTMLをdriver.page_sourceで取得し、それをbeautifulsoupで解析し取得した部分をリストに追加して保存、最後にリストをデータフレームに変換してCSVに出力しています
import subprocess from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import chromedriver_binary import requests from bs4 import BeautifulSoup import pandas as pd cmd = 'pip install --upgrade chromedriver_binary' res = subprocess.call(cmd, shell=True) d = DesiredCapabilities.CHROME d['goog:loggingPrefs'] = { 'performance': 'ALL' } driver = webdriver.Chrome(ChromeDriverManager().install(),desired_capabilities=d) driver.set_window_size('1200','1000') ken = 'tokyo' # 都道府県 name_data =[] job_dict = { 'オフィスワーク':'job-gnrloffice-sloffice-datainput-unvrstyoffice-realestateofficelicense-realestateoffice-dataanalysis-officemanager-officerecept-secretary-teloperator-emailoperator-finance-hrlegal-accounting-law-officeprofessional-insurance-bank-engoffice-engfinance-translation-pr-adpromotion-productplan-research-webmarketing-othermarketing-otheroffice' ,'クリエイティブ・エンジニア':'job-webdesigner-webdirector-illustrator-dtpoperator-cadoperator-editor-tvproduction-livestreaming-otherproduction-sysengineer-programmer-netengineer-inengineer-tester-otherengineer-patterner-interiorcoordi-researchjob-othercreative_engineer' ,'フード・飲食':'job-holestaffservicer-kitchendish-cook-lunchtimestaff-cafe-bakery-sweets-famires-fastfood-bento-takeout-jpfood-westfood-chifood-itafood-curry-sushi-bbq-otherrestaurant-izakaya-diningbar-shotbar-beergarden-otherbar-ramen-soba-okonomi-buffet-foodcourt-fooddelivery-foodmanager-otherfood-schoollunch' ,'小売・販売':'job-convenience-supermarket-drugstore-diyshop-onecoinshop-flowershop-petshop-bookstore-cdvideoshop-wine-liquorshop-teacoffee-interiorstore-toyshop-sportsshop-photostudio-bikeshop-otherspstore-apparel-childclothes-cosme-accessory-shoes-departmentstore-shoppingmall-foodfloor-demonstrator-meatfruit-mobileshop-electronicstore-register-storemanager-othersales' ,'施設サービス':'job-frontreception-facilitycleaningstaff-laundry-clinic-rentalcar-gasstation-publicfacility-othertownfacility-theater-museum-internetcafe-hotel-bedmaking-bridal-funeral-amusegame-bowling-karaoke-pachinko-amusepark-golf-bath-ski-airportrailway-otherleisure-facilitiymanager-maintenance-otherfacility-keibi' ,'営業':'job-telmarketing-countersales-rounder-corpsales-personalsales-coordinator-salesassistant-otherbizsales' ,'軽作業・物流・製造':'job-sorting-picking-packaging-inventory-inspection-shipping-foodmanufac-foodinspection-partmanufac-partinspection-othermanufac-delivery-moving-driver-driverassist-taxidriver-transportation-messenger-newspaperdelivery-otherlightwork' ,'家事・保育・習い事':'job-housekeepercleanning-babysitter-childminder-schoolchild-childinstructor-engteacher-teacher-hometeacher-engschool-cramschool-indivicoaching-prepschool-schoolteacher-sportsinstructor-pcinstructor-fitness-musicteacher-otherinstructor-examscoring-examiner-otherhousekeeper_lessons' '調査・ポスティング・イベント':'job-marketresearch-transitresearch-mysteryshopper-monitor-otherresearch-posting-sampling-othercampaign-eventstaff-eventconstruction-otherevent' ,'理美容・リラクゼーション':'job-hairdresser-este-eyelist-nailist-groomer-massagetherapist-aromatherapist-therapist-yoga-otherbeautytherapist' ,'医療・看護・介護':'job-pharmacist-lisencedphermacy-pharmacy-dispensing-nurse-nurseassistant-caremanager-homecare-care-careworker-carestaff-careassistant-dentist-dentalhygienist-dentalassistant-medicaloffice-nutritionist-hospital-chiropractor-facilitymanager-medicalprofessional-othermedicalcare' ,'その他':'job-other' } for k, v in job_dict.items(): driver.get(f'https://part.shufu-job.jp/{ken}/{v}') time.sleep(10) soup = BeautifulSoup(driver.page_source) try: page_limit = int(soup.find_all('span', class_='pagination-link pagination-link--number pagination-link--active')[-1].text.replace(',','')) except: page_limit = 1 print(f'{ken}_{k}_ページ数', page_limit) for div_html in soup.find_all('div', class_='job-offer-company-name'): # print(div_html.text) name_data.append([ken,k, div_html.text]) for i in range(2, page_limit+1): driver.get(f'https://part.shufu-job.jp/{ken}/{v}/page-{i}') time.sleep(10) soup = BeautifulSoup(driver.page_source) for div_html in soup.find_all('div', class_='job-offer-company-name'): # print(div_html.text) name_data.append([ken,k, div_html.text]) print(f'{ken}の{i}ページ目を処理完了しました(データ数:{len(name_data)})') pd.DataFrame(name_data,columns=['県名','職種','会社名']).to_csv(f'{ken}_会社名一覧取得結果.csv',index=False)
実行すると県名・職種・会社名がcsvとして出力されます
<実行結果>
こういった感じでPythonを用いたスクレイピングがたった数十行のプログラムで簡単に実装することができます。似たようなサイトのスクレイピングや詳細について知りたい方は↓のいずれかの連絡先にお気軽にご連絡いただけますと幸いです。
コメント