国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python實(shí)戰(zhàn):使用selenium及BeautifulSoup4進(jìn)行BOOS直聘信息爬取與數(shù)據(jù)累積【附源碼】

這篇具有很好參考價(jià)值的文章主要介紹了Python實(shí)戰(zhàn):使用selenium及BeautifulSoup4進(jìn)行BOOS直聘信息爬取與數(shù)據(jù)累積【附源碼】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

運(yùn)行環(huán)境要求

  • 操作系統(tǒng):適用于Windows、macOS、Linux。
  • Python版本:Python 3.6及以上。
  • 依賴庫(kù)
    • selenium:用于模擬瀏覽器操作。
    • webdriver_manager:自動(dòng)管理驅(qū)動(dòng)程序。
    • BeautifulSoup4:解析HTML頁(yè)面。
    • pandas:數(shù)據(jù)處理和CSV文件操作。
    • logging:日志記錄。
      pip install selenium webdriver_manager beautifulsoup4 pandas

設(shè)計(jì)思路

本項(xiàng)目旨在通過(guò)Selenium模擬用戶瀏覽器行為,獲取特定網(wǎng)站(如Boss直聘)上的職位信息,并利用BeautifulSoup解析這些信息。為了實(shí)現(xiàn)數(shù)據(jù)的持續(xù)累積而不是每次運(yùn)行都覆蓋原有數(shù)據(jù),采用pandas進(jìn)行數(shù)據(jù)合并和去重,最終將更新后的數(shù)據(jù)保存到CSV文件中。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859556.html

具體實(shí)踐

  1. 初始化Selenium WebDriver:配置ChromeDriver,啟動(dòng)Chrome瀏覽器實(shí)例。
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    
    options = webdriver.ChromeOptions()
    try:
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    except Exception as e:
        logging.error(f"創(chuàng)建WebDriver時(shí)出錯(cuò): {e}")
        raise
  2. 獲取并保存Cookies:訪問目標(biāo)網(wǎng)站并手動(dòng)登錄,然后保存Cookies以便后續(xù)自動(dòng)登錄使用。
    def 獲取cookie(driver, url):
        logging.info("開始獲取cookie")
        driver.get(url)
        time.sleep(30)  # 等待足夠的時(shí)間手動(dòng)登錄并保存cookies
        cookies = driver.get_cookies()
        with open('cookies.json', 'w') as f:
            json.dump(cookies, f)
        logging.info("Cookie獲取完畢并已保存")
  3. 加載Cookies實(shí)現(xiàn)自動(dòng)登錄:在后續(xù)的會(huì)話中加載之前保存的Cookies,實(shí)現(xiàn)自動(dòng)登錄。
    def 加載cookie(driver, cookie_file='cookies.json'):
        logging.info("開始加載cookie")
        with open(cookie_file, 'r') as f:
            cookies = json.load(f)
            for cookie in cookies:
                if 'expiry' in cookie:
                    del cookie['expiry']  # 刪除過(guò)期時(shí)間,避免格式錯(cuò)誤
                driver.add_cookie(cookie)
        logging.info("Cookie加載完畢")
  4. 爬取職位信息:訪問職位列表頁(yè)面,使用BeautifulSoup解析頁(yè)面,提取職位相關(guān)信息。
    from bs4 import BeautifulSoup
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    def 獲取職位信息(driver, base_url, pages=1):
        logging.info("開始獲取職位信息")
        職位信息_list = []  
        for i in range(1, pages + 1):
            url = f'{base_url}&page={i}'
            driver.get(url)
            WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "job-card-wrapper")))
            soup = BeautifulSoup(driver.page_source, 'html.parser')
            jobs = soup.find_all('li', class_='job-card-wrapper')
            # 提取并添加職位信息到列表中...
        return pd.DataFrame(職位信息_list)
  5. 數(shù)據(jù)去重與累積:讀取已有的數(shù)據(jù)文件(如果存在),將新抓取的數(shù)據(jù)與舊數(shù)據(jù)合并,去除重復(fù)項(xiàng),然后保存更新后的數(shù)據(jù)。
    import pandas as pd
    
    if os.path.exists(data_file):
        existing_data = pd.read_csv(data_file)
    else:
        existing_data = pd.DataFrame()
    
    新職位信息 = 獲取職位信息(driver, base_url, pages=5)  
    更新后的職位信息 = pd.concat([existing_data, 新職位信息], ignore_index=True).drop_duplicates(subset=['職位名稱', '公司名稱'])
    更新后的職位信息.to_csv(data_file, index=False, encoding='utf-8-sig')

