python boss直任某職位情報(selenium+chromeの応用)

19556 ワード

主にseleniumによるデータ取得を記録する.boss直任をターゲットとしたサイトでは、指定されたポジションに関する情報を取得し、csv形式でローカルに存在することが主な目的です.
目次
  • 主な考え方
  • 注意点
  • 解決すべき問題
  • 全体コード
  • 主な考え方
  • seleniumを使用してシミュレーションブラウザを開き、boss直任urlにアクセスします.https://www.zhipin.com/
  • ある職位を入力して、検索
  • をクリックします
  • 検索結果ページで、表示された職階情報を解析し、
  • を保存します.
  • 複数のページが存在する場合は、次のページにジャンプします.手順3
  • を繰り返します.
    注意すべき点
    シミュレーションブラウザで開くと、あるポジションを検索すると登録ページにジャンプし、ログインしてから情報を表示する必要があります.ここには事前にcookiesを保存し、トップページを開き、browserを利用します.add_Cookie()事前に保存したcookiesを添付し、ページをリフレッシュしてから手順2を実行します.cookies保存方法:seleniumでログインページを開いた後、手動でログインし、現在のcookiesをローカルに保存します.
    from selenium import webdriver
    import json
     
    browser = webdriver.Chrome()
    browser.get('https://login.zhipin.com/?ka=header-login')
    #               
    cookies = browser.get_cookies()
    with open('boss_cookies.json', 'w', encoding='utf-8') as f:
        f.write(json.dumps(cookies))
    

    解決すべき問題 selenium , , ····· , ~~~すでに試みられた解決策:自分がアナログブラウザであることを隠す、詳細は参照できる:1行のjsコードはSelenium+Webdriverとその対応策を識別する
    from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = Chrome(options=option)
    

    私は答えを探しているうちに、手動でドラッグしても間違っていることに気づき始めました.その後、ChromeとChromeDriverのバージョンが一致していないことに気づきました.後続のインストールかバージョンをアップグレードするか、ChromeとChromeDriverのバージョンが一致していることを覚えておいてください.その後バージョンを更新した後、少なくとも手動でドラッグするのは成功しました・・・
    ソリッドコード
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver import ChromeOptions
    import json, csv
    import time
    import random
    
    def inquire_job(browser, job_name):
        #          
        input_string = browser.find_element_by_css_selector('.ipt-search')
        input_string.send_keys(job_name)
    
        button = browser.find_element_by_class_name('btn')
        button.click()
    
    
    def get_job_items(browser):
        #         
        items = browser.find_elements_by_xpath("//div[@class='job-list']//li")
    
        file = open('boss_job_items.csv', 'a', encoding='utf-8')
        fieldnames = ['job_title', 'job_url', 'salary', 'condition', 'company_title', 'company_url',
                     'company_info', 'publis_name']
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        for item in items:
            result = {}
            job = item.find_element_by_class_name('info-primary')
            result['job_title'] = job.find_element_by_class_name('job-title').text
            result['job_url'] = job.find_element_by_css_selector('a').get_attribute('href')
            result['salary'] = job.find_element_by_class_name('red').text
            result['condition'] = job.find_element_by_css_selector('p').text
            # '         1-3   '
            company = item.find_element_by_class_name('info-company')
            result['company_title'] = company.find_element_by_css_selector('a').text
            result['company_url'] = company.find_element_by_css_selector('a').get_attribute('href')
            result['company_info'] = company.find_element_by_css_selector('p').text
    
            publis = item.find_element_by_class_name('info-publis')
            result['publis_name'] = publis.find_element_by_class_name('name').text
    
            writer.writerow(result)
    
        file.close()
    
    
    def get_next_page(browser):
        #     
        try:
            pages = browser.find_element_by_class_name('page')
            next_page_url = pages.find_element_by_class_name('next').get_attribute('href')
            print(next_page_url)
            return next_page_url
        except NoSuchElementException:
            raise NoSuchElementException
    
    
    def main(job_name):
        #             
        options = ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        options.add_argument('--headless')
        browser = webdriver.Chrome(options=options)
        
    	#     cookies
        with open('boss_cookies.json', 'r') as file:
            data = file.read()
            cookies = json.loads(data)
    	#   cookies     
        browser.get('https://www.zhipin.com/')
        for i in cookies:
            browser.add_cookie(i)
        browser.refresh()
    
        while True:
            try:
                inquire_job(browser, job_name)
                time.sleep(1)
                get_job_items(browser)
                next_page_url = get_next_page(browser)
                time.sleep(random.uniform(1, 10))
                browser.get(next_page_url)
            except Exception:
                break
    
        browser.close()
    
    
    if __name__ == '__main__':
        start_time = time.time()
        main('python  ')
        end_time = time.time()
        print(end_time - start_time)