Python Selenium スクレイピング 自動化

【案件紹介】求人サイトの情報をPythonでスクレイピングしてCSVに書き出す

この記事は約10分で読めます。

 

今回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を用いたスクレイピングがたった数十行のプログラムで簡単に実装することができます。似たようなサイトのスクレイピングや詳細について知りたい方は↓のいずれかの連絡先にお気軽にご連絡いただけますと幸いです。

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました