Python+selenium爬取智聯招聘的職位信息

整個爬蟲是基於selenium和Python來運行的,運行須要的包python

 1 mysql,matplotlib,selenium mysql

須要安裝selenium火狐瀏覽器驅動,百度的搜尋。git

整個爬蟲是模塊化組織的,不一樣功能的函數和類放在不一樣文件中,最後將須要配置的常量放在constant.py中github

項目地址:github(點擊直達)web

整個爬蟲的主線程是Main.py文件,在設置好constant.py後就能夠直接運行Main.pysql

從主線分析數據庫

Main.py瀏覽器

 1 # /bin/python
 2 # author:leozhao
 3 # author@email: dhzzy88@163.com
 4 
 5 """
 6 這是整個爬蟲系統的主程序
 7 """
 8 import numpy as np
 9 
10 import dataFactory
11 import plotpy
12 import sqlDeal
13 import zhilian
14 from Constant import JOB_KEY
15 
16 #
17 # 啓動爬蟲程序
18 zhilian.spidefmain(JOB_KEY)
19 
20 """
21  爬取數據結束後對數據可視化處理
22 """
23 # 從數據庫讀取爬取的數據
24 # 先獲得的是元組name,salray,demand,welfare
25 
26 value = sqlDeal.sqlselect()
27 # 工資上限,下限,平均值
28 updata = np.array([], dtype=np.int)
29 downdata = np.array([], dtype=np.int)
30 average = np.array([], dtype=np.int)
31 for item in value:
32     salray = dataFactory.SarayToInt(item[1])
33     salray.slove()
34     updata = np.append(updata, salray.up)
35     downdata = np.append(downdata, salray.down)
36     average = np.append(average, (salray.up + salray.down) / 2)
37 
38 # 工資上下限
39 average.sort()
40 
41 # 匹配城市信息 暫時還未實現
42 
43 # 統計信息
44 # 兩種圖形都加載出來 方便查看
45 plotpy.plotl(average)
46 plotpy.plots(average)
47 
48 print(average, average.sum())
49 print("平均工資:", average.sum() / len(average))
50 print("最高:", average.max())
51 print("最低", average.min())
52 print("職位數", len(average))
53 
54 # 畫圖

基本是以爬蟲整個執行流程來組織的app

從功能文件中導入zhilian.pyless

 1 # /bin/python
 2 # author:leo
 3 # author@email : dhzzy88@163.com
 4 from selenium import webdriver
 5 from selenium.webdriver.common.by import By
 6 from selenium.webdriver.common.keys import Keys
 7 from selenium.webdriver.support import expected_conditions as EC
 8 from selenium.webdriver.support.ui import WebDriverWait
 9 
10 import sqlDeal
11 from Constant import PAGE_NUMBER
12 
13 
14 def init(key="JAVA"):
15     # 智聯招聘的主頁搜索關鍵字,初始化到採集頁面
16     url = "https://www.zhaopin.com/"
17     opt = webdriver.FirefoxOptions()
18     opt.set_headless()           #設置無頭瀏覽器模式
19     driver = webdriver.Firefox(options=opt)
20     driver.get(url)
21     driver.find_element_by_class_name("zp-search-input").send_keys(key)
22     # driver.find_element_by_class_name(".zp-search-btn zp-blue-button").click()
23     driver.find_element_by_class_name("zp-search-input").send_keys(Keys.ENTER)
24     import time
25     time.sleep(2)
26     all = driver.window_handles
27     driver.switch_to_window(all[1])
28     url = driver.current_url
29     return url
30 
31 
32 class ZhiLian:
33 
34     def __init__(self, key='JAVA'):
35         # 默認key:JAVA
36         indexurl = init(key)
37         self.url = indexurl
38         self.opt = webdriver.FirefoxOptions()
39         self.opt.set_headless()
40         self.driver = webdriver.Firefox(options=self.opt)
41         self.driver.get(self.url)
42 
43     def job_info(self):
44 
45         # 提取工做信息     能夠把詳情頁面加載出來
46         job_names = self.driver.find_elements_by_class_name("job_title")
47         job_sarays = self.driver.find_elements_by_class_name("job_saray")
48         job_demands = self.driver.find_elements_by_class_name("job_demand")
49         job_welfares = self.driver.find_elements_by_class_name("job_welfare")
50         for job_name, job_saray, job_demand, job_welfare in zip(job_names, job_sarays, job_demands, job_welfares):
51             sqlDeal.sqldeal(str(job_name.text), str(job_saray.text), str(job_demand.text), str(job_welfare.text))
52 
53         # 等待頁面加載
54         print("等待頁面加載")
55         WebDriverWait(self.driver, 10, ).until(
56             EC.presence_of_element_located((By.CLASS_NAME, "job_title"))
57         )
58 
59     def page_next(self):
60         try:
61             self.driver.find_elements_by_class_name("btn btn-pager").click()
62         except:
63             return None
64         self.url = self.driver.current_url
65         return self.driver.current_url
66 
67 
68 def spidefmain(key="JAVA"):
69     ZHi = ZhiLian(key)
70     ZHi.job_info()
71     # 設定一個爬取的頁數
72     page_count = 0
73     while True:
74         ZHi.job_info()
75         ZHi.job_info()
76         page_count += 1
77         if page_count == PAGE_NUMBER:
78             break
79     # 採集結束後把對象清除
80     del ZHi
81 
82 
83 if __name__ == '__main__':
84 spidefmain("python")

