声明:该项目涉及到的一切东西仅做学习交流使用
正文:
因为想做成一个网站而不是简单的仅仅本地的分析,所以先构思了一下网站,网站首页需要的数据有:职业分类以及各个职业名字
没啥好说的,访问首页,简单的解析即可拿到我们的数据
分类的前面加上----便于区分,职业名不加
接下来是拿数据了,按照正常逻辑,我们打开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/第一次访问图表页面会异常的慢,请耐心等待,第二次就好了