Boss直聘數據採集及分析

 

Boss直聘數據採集及分析 

我主要採集了Boss web端西安5月Python招聘情況,後面會在代碼註釋中進行解釋

採集中碰到的問題參考,也許你也會遇到

採集

問題點

爲了繞過boss直聘網站對selenium的檢測需要做以下初始化工作:

  1. 首先開啓:chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile";這句話在你的谷歌瀏覽器可執行文件夾運行,會在你的C:\selenum\ 生成一大堆文件
  2. 其次代碼中需要添加:chrome_options.add_experimental_option('debuggerAddress','127.0.0.1:9222');開啓谷歌瀏覽器代理,爲了繞過boss對selenium的檢測
  3. 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招聘崗位很少,其中爬蟲崗位又少之又少且不穩定,而且整體大環境導致西安軟件行業並不健全,社保福利不健全,純技術方向發展方向又較爲狹小,要麼需要身兼數職(啥都會),要麼需要高手中的高手。西安本土互聯網行業沒有大公司,剩下的都是小公司類型,他們只會站在業務角度,因此這裏的開發可以說是爲了養家餬口而開發,爲了開發而開發,並沒有特別出彩的技術方向,不像北上廣可以深入技術路線,不斷產出新的技術框架,新的技術產品,這裏,只有業務,沒有創新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章