技術(shù)要點(diǎn)

  • Selenium的高級(jí)應(yīng)用:包括但不限于Cookies的處理、顯式等待(WebDriverWait)等技巧,以確保頁(yè)面加載完成并成功獲取數(shù)據(jù)。
  • BeautifulSoup的靈活運(yùn)用:精確地定位和提取所需的HTML元素。
  • Pandas的數(shù)據(jù)處理能力:有效地合并、去重和保存數(shù)據(jù)。

項(xiàng)目復(fù)盤

  • 挑戰(zhàn)
    • 頁(yè)面結(jié)構(gòu)變化導(dǎo)致的數(shù)據(jù)提取失敗。
    • 網(wǎng)站反爬蟲機(jī)制的應(yīng)對(duì)。
    • 數(shù)據(jù)去重邏輯的設(shè)計(jì)。
  • 解決方案
    • 定期檢查目標(biāo)網(wǎng)站的頁(yè)面結(jié)構(gòu),及時(shí)更新選擇器。
    • 合理設(shè)置請(qǐng)求間隔,使用Cookies模擬登錄狀態(tài),減少被封概率。
    • 利用pandas強(qiáng)大的數(shù)據(jù)處理功能,根據(jù)特定字段進(jìn)行去重。

?完整源碼

import logging
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
import os
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import json

# 設(shè)置日志記錄
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def 獲取cookie(driver, url):
    # 訪問指定的URL并等待用戶手動(dòng)登錄,然后保存cookies
    logging.info("開始獲取cookie")
    driver.get(url)
    time.sleep(30)  # 等待足夠的時(shí)間手動(dòng)登錄并保存cookies
    cookies = driver.get_cookies()
    with open('cookies.json', 'w') as f:
        json.dump(cookies, f)
    logging.info("Cookie獲取完畢并已保存")

def 加載cookie(driver, cookie_file='cookies.json'):
    # 從文件中加載cookies并添加到driver
    logging.info("開始加載cookie")
    with open(cookie_file, 'r') as f:
        cookies = json.load(f)
        for cookie in cookies:
            if 'expiry' in cookie:
                del cookie['expiry']  # 刪除過(guò)期時(shí)間,避免格式錯(cuò)誤
            driver.add_cookie(cookie)
    logging.info("Cookie加載完畢")

def 安全獲取文本(job, selector, default='未知'):
    """嘗試從job對(duì)象中獲取指定選擇器的文本,如果失敗則返回默認(rèn)值"""
    try:
        return job.find(selector[0], class_=selector[1]).text.strip()
    except AttributeError:
        return default

