招聘數據統計網站搭建全紀實

聲明:該項目涉及到的一切東西僅做學習交流使用

正文:

因爲想做成一個網站而不是簡單的僅僅本地的分析,所以先構思了一下網站,網站首頁需要的數據有:職業分類以及各個職業名字

沒啥好說的,訪問首頁,簡單的解析即可拿到我們的數據

分類的前面加上----便於區分,職業名不加

接下來是拿數據了,按照正常邏輯,我們打開f12,查看請求返回數據,但是開始解析時候蒙了,返回數據裏面沒有我們想要的東西,這下麻煩了。它不可能不拿數據,所以數據一定是隱藏起來了,這個時候打開我們的小夜壺,charles

ctrf+f 搜索一波,這裏我們從瀏覽器可以看到有高級Java開發工程師(互聯網)這個職業,我們搜索

找到了

在這裏,是通過api獲得的json數據,那太好了,還省去了在html代碼中的解析,速度肯定快的一逼

分析請求url

https://fe-api.zhaopin.com/c/i/sou?start=60&pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=Java%E5%BC%80%E5%8F%91&kt=3&_v=0.04066879&x-zp-page-request-id=c83e9ead92984692afd4f6a8c5390d22-1544064629149-133328

start爲開始位置,pagesize是一次返回的數據量,cityid是城市,489爲全國,workexperience工作經驗 -1意思是不限,education 學歷,companytype公司類型(民營,國企),再往後兩個也是職業描述方面的,都是-1就行了,kw不用說,是我們選取的職業名,kt=3我也不曉得啥玩意兒,照做就是了,再往後的東西一看就是隨機的,可以刪掉

得出結論 我們每次只需要更改start以及kw,即可獲取到不同職業下的很多條數據,貼上核心代碼部分

def parse_html(html):
    resource = json.loads(html)
    about_jobs = resource['data']['results']
    for i in range(59):
        base = about_jobs[i]
        company = base['company']
        city    = base['city']
        welfare  = base['welfare']

        company_name = company['name']
        company_url  = company['url']
        company_size = company['size']['name']
        company_type = company['type']['name']
        workingExp   = base['workingExp']['name']
        eduLevel     = base['eduLevel']['name']
        salary       = base['salary']
        emplType     = base['emplType']
        createDate   = base['createDate']
        updateDate   = base['updateDate']
        endDate      = base['endDate']
        address      = city['display']
        daiyu        = ''
        timeState = base['timeState']
        job_name = base['jobType']['display']
        for k in welfare:
            daiyu   = daiyu   + k + ' '
        save_datas('0',job_name,eduLevel,workingExp,salary,emplType,daiyu,company_name,company_type,company_size,address.strip(),company_url,createDate,updateDate,endDate,timeState)

這下拿到數據了,開始我們網站的建設。使用的是django,pyecharts

echarts是百度的開源可視化框架,pyecharts是基於echarts開發,方便python開發者使用

關於pyecharts的使用不再贅述,附上官方網址http://pyecharts.org/#/zh-cn/感謝官方大大

熟悉的配置settings,配置urls,配置models,配置views。

舉個栗子:

def javakaifa_fun(request):
    results = javakaifa.objects.all()
    address, salary, edu, exp, keywords,js_list = get_parms(results)
    number = len(results)
    return render(request,'app/baseHtml.html',{'address':address,'salary':salary,'edu':edu,'exp':exp,'keyword':keywords,'js_list':js_list,'number':number})

這是點擊Java開發後會進入的view,通過模型對象拿到數據庫對應表中的所有數據,再將數據傳入get_parms處理函數中處理,返回我們需要的五個圖表的js代碼以及他們所需要的js依賴,最後將這些數據連同數據量的大小一同傳入base.html進行渲染展示。

base.html部分代碼

<div class="ui container">
            <div class="ui container" id="address">
                {{ address|safe }}
            </div>
        </div>

每個圖表的js放到一個div中,且div對應有一個id,這樣js代碼才能正確操作div

值得一提的是,一般的返回的js生成的圖表在瀏覽器中是默認位置的,不是自適應居中,所以我對其進行了一些處理

base_add_js1 = '*****'
base_add_js2 = '*****'
def return_add_js2(arg1):
    return r'window.onresize = function () {resizeContainer();myChart_'+arg1+'.resize();};'
def return_add_js1(arg1):
    return u"var "+arg1+"_Container = document.getElementById('"+arg1+"');var resizeContainer = function () {"+arg1+"_Container.style.width = "+arg1+"_Container.clientWidth + 'px';"+arg1+"_Container.style.height = ("+arg1+"_Container.clientWidth)/2 + 'px';};resizeContainer();"
def add_js(result,id):
    global base_add_js2
    result1 = result[101:]
    replace2 = re.search(r'[a-f0-9]{32}', result1).group()
    base_add_js2 = id
    result2 = result1.replace(replace2, id)
    final_result_1 = result2.replace('<script type="text/javascript">','<script type="text/javascript">'+'\n'+return_add_js1(base_add_js1))
    final_result = final_result_1.replace('</script>',return_add_js2(base_add_js2)+'\n'+'</script>')
    return final_result

附上調用部分:

def edu_charte(edu_dic):
    global base_add_js1
    attr, values = get_valus(edu_dic, 10)
    bar = Bar('')
    bar.add('',attr,values)
    base_add_js1 = 'edu'
    return add_js(bar.render_embed(),'edu'),bar.get_js_dependencies()

這樣子是肯定不行的,我們查看源代碼

在pyecharts\\base.py大概第123行,本來是return Markup(html), Markup註釋寫的大概是讓代碼變安全,某些不合法的會被轉義掉,這明顯不符合我的想法,開玩笑,我可是要對js拼接操作的,所以我修改了源代碼,改成了return html。這下就可以用上面的js處理函數來處理,並返回拼接後的js代碼,我們再把這些js傳到html中,即可居中自適應展示圖表。

過程中還有一個問題,生成地圖的時候,默認是中國地圖,當然我需要的也是中國地圖,不影響,但是某些數據的地點可能是國外,也可能不合法的,當然可以在外面進行過濾,我沒選擇這種方式,沒錯,我又去改源代碼了,加了個try,except,這樣如果報錯的數據我不要就是了。

好了,到這兒基本結束。網站大功告成

附上網址,有興趣的可以訪問以下:http://132.232.145.114/第一次訪問圖表頁面會異常的慢,請耐心等待,第二次就好了

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