這是調用selenium模擬瀏覽器加載動態頁面的程序,整個爬蟲的核心都是圍繞這個文件來進行的。

每爬取一頁信息之後就把解析的數據存儲到數據庫裏,數據庫處理函數的定義放在另一個文件裏,這裏只處理加載和提取信息的邏輯

將數據存入本機的mysql數據庫

 1 # /bin/python
 2 # author:leozhao
 3 # author@email :dhzzy88@163.com
 4 
 5 import mysql.connector
 6 
 7 from Constant import SELECT
 8 from Constant import SQL_USER
 9 from Constant import database
10 from Constant import password
11 
12 
13 def sqldeal(job_name, job_salray, job_demand, job_welfare):
14     conn = mysql.connector.connect(user=SQL_USER, password=password, database=database, use_unicode=True)
15     cursor = conn.cursor()
16     infostring = "insert into zhilian value('%s','%s','%s','%s')" % (
17         job_name, job_salray, job_demand, job_welfare) + ";"
18     cursor.execute(infostring)
19     conn.commit()
20     conn.close()
21 
22 
23 def sqlselect():
24     conn = mysql.connector.connect(user=SQL_USER, password=password, database=database, use_unicode=True)
25     print("鏈接數據庫讀取信息")
26     cursor = conn.cursor()
27 
28     cursor.execute(SELECT)
29     values = cursor.fetchall()
30     conn.commit()
31     conn.close()
32     return values

兩個函數

第一個負責存入數據

第二個負責讀取數據

讀取數據之後在另外的類中處理獲得的數據

例如10K-20K這樣的信息,爲可視化作準備

# /bin/python
# author:leozhao
# author@email : dhzzy88@163.com

import matplotlib.pyplot as plt
import numpy as np

from Constant import JOB_KEY


# 線型圖


def plotl(dta):
    dta.sort()
    print("dta", [dta])
    num = len(dta)
    x = np.linspace(0, num - 1, num)
    print([int(da) for da in dta])
    print(len(dta))
    plt.figure()
    line = plt.plot(x, [sum(dta) / num for i in range(num)], dta)

    # plt.xlim(0, 250)
    plt.title(JOB_KEY + 'Job_Info')
    plt.xlabel(JOB_KEY + 'Job_Salray')
    plt.ylabel('JobNumbers')
    plt.show()


# 條形圖


def plots(dta):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.hist(dta, bins=15)
    plt.title(JOB_KEY + 'Job_Info')
    plt.xlabel(JOB_KEY + 'Job_Salray')
    plt.ylabel('JobNumbers')
plt.show()

最後將獲得的數據放入在畫圖程序中畫圖

最後計算相關數據

在爬取過程當中及時將數據存入數據庫,減小虛擬機內存的佔比。

下面放上數據結果

上面是金融的工做的薪酬調查

下面是材料科學的薪酬調查

藍色爲平均工資。

注意在平均線以上的基本爲博士和碩士的學歷要求。

具體的數據處理沒時間弄,有時間再作。

相關文章
相關標籤/搜索