聲明:該項目涉及到的一切東西僅做學習交流使用
正文:
因爲想做成一個網站而不是簡單的僅僅本地的分析,所以先構思了一下網站,網站首頁需要的數據有:職業分類以及各個職業名字
沒啥好說的,訪問首頁,簡單的解析即可拿到我們的數據
分類的前面加上----便於區分,職業名不加
接下來是拿數據了,按照正常邏輯,我們打開f12,查看請求返回數據,但是開始解析時候蒙了,返回數據裏面沒有我們想要的東西,這下麻煩了。它不可能不拿數據,所以數據一定是隱藏起來了,這個時候打開我們的小夜壺,charles
ctrf+f 搜索一波,這裏我們從瀏覽器可以看到有高級Java開發工程師(互聯網)這個職業,我們搜索
找到了
在這裏,是通過api獲得的json數據,那太好了,還省去了在html代碼中的解析,速度肯定快的一逼
分析請求url
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/第一次訪問圖表頁面會異常的慢,請耐心等待,第二次就好了