天天看點

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

目錄

  • 前言
  • 項目準備
  • 網頁分析
    • 關于動态渲染
    • 關于翻頁
  • 需求分析與功能實作
    • 詳情頁分析
    • 擷取詳情資料
  • 結果展示
  • 可視化觀察
    • 學曆統計
    • 工作經驗統計
  • 最後

前言

在上一篇文章中,為大家分享了selenium的使用方法,是以今天這篇文章為大家帶了的就是關于selenium的實戰項目。

本次項目的内容是爬取51job的招聘資訊,希望接下來的内容對你找工作有所幫助。

項目準備

本次項目涉及到的庫比較多,需要各位小夥伴們先做好準備:

  • requests
  • selenium
  • lxml
  • csv
  • pandas
  • matplotlib

安裝方式應該不需要我再概述了吧。

網頁分析

當所有必要内容都準備好了之後,就要開始分析網頁了。

網站連結如下:

https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=
           

打開的頁面,如下圖所示:

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

從上面的網址來看,它存在的參數特别多,能不能像百度一樣,把後面的參數去掉呢?

那我們就來試試,删除參數之後的連結如下所示:

https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html
           

将連結複制到浏覽器,打開的頁面如下所示:

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

經過觀察發現,和之前的頁面并無差別。

關于動态渲染

該網頁經過分析之後發現,如果直接使用requests向目标網址發送請求,可以發現有些動态加載的資料無法加載出來,可能導緻爬蟲出錯,是以這裡使用selenium自動測試工具,模拟發送請求,并加載資料。

關于翻頁

經過測試,發現該職位下一共有81頁的職位,是以需要擷取到每一頁的連結,是以,在這裡又需要來觀察不同頁面的連結規律了。

# 第一頁
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html
# 第二頁
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,2.html
# 第三頁
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,3.html
           

想必聰明的小夥伴們都發現了,URL的變化規律了吧。

隻需要通過簡單的for循環就可以解決了。

需求分析與功能實作

詳情頁分析

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

每一個招聘資訊,我們都需要點選進去,才能看到每個招聘崗位的詳細資訊。裡面的内容才是我們真正需要的,如下圖所示:

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

那麼應該如何擷取詳情頁的URL呢?

首先打開開發者工具,使用選擇器進行選擇即可,如下圖所示:

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

你會發現詳情頁的URL都放在了class屬性為j_joblist的div标簽下的div标簽下的a标簽,隻需要提取a标簽的href屬性即可。

具體代碼如下所示:

def get_link():
    link_lists = []	# 儲存詳情頁URL
    browser = webdriver.Chrome()
    for page in range(1, 82):
        browser.get(f'https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,{page}.html')
        wait = WebDriverWait(browser, 5)
        button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.j_joblist')))
        # print(button)
        joblists = browser.find_elements_by_xpath('//div[@class="j_joblist"]/div/a')
        # print(joblists)
        for joblist in joblists:
            con_link = joblist.get_attribute('href')
            link_lists.append(con_link)
    browser.quit()
    return link_lists
           

接下來,我就對上面的幾行代碼做簡單的分析。

wait = WebDriverWait(browser, 5)
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.j_joblist')))
# print(button)
joblists = browser.find_elements_by_xpath('//div[@class="j_joblist"]/div/a')
           

這裡首先引入WebDriverWait這個對象,指定最長的等待時間,然後調用它的until()方法,傳入等待條件,譬如:這裡傳入了element_to_be_clickable,代表節點出現的意思,其參數是節點的定位元組。

擷取詳情資料

當我們将81頁的詳情頁的連結都拿到手之後,隻需通過requests向這些URL發送請求即可。

我們要在詳情頁中提取的資料主要有:

  • 崗位名稱
  • 薪資
  • 工作經驗
  • 學曆
  • 招聘人數
  • 工作地點
  • 福利

具體代碼如下所示:

def get_data(url_lists):

    with open('data_all3.csv', 'a', encoding='utf-8-sig', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['連結', '崗位名稱', '薪資', '工作經驗', '學曆','招聘人數','工作地點','福利'])
    job_information = []
    for i, url in enumerate(url_lists):
        datalist = []
        headers = {
            'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
        }
        time.sleep(0.5)
        response = requests.get(url, headers=headers)
        # print(response.status_code)
        try:
            html = response.content.decode('gbk')
            # print(html)
            data = etree.HTML(html)
            datalist.append(url)    # 存入崗位連接配接
            title = data.xpath('//div[@class="cn"]/h1/@title')[0]  # 崗位名稱
            # print(title)

            datalist.append(title)
            salary = data.xpath('//div[@class="cn"]/strong/text()')[0]
            datalist.append(salary)
            # print(datalist)
            information = data.xpath('//p[@class="msg ltype"]/@title')[0] # 地點、學曆、人數
            information = re.sub(r'\s+', '', information)
            experience = information.split('|')[1]  # 工作經驗
            # print(experience)
            datalist.append(experience)
            education = information.split('|')[2]   # 學曆
            datalist.append(education)
            num = information.split('|')[3] # 招聘人數
            datalist.append(num)
            place = data.xpath('//p[@class="fp"]/text()')[0]
            # print(place)
            datalist.append(place)
            treament = ' '.join(data.xpath('//span[@class="sp4"]/text()'))  # 福利
            datalist.append(treament)
            # job_info = '\n'.join(data.xpath('//div[@class="bmsg job_msg inbox"]/p/text()'))
            # datalist.append(job_info)
            # print(treament)
            # print(job_info)
            print(f'第{i}條')
            print(datalist)
            with open('data_all3.csv', 'a' ,encoding='utf-8-sig', newline='') as csvfile:
                writer  = csv.writer(csvfile)
                writer.writerow(datalist)
           

結果展示

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

經過半個小時的抓取,終于抓到3779條招聘資訊了。

我直接一句好家夥!!

Python的職位這麼多嗎?

可視化觀察

學曆統計

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

因為有些公司并沒有指定學曆,是以會出現,招幾人的結果。

不過從上面,我們也可以看出,目前Python的崗位還是大學生是居多的,其次是大專,最後是碩士。

工作經驗統計

好家夥!Python的職位居然這麼多前言項目準備網頁分析需求分析與功能實作結果展示可視化觀察最後

有些公司并沒有指定工作經驗,是以會出現學曆在這邊。

不過從上面已經可以看出,目前的企業最需要的擁有3-4年工作時間的程式員,如果你已經有了3-4年的工作經驗的話,那是很容易可以找到使你滿意的工作的。

最後

沒有什麼事情是可以一蹴而就的,生活如此,學習亦是如此!

是以,哪裡會有什麼三天速成,七天速成的說法呢?

唯有堅持,方能成功!

啃書君說:

文章的每一個字都是我用心敲出來的,隻希望對得起每一位關注我的人。在文章末尾點個【贊】,讓我知道,你也在自己的未來拼搏和努力着。

路漫漫其修遠兮,吾将上下而求索。

我是啃書君,一個專注于學習的人,你懂的越多,你不懂的越多,更多精彩内容,我們下期再見!