def 獲取職位信息(driver, base_url, pages=1):
    logging.info("開始獲取職位信息")
    職位信息_list = []  
    for i in range(1, pages + 1):
        url = f'{base_url}&page={i}'
        
        加載成功 = False
        for 嘗試次數(shù) in range(3):  
            try:
                driver.get(url)
                WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "job-card-wrapper")))
                加載成功 = True
                break  
            except Exception as e:
                logging.error(f"嘗試 {嘗試次數(shù)+1} 次訪問 {url} 失敗: {e}")
                time.sleep(5)  
        
        if not 加載成功:
            logging.error(f"無(wú)法加載頁(yè)面: {url}")
            continue  
        
        soup = BeautifulSoup(driver.page_source, 'html.parser')
        jobs = soup.find_all('li', class_='job-card-wrapper')
        for job in jobs:
            # 獲取每個(gè)職位的信息,并添加到列表中
            職位名稱 = 安全獲取文本(job, ('span', 'job-name'))
            工作地點(diǎn) = 安全獲取文本(job, ('span', 'job-area'))
            薪資 = 安全獲取文本(job, ('span', 'salary'), '面議')
            標(biāo)簽列表 = [li.text for li in job.find('ul', class_='tag-list').find_all('li')]
            經(jīng)驗(yàn)要求 = 標(biāo)簽列表[0] if len(標(biāo)簽列表) > 0 else '未知'
            教育要求 = 標(biāo)簽列表[1] if len(標(biāo)簽列表) > 1 else '未知'
            聯(lián)系人 = 安全獲取文本(job, ('div', 'info-public'))
            公司名稱 = 安全獲取文本(job, ('h3', 'company-name'))
            公司標(biāo)簽列表 = [li.text for li in job.find('ul', class_='company-tag-list').find_all('li')]
            公司類型 = 公司標(biāo)簽列表[0] if len(公司標(biāo)簽列表) > 0 else '未知'
            公司規(guī)模 = 公司標(biāo)簽列表[1] if len(公司標(biāo)簽列表) > 1 else '未知'
            詳情 = ','.join([li.text for li in job.find('div', class_='job-card-footer').find('ul', class_='tag-list').find_all('li')])
            職位詳情鏈接 = "https://www.zhipin.com" + job.find('a')['href']
             # 直接將字典添加到列表中
            職位信息_list.append({
                '職位名稱': 職位名稱, 
                '工作地點(diǎn)': 工作地點(diǎn), 
                '薪資': 薪資, 
                '經(jīng)驗(yàn)要求': 經(jīng)驗(yàn)要求, 
                '教育要求': 教育要求, 
                '聯(lián)系人': 聯(lián)系人, 
                '公司名稱': 公司名稱, 
                '公司類型': 公司類型, 
                '公司規(guī)模': 公司規(guī)模, 
                '詳情': 詳情,
                '職位詳情鏈接': 職位詳情鏈接
            })
              
    # 循環(huán)結(jié)束后,使用收集到的職位信息列表創(chuàng)建DataFrame
    職位信息 = pd.DataFrame(職位信息_list)
    logging.info(f"獲取到 {len(職位信息)} 個(gè)職位信息")
    return 職位信息    

if __name__ == '__main__':
    base_url = 'https://www.zhipin.com/web/geek/job?query=&city=101240100'
    data_file = '職位信息.csv'  # 數(shù)據(jù)文件路徑
    
    # 初始化webdriver,并設(shè)置Chrome Driver
    options = webdriver.ChromeOptions()
    try:
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
        driver.set_window_size(1920, 1080)  # 調(diào)整為合適的大小
    except Exception as e:
        logging.error(f"創(chuàng)建WebDriver時(shí)出錯(cuò): {e}")
        raise

    # 第一次運(yùn)行時(shí)獲取cookie,之后可以注釋掉這行代碼
    # 獲取cookie(driver, 'https://www.zhipin.com')
    
     # 加載已有數(shù)據(jù)(如果文件存在)
    if os.path.exists(data_file):
        existing_data = pd.read_csv(data_file)
    else:
        existing_data = pd.DataFrame()

    try:
        # 加載cookie,必須先訪問網(wǎng)站才能設(shè)置cookie
        driver.get("https://www.zhipin.com")  
        加載cookie(driver)
        
        # 獲取職位信息,可以根據(jù)需要調(diào)整頁(yè)數(shù)
        新職位信息 = 獲取職位信息(driver, base_url, pages=10)  
        
        # 合并新舊數(shù)據(jù),并去除重復(fù)項(xiàng)
        更新后的職位信息 = pd.concat([existing_data, 新職位信息], ignore_index=True).drop_duplicates(subset=['職位名稱', '公司名稱'])
        
    except Exception as e:
        logging.error(f"獲取職位信息時(shí)出錯(cuò): {e}")
        driver.quit()
        raise

    # 輸出或保存職位信息到CSV文件
    print(更新后的職位信息)
    更新后的職位信息.to_csv(data_file, index=False, encoding='utf-8-sig')

    # 關(guān)閉driver
    driver.quit()

