整個爬蟲是基於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()
最後將獲得的數據放入在畫圖程序中畫圖
最後計算相關數據
在爬取過程當中及時將數據存入數據庫,減小虛擬機內存的佔比。
下面放上數據結果
上面是金融的工做的薪酬調查
下面是材料科學的薪酬調查
藍色爲平均工資。
注意在平均線以上的基本爲博士和碩士的學歷要求。
具體的數據處理沒時間弄,有時間再作。