Boss直聘數據採集及分析
我主要採集了Boss web端西安5月Python招聘情況,後面會在代碼註釋中進行解釋
採集
問題點
爲了繞過boss直聘網站對selenium的檢測需要做以下初始化工作:
- 首先開啓:chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile";這句話在你的谷歌瀏覽器可執行文件夾運行,會在你的C:\selenum\ 生成一大堆文件
- 其次代碼中需要添加:chrome_options.add_experimental_option('debuggerAddress','127.0.0.1:9222');開啓谷歌瀏覽器代理,爲了繞過boss對selenium的檢測
- chrome_driver = r"D:\chrome-selenium\chromedriver_win32\chromedriver.exe" # selenium驅動
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options) # 將代理添加進來
注意谷歌瀏覽器版本要與你的chromedriver版本一致,否則無法啓動。chromeDrive下載網址
#!/usr/bin/python3
# encoding: utf-8
"""
@version: v1.0
@author: W_H_J
@license: Apache Licence
@contact: [email protected]
@software: PyCharm
@file: Boss.py
@time: 2020/5/8 15:21
@describe: boss直聘數據抓取
chromdriver :https://npm.taobao.org/mirrors/chromedriver
selenium: D:\chrome-selenium\chromedriver_win32\chromedriver.exe
參考:https://blog.csdn.net/qq_35531549/article/details/89023525
首先開啓:chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"
上面這句話在你的谷歌瀏覽器可執行文件夾運行,會在你的C:\selenum\ 生成一大堆文件
其次添加:chrome_options.add_experimental_option('debuggerAddress','127.0.0.1:9222')
上面這句話,相當於開啓你的谷歌瀏覽器代理,爲了繞過boss對selenium的檢測
"""
import hashlib
import sys
import os
import time
import requests
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from fake_useragent import UserAgent
from config.MysqlContent import DBHelper
sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))
sys.path.append("..")
UA = UserAgent() # 獲取fake_useragent中的瀏覽器請求頭
DB = DBHelper() # 我自己寫的MySQL助手,如果不存入MySQL,可以忽略
def driver_chrome():
"""
加載selenium瀏覽器
:return:
"""
try:
agent = UA.random
chrome_options = Options()
chrome_options.add_experimental_option('debuggerAddress', '127.0.0.1:9222') # 開啓代理模式
chrome_driver = r"D:\chrome-selenium\chromedriver_win32\chromedriver.exe" # 加載自己本地驅動
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options) # 開啓selenium
return driver, agent
except Exception as e:
print(e, "driver_chrome")
def get_cookies(url):
"""
獲取網站session
:param url:
:return:
"""
session = {}
try:
driver, agent = driver_chrome()
driver.get(url)
cookies = driver.get_cookies()
for i in cookies:
session[i.get('name')] = i.get('value')
str_session = ""
for k, v in session.items():
str_session += k + "=" + v + ";"
return str_session, agent
except Exception as e:
print(e, "get_cookies")
def first_page(index):
"""
抓取頁面
:param index: 翻頁
:return:
"""
key_word = "python" # 要檢索的關鍵字,因爲我採集python信息,所以寫python
url = "https://www.zhipin.com/c101110100/?query={}&page={}&ka=page-next".format(key_word, index)
print("==============>", url)
cookie, agent = get_cookies(url)
# print("cookie:", cookie, agent)
# cookie中有一部分爲關鍵的加密信息,用selenium就是要獲取此部分信息,否則無法抓取,不用selenium就需要去破解那部分加密js
headers = {
"Host": "www.zhipin.com",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"cookie": '__c=1588920748; __g=-; lastCity=100010000; __l=l=%2Fwww.zhipin.com%2Fjob_detail%2F9bef0dd287a0be061XF73Nm0FFE~.html&r=&friend_source=0&friend_source=0; __zp_seo_uuid__=f771bb8f-4df1-4f67-9a81-4e916fe7a01e; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1588920748,1588921100,1588922589; toUrl=https%3A%2F%2Fwww.zhipin.com%2F%2Fjob_detail%2Fa1d0d9b2bb9e31611HJ52Ni0Fls%7E.html; JSESSIONID=""; __a=51155662.1588920748..1588920748.27.1.27.27; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1588925506; {}'.format(cookie),
"pragma": "no-cache",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": agent
}
# print(headers['cookie'])
html = requests.get(url, headers=headers)
print(html)
doc = pq(html.text)
doc2 = doc("#main > div.job-box > div.job-list > ul > li")
print("-" * 100)
sql_insert = "INSERT INTO boss_index (title_id,href,title,price,red,know,company,company_desc,tag,info_desc,job_area) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
list_params = []
for x in doc2.items():
href = "https://www.zhipin.com" + x("div > div.info-primary > div.primary-wrapper > div > div.job-title > span.job-name > a").attr("href")
title = x("div > div.info-primary > div.primary-wrapper > div > div.job-title > span.job-name > a").text()
price = x("div > div.info-primary > div.primary-wrapper > div > div.job-limit.clearfix > span").text()
if '實習' in title:
try:
x1, x2, know = x("div > div.info-primary > div.primary-wrapper > div > div.job-limit.clearfix > p").html().split('<em class="vline"/>')
experience = x1 + ',' + x2
except:
experience, know = x("div > div.info-primary > div.primary-wrapper > div > div.job-limit.clearfix > p").html().split('<em class="vline"/>')
else:
experience, know = x("div > div.info-primary > div.primary-wrapper > div > div.job-limit.clearfix > p").html().split('<em class="vline"/>')
company = x("div > div.info-primary > div.info-company > div > h3 > a").text()
company_desc_temp = x("div > div.info-primary > div.info-company > div > p").html().split('<em class="vline"/>')
company_desc = [pq(y).text() for y in company_desc_temp]
tag_temp = x("div > div.info-append.clearfix > div.tags").items()
tag = [y.text().split(" ") for y in tag_temp][0]
info_desc = x("div > div.info-append.clearfix > div.info-desc").text()
job_area = x("div > div.info-primary > div.primary-wrapper > div > div.job-title > span.job-area-wrapper > span").text()
print("href:", href)
print("title:", title)
print("price:", price)
print("red:", experience)
print("know:", know)
print("company:", company)
print("company_desc:", company_desc)
print("tag:", tag)
print("info_desc:", info_desc)
print("job_area:", job_area)
print()
list_params.append(
[get_md5(href), href, title, price, experience, know, company, str(company_desc), str(tag), info_desc,
job_area])
print("全部數據:", list_params)
# DB.insert_many(sql_insert, list_params) # 數據入庫
def get_md5(url):
"""
由於hash不處理unicode編碼的字符串(python3默認字符串是unicode)
所以這裏判斷是否字符串,如果是則進行轉碼
初始化md5、將url進行加密、然後返回加密字串
"""
if isinstance(url, str):
url = url.encode("utf-8")
md = hashlib.md5()
md.update(url)
return md.hexdigest()
def run():
for page in range(1, 11):
first_page(page)
time.sleep(10)
if __name__ == '__main__':
run()
採集數據分析
以5月西安Python招聘情況爲例,整個樣本391條招聘數據
1. 西安整體python全職招聘情況:純python開發只佔68%,剩下就是講師、實習及其他開發捎帶着python開發了,看來西安整個python佔比並不是很高。
2. 西安python招聘工作地點要求:其中西安那根柱子,主要是雁塔+高新,因此可以看出,整個招聘地點集中才西安的雁塔區和高新區比較多一點,想找工作的朋友就要在此區域考慮交通出行了。
3. 整體的薪資範圍及浮動區間:按照招聘崗位發佈的數據看,10~15k的還佔比較高,不過實際能給到這個數的其實可能還得除以2了,其實佔比較爲均勻的還是12K以下的,可能受限於西安這個整體大環境吧。
4. 學歷要求佔比:碩士、博士的就不用說了,因爲西安做大數據的公司較少,所以碩士的比例稍微低一點,一般做大數據方向的或者自然科學的會要求碩士及以上,整個樣本中可以看出還是得本科起步了,其中因爲西安高校本來就很多,招聘公司又會要求985、211等學校的,因此大專學歷的會越來越不好在該行業從事工作了。
5. 工作經驗要求:結合上面學歷要求,工作經驗不限的基本集中在大專範圍或者實習生範圍,其他最起碼1~3年了,3~5年數據較多是因爲西安的華爲外包發不了大量招聘崗位,導致佔比較高。
6. 公司規模:要說西安沒有大公司還真是,1000人以上的,基本都是外包公司,他們發佈了大量的招聘崗位導致數據分佈在這些區間,其實真實的數據分佈在0~20人、20~99人這些小規模公司,如果此前在大公司工作,可能直接轉小公司會不太適應,因爲各種制度的混亂,各種流程的欠缺,公司規模不同,整個工作氛圍和環境會有很大的差別,尤其是個人職業發展方向及發展空間。
7. 公司福利排行:公司越大,福利越健全,TOP10 外包公司佔比很大,TOP10 以外的公司簡介中的福利看看就好,基本上都是招聘的時候複製粘貼過來的,西安五險一金不健全的公司很多,面試一定要確認清楚。
8. 招聘公司詞雲分析:看到沒,西安招聘python的主流公司都是外包公司,可以說這邊公司招聘分爲三個梯隊:第一梯隊(外包公司,且佔大比例);第二梯隊(培訓教育機構,是給小孩及其他培訓的,不是北京那種讓你交錢入職的那種哦);第三梯隊(其他各類小公司或者某大公司在西安的分部)
9. 說到了培訓公司,看看培訓公司福利:如果考慮轉崗倒是可以瞅瞅培訓類公司,至於五險一金,僅供參考,不過培訓類講師基本都沒有晚上的時間和週末,其實和程序員加班來看,他們不用上早班,上夜班倒也是不錯呢。
10. 薪資比例、範圍:比起北上廣,基本都是12薪,小公司不給你想法設法剋扣工資都不錯了。
11. 具體崗位分析詞雲:因爲西安整個大環境問題,純Python開發比例其實較低,並且其他各項技能分佈比較平均,沒有特別突出的崗位要求,說白了一句話,開發要的基本技能基本都要會,LINUX和爬蟲深受公司HR所喜愛。
12. Python爬蟲崗位:因爲近一兩年爬蟲招聘崗位較多,專門看了看,整個爬蟲佔總體招聘比例只有2.3%,其中專職爬蟲又佔整個純python開發67.77%中的3.4%,因此,整體爬蟲招聘是相當殘酷,可以說Boss發佈的爬蟲崗位很少,或者說西安整體對爬蟲崗位的需求並不是很大,看了看這些公司具體崗位要求,發現數據公司佔比很低,幾乎都是將爬蟲列爲可有可無的崗位,或者僅有短期招聘需求,大白話(幹一段時間,公司要的數據採集完了,可能就不再需要這個崗位了,因此你的考慮自身入職公司的整體業務是幹啥的了,防止還在試用,結果採集完公司所需數據,然後被炒魷魚了)
整體分析的維度差不多就上面幾條了,最終結論,西安Python招聘崗位很少,其中爬蟲崗位又少之又少且不穩定,而且整體大環境導致西安軟件行業並不健全,社保福利不健全,純技術方向發展方向又較爲狹小,要麼需要身兼數職(啥都會),要麼需要高手中的高手。西安本土互聯網行業沒有大公司,剩下的都是小公司類型,他們只會站在業務角度,因此這裏的開發可以說是爲了養家餬口而開發,爲了開發而開發,並沒有特別出彩的技術方向,不像北上廣可以深入技術路線,不斷產出新的技術框架,新的技術產品,這裏,只有業務,沒有創新。