1. 程式人生 > >selenium+PyQuery+chrome headless 爬取智聯招聘求職資訊

selenium+PyQuery+chrome headless 爬取智聯招聘求職資訊

最近導師讓自己摸索摸索Python爬蟲,好了就開始一發不可收拾的地步。正巧又碰到有位同學需要一些求職資訊對求職資訊進行資料分析,本著練練手的目的寫了用Python爬取智聯招聘網站的資訊。這一爬取不得了,智聯網站更新了,以前的大佬們的程式碼不能用,而且全是動態載入,反爬蟲著實對於小白的我實在是累的不行,靜態還沒怎麼學會動態的爬取就開始了,各種遇見坑,再出來。不過終於功夫不負有心人,也算是馬馬虎虎搞出來了。先上圖

一個檔案裡面大概不到3000條資料,不算多。

首先,我就不講什麼是selenium,以及怎麼安裝還有chrome 的headless怎麼使用。這裡csdn上面有很多大牛已經給予完美的解釋了ps主要我也說不好只是瞭解以及使用。

當你把這些基礎性工作做完了,比如Python安裝完畢,以及selenium PyQuery安裝完畢後就可以看我的程式碼詳解了。其實大家都是小白所以程式碼會有詳細的註釋,看看註釋就明白了。廢話不多說直接上程式碼,有啥不懂得歡迎諮詢我。[email protected],或者留言給我。謝謝各位看官。

#首頁負責呼叫
import savecsv as save


pagenum=int(input("輸入您要爬取的頁數"))
save.savecsv(pagenum)

# 爬取文章
from selenium import webdriver
import time, random
from pyquery import PyQuery as pq
import os
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys


def _urldata_(url, pageNum):
    # 新版本不支援phantomjs
    # browser = webdriver.PhantomJS()
    # 採用瀏覽器自帶的無頭瀏覽器進行查詢
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    browser = webdriver.Chrome(options=chrome_options)

    browser.get(url)

    # # 定義一個大的列表將一個職位所有的招聘資訊都放進去
    joblist = []
    # 點選下一頁進行訪問頁面
    for i in range(1, pageNum+1):
        # 對動態網頁查詢並使用pyquery進行分析
        doc = pq(browser.page_source)
        # 獲取一個多個相同屬性
        # htm = doc('[class="listItemBox clearfix"]')
        # print(htm)
        html = doc('[class="listItemBox clearfix"]').items()


        listSum = []
        # 獲取單個屬性
        for tb in html:
            # 定義一個空字典,用於儲存陣列
            item = {}
            # 提取崗位
            job_title_info = tb('.job_title')
            job_title = job_title_info.attr('title')
            # 獲取公司名
            company_title = tb('.company_title').text()
            # 獲取薪資
            job_saray = tb('.job_saray').text()
            # 獲取地址,工作要求年限,學歷
            job_demand = tb('.demand_item').items()

            job_demand_info = []
            for job in job_demand:
                job_demand_info.append(job.text())

            # 獲取企業名稱以及企業人數
            commpanyDesc = tb('.info_item').items()

            company_info = []
            for job in commpanyDesc:
                company_info.append(job.text())


            # 獲取更詳細的資訊
            job_welfare = tb('.welfare_item').items()

            job_welfare_info = []
            for job in job_welfare:
                job_welfare_info.append(job.text())

            job_welfare_info_list = "|".join(job_welfare_info)

            # 填入陣列
            item['job_title'] = job_title
            item['company_title'] = company_title
            item['job_saray'] = job_saray
            item['job_demand_info_address'] = job_demand_info[0]
            item['job_demand_info_age'] = job_demand_info[1]
            item['job_demand_info_back'] = job_demand_info[2]
            item['company_info_back'] = company_info[0]

            item['job_welfare_info_list'] = job_welfare_info_list

            listSum.append(item)


        # 將所有的頁面的內容進行儲存
        joblist += listSum
        browser.find_elements_by_class_name('btn-pager')[1].click()
        print("爬取第" + str(i) + "頁")
        print("資料共" + str(len(listSum)) + "條")
        # 防止被和諧
        p = random.randint(1, 4)
        time.sleep(p)

    return joblist
    browser.quit()

# _urldata_('https://sou.zhaopin.com/?pageSize=60&jl=530&kw=python&kt=3')
# 儲存成csv格式
import csv
import spiderurl as combin


def savecsv(pageNum):
    # 定義一個大的列表將所有的招聘資訊都放進去
    job_name = ['python', 'java', '機器學習', '資料探勘', 'c++']
    # job_name = ['python']
    # 工作名字
    for job in job_name:
        # print(job)
        joblist = []
        # 將頁面讀取的資料儲存起來
        # 每個工作的名字工作資訊

        url = 'https://sou.zhaopin.com/?pageSize=60&jl=530&kw=' + job + '&kt=3'
        print("開始爬取工作:"+job+"地址是:"+url)

        # 拼接完成爬取檔案並解析
        joblist = combin._urldata_(url, pageNum)

        # 把資料存成csv格式
        filenames = ["job_title", "company_title", "job_saray", "job_demand_info_address", "job_demand_info_age",
                     "job_demand_info_back",
                     "company_info_back", "job_welfare_info_list"]
        for list in joblist:
            # 以字典的形式寫入檔案
            with open(job + ".csv", "a", errors="ignore", newline='') as fp:
                f_csv = csv.DictWriter(fp, fieldnames=filenames)
                f_csv.writerow(list)

歡迎評論,我會及時回覆的。