到了這里,關(guān)于Python實(shí)戰(zhàn):使用selenium及BeautifulSoup4進(jìn)行BOOS直聘信息爬取與數(shù)據(jù)累積【附源碼】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python爬蟲實(shí)現(xiàn)(requests、BeautifulSoup和selenium)

    Python爬蟲實(shí)現(xiàn)(requests、BeautifulSoup和selenium)

    Python requests 是一個(gè)常用的 HTTP 請(qǐng)求庫(kù),可以方便地向網(wǎng)站發(fā)送 HTTP 請(qǐng)求,并獲取響應(yīng)結(jié)果。 下載requests庫(kù) pip install requests 實(shí)例: 屬性和方法 屬性或方法 說(shuō)明 content 返回響應(yīng)的內(nèi)容,以字節(jié)為單位 headers 返回響應(yīng)頭,字典格式 json() 返回結(jié)果的 JSON 對(duì)象 request 返回請(qǐng)求此響應(yīng)

    2024年02月07日
    瀏覽(16)
  • 一天掌握python爬蟲【基礎(chǔ)篇】 涵蓋 requests、beautifulsoup、selenium

    一天掌握python爬蟲【基礎(chǔ)篇】 涵蓋 requests、beautifulsoup、selenium

    大家好,我是python222小鋒老師。前段時(shí)間卷了一套? Python3零基礎(chǔ)7天入門實(shí)戰(zhàn)? 以及1小時(shí)掌握Python操作Mysql數(shù)據(jù)庫(kù)之pymysql模塊技術(shù) 近日鋒哥又卷了一波課程,python爬蟲【基礎(chǔ)篇】 涵蓋 requests、beautifulsoup、selenium,文字版+視頻版。1天掌握。 視頻版教程:一天掌握python爬蟲【

    2024年02月07日
    瀏覽(70)
  • 【 Python足彩網(wǎng)站賠率數(shù)據(jù)文件自動(dòng)下載(Tkinter+BeautifulSoup+Selenium隱藏瀏覽器界面,雙線程)】

    【 Python足彩網(wǎng)站賠率數(shù)據(jù)文件自動(dòng)下載(Tkinter+BeautifulSoup+Selenium隱藏瀏覽器界面,雙線程)】

    朋友為了分析足彩的實(shí)時(shí)賠率,需要每隔一段時(shí)間自動(dòng)下載網(wǎng)站上的excel數(shù)據(jù)。因此開發(fā)了這款軟件。 總共就3個(gè)代碼塊,以下是完整源代碼。 1.第一步 :創(chuàng)建應(yīng)用程序界面 2第二步 :獲所有需要下載的URL并添加到列表。循環(huán)列表。 3第三步 :下載Excel文件。因?yàn)槭菬o(wú)頭瀏覽器

    2024年01月18日
    瀏覽(31)
  • 使用爬蟲爬取百度搜索結(jié)果及各網(wǎng)站正文(request庫(kù)、selenium庫(kù)和beautifulsoup庫(kù))

    使用爬蟲爬取百度搜索結(jié)果及各網(wǎng)站正文(request庫(kù)、selenium庫(kù)和beautifulsoup庫(kù))

    任務(wù): 給定搜索詞,獲取百度搜索結(jié)果 根據(jù)各項(xiàng)結(jié)果獲取對(duì)應(yīng)網(wǎng)站正文部分 header實(shí)際為一個(gè)字典,為訪問百度時(shí)提供必要的信息。 一般來(lái)講只需要提供 Cookie 就可以訪問大多數(shù)網(wǎng)站,其余可能需要的還有 Host 、 User-Agent 等 通過(guò)分析百度搜索url可以發(fā)現(xiàn) https://www.baidu.com/s?wd=茅

    2024年03月27日
    瀏覽(28)
  • 爬蟲入門指南(7):使用Selenium和BeautifulSoup爬取豆瓣電影Top250實(shí)例講解【爬蟲小白必看】

    爬蟲入門指南(7):使用Selenium和BeautifulSoup爬取豆瓣電影Top250實(shí)例講解【爬蟲小白必看】

    在本篇博客中,我們將使用 Python 的 Selenium 和 BeautifulSoup 庫(kù)來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)爬蟲,目的是爬取豆瓣電影TOP250的數(shù)據(jù),并將結(jié)果保存到Excel文件中。 Selenium 是一個(gè)自動(dòng)化測(cè)試工具,可以模擬用戶在瀏覽器中的交互操作。我們將使用 Selenium 來(lái)打開網(wǎng)頁(yè)、獲取網(wǎng)頁(yè)源碼。 B

    2024年02月12日
    瀏覽(24)
  • 21.8 Python 使用BeautifulSoup庫(kù)

    21.8 Python 使用BeautifulSoup庫(kù)

    BeautifulSoup庫(kù)用于從HTML或XML文件中提取數(shù)據(jù)。它可以自動(dòng)將復(fù)雜的HTML文檔轉(zhuǎn)換為樹形結(jié)構(gòu),并提供簡(jiǎn)單的方法來(lái)搜索文檔中的節(jié)點(diǎn),使得我們可以輕松地遍歷和修改HTML文檔的內(nèi)容。廣泛用于Web爬蟲和數(shù)據(jù)抽取應(yīng)用程序中。 讀者如果需要使用這個(gè)庫(kù),同樣需要執(zhí)行pip命令用以

    2024年02月08日
    瀏覽(20)
  • python使用selenium控制瀏覽器進(jìn)行爬蟲

    python使用selenium控制瀏覽器進(jìn)行爬蟲

    這里以谷歌瀏覽器為例,需要安裝一下chromedriver,其他瀏覽器也有相對(duì)應(yīng)的driver,chromedriver下載地址:https://googlechromelabs.github.io/chrome-for-testing/ 然后是打開python環(huán)境安裝一下依賴 pip install selenium ,驗(yàn)證一下控制瀏覽器是否成功 點(diǎn)擊運(yùn)行腳本可以看到以下頁(yè)面就成功了。 爬蟲

    2024年02月04日
    瀏覽(88)
  • python爬蟲request和BeautifulSoup使用

    python爬蟲request和BeautifulSoup使用

    1.安裝request 2.引入庫(kù) 3.編寫代碼 發(fā)送請(qǐng)求 我們通過(guò)以下代碼可以打開豆瓣top250的網(wǎng)站 但因?yàn)樵摼W(wǎng)站加入了反爬機(jī)制,所以我們需要在我們的請(qǐng)求報(bào)文的頭部加入U(xiǎn)ser-Agent的信息 User-Agent可以通過(guò)訪問網(wǎng)站時(shí)按f12查看獲取 我們可以通過(guò)response的ok屬性判斷是否請(qǐng)求成功 此時(shí)如果

    2024年02月08日
    瀏覽(21)
  • selenium+beautifulsoup數(shù)據(jù)爬取

    ## 準(zhǔn)備工作 ### 1、安裝selenium ``` pip install selenium ``` ### 2、安裝瀏覽器driver(以Edge瀏覽器為例) ? * 打開edge瀏覽器,然后“幫助和反饋”-“關(guān)于Microsoft Edge”,查看瀏覽器版本,根據(jù)版本號(hào)下載driver ? ? ? ![Micro.png](https://tva1.sinaimg.cn/large/005T39qaly1h3g2mw4k5gj30qo0ba41d.jpg) * 打開網(wǎng)站

    2024年03月21日
    瀏覽(18)
  • 爬蟲框架有Scrapy、BeautifulSoup、Selenium

    爬蟲框架有Scrapy、BeautifulSoup、Selenium

    爬蟲框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相對(duì)容易學(xué)習(xí)。 Scrapy的擴(kuò)展,支持和社區(qū)比BeautifulSoup更大。 Scrapy應(yīng)被視為蜘蛛,而BeautifulSoup則是Parser。 1.爬蟲基礎(chǔ)知識(shí) 在開始Python爬蟲之前,需要先掌握一些基礎(chǔ)知識(shí)。首先了解一下HTTP協(xié)議,掌握常見的請(qǐng)求方法和狀

    2024年02月07日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包