# 招聘网爬虫可视化 **Repository Path**: chen-chunxi/pachongPro ## Basic Information - **Project Name**: 招聘网爬虫可视化 - **Description**: Python爬虫可视化项目 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 0 - **Created**: 2022-06-10 - **Last Updated**: 2024-05-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 项目所选技术栈 - Python ( Seleium + xpath + pymongo + pandas + numpy + pyecharts ) - 数据库 : mongoDB ## 代码展示 ### 导包 ```python import requests # 不带浏览器界面的 from selenium import webdriver from time import sleep from lxml import etree import pymongo import pandas as pd import numpy as np import re from pyecharts.charts import Bar,Pie from pyecharts import options as opts ``` ### seleium获取网页 ```python #该函数将页面抓取存入列表中 #参数说明:job_name关键字搜索 page爬取页数 def paqu(job_name,page): bro=webdriver.Chrome() sleep(1) page_list_lg = [] for i in range(1,page): bro.get("https://www.shixiseng.com/interns?page="+str(i)+"&type=school&keyword="+job_name+"&area=&months=&days=°ree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%85%A8%E5%9B%BD&internExtend=") sleep(1) text = bro.page_source page_list_lg.append(text) bro.quit() return page_list_lg lis_bigdata = paqu("大数据",10) lis_java = paqu("java",10) lis_python = paqu("python",6) lis_mysql = paqu("数据库",5) ``` ### xpath解析并存储到mongoDB ```python # 连接mongodb函数,返回一个数据库对象 def Client(url,database): client = pymongo.MongoClient(url, 27017) db = client[database] return db db=Client('localhost',"pachong_data") def insert_mongdb(mongodb_db_obj,html_lis): for j in html_lis: page = etree.HTML(j) list_result = page.xpath("//*[@id='__layout']/div/div[2]/div[2]/div[1]/div[2]/div[1]/div") for z in list_result: row = {} row.update({"岗位名称":z.xpath("./div[1]/div[1]/p[1]/a/text()")[0]}) #岗位名称 row.update({"薪资":z.xpath("./div[1]/div[1]/p[1]/span/text()")[0]}) #薪资 row.update({"公司":z.xpath("./div[1]/div[2]/p[1]/a/text()")[0]}) #公司 row.update({"地区":z.xpath("./div[1]/div[1]/p[2]/span[1]/text()")[0]}) #地区 row.update({"经验":z.xpath("./div[1]/div[1]/p[2]/span[2]/text()")[0]}) #经验 row.update({"学历":z.xpath("./div[1]/div[1]/p[2]/span[3]/text()")[0]}) #学历 mongodb_db_obj["sxz_pachong_data"].insert_one(row) return insert_mongdb(db,lis_bigdata) insert_mongdb(db,lis_java) insert_mongdb(db,lis_python) insert_mongdb(db,lis_mysql) ``` ### pandas numpy整理数据+pyecharts可视化 ```python # 读取mongodb中的数据 df = pd.DataFrame(list(Client('localhost',"pachong_data")["sxz_pachong_data"].find())) del df["_id"] avg_lis=[] for i in df[df["薪资"]!="薪资面议"]["薪资"]: # 通过正则取出数字 lis=re.findall("\d+",i) if len(lis)==1: value=int((lis[0])) avg_lis.append(value) else: value=(int((lis[0]))+(int(lis[1])))/2 avg_lis.append(value) df.loc[df["薪资"]!="薪资面议","薪资"]=[i for i in avg_lis] # 数据完全整合完毕 ``` ```python # df["地区"].value_counts()[:6] # 北京 105 # 上海 80 # 广州 37 # 成都 33 # 深圳 31 # 杭州 30 bj_java=int(df[df["地区"]=="北京"]["岗位名称"].str.contains("java",case=False).sum()) bj_bigdata=int(df[df["地区"]=="北京"]["岗位名称"].str.contains("大数据",case=False).sum()) bj_python=int(df[df["地区"]=="北京"]["岗位名称"].str.contains("python",case=False).sum()) bj_db=int(df[df["地区"]=="北京"]["岗位名称"].str.contains("数据库",case=False).sum()) sh_java=int(df[df["地区"]=="上海"]["岗位名称"].str.contains("java",case=False).sum()) sh_bigdata=int(df[df["地区"]=="上海"]["岗位名称"].str.contains("大数据",case=False).sum()) sh_python=int(df[df["地区"]=="上海"]["岗位名称"].str.contains("python",case=False).sum()) sh_db=int(df[df["地区"]=="上海"]["岗位名称"].str.contains("数据库",case=False).sum()) gz_java=int(df[df["地区"]=="广州"]["岗位名称"].str.contains("java",case=False).sum()) gz_bigdata=int(df[df["地区"]=="广州"]["岗位名称"].str.contains("大数据",case=False).sum()) gz_python=int(df[df["地区"]=="广州"]["岗位名称"].str.contains("python",case=False).sum()) gz_db=int(df[df["地区"]=="广州"]["岗位名称"].str.contains("数据库",case=False).sum()) cd_java=int(df[df["地区"]=="成都"]["岗位名称"].str.contains("java",case=False).sum()) cd_bigdata=int(df[df["地区"]=="成都"]["岗位名称"].str.contains("大数据",case=False).sum()) cd_python=int(df[df["地区"]=="成都"]["岗位名称"].str.contains("python",case=False).sum()) cd_db=int(df[df["地区"]=="成都"]["岗位名称"].str.contains("数据库",case=False).sum()) sz_java=int(df[df["地区"]=="深圳"]["岗位名称"].str.contains("java",case=False).sum()) sz_bigdata=int(df[df["地区"]=="深圳"]["岗位名称"].str.contains("大数据",case=False).sum()) sz_python=int(df[df["地区"]=="深圳"]["岗位名称"].str.contains("python",case=False).sum()) sz_db=int(df[df["地区"]=="深圳"]["岗位名称"].str.contains("数据库",case=False).sum()) hz_java=int(df[df["地区"]=="杭州"]["岗位名称"].str.contains("java",case=False).sum()) hz_bigdata=int(df[df["地区"]=="杭州"]["岗位名称"].str.contains("大数据",case=False).sum()) hz_python=int(df[df["地区"]=="杭州"]["岗位名称"].str.contains("python",case=False).sum()) hz_db=int(df[df["地区"]=="杭州"]["岗位名称"].str.contains("数据库",case=False).sum()) bar = Bar() bar.add_xaxis(["北京","上海","广州","成都","深圳","杭州"]) bar.add_yaxis("java工程师",[bj_java,sh_java,gz_java,cd_java,sz_java,hz_java]) bar.add_yaxis("大数据工程师",[bj_bigdata,sh_bigdata,gz_bigdata,cd_bigdata,sz_bigdata,hz_bigdata]) bar.add_yaxis("python工程师",[bj_python,sh_python,gz_python,cd_python,sz_python,hz_python]) bar.add_yaxis("数据库工程师",[bj_db,sh_db,gz_db,cd_db,sz_db,hz_db]) bar.set_global_opts(title_opts={"text": "各城市各岗位统计数量", "subtext": "单位:人数"}) bar.render_notebook() ``` ```python da=df[df["薪资"]!="薪资面议"] da[da["地区"]=="北京"]["薪资"].mean() da[da["地区"]=="北京"]["薪资"].max() da[da["地区"]=="北京"]["薪资"].min() bar=Bar() bar.add_xaxis(["北京","上海","广州","成都","深圳","杭州"]) bar.add_yaxis("最高薪资",[ float(da[da["地区"]=="北京"]["薪资"].max()), float(da[da["地区"]=="上海"]["薪资"].max()), float(da[da["地区"]=="广州"]["薪资"].max()), float(da[da["地区"]=="成都"]["薪资"].max()), float(da[da["地区"]=="深圳"]["薪资"].max()), float(da[da["地区"]=="杭州"]["薪资"].max()), ],color="#ffd85c") bar.add_yaxis("平均薪资",[ float(np.round(da[da["地区"]=="北京"]["薪资"].mean(),1)), float(np.round(da[da["地区"]=="上海"]["薪资"].mean(),1)), float(np.round(da[da["地区"]=="广州"]["薪资"].mean(),1)), float(np.round(da[da["地区"]=="成都"]["薪资"].mean(),1)), float(np.round(da[da["地区"]=="深圳"]["薪资"].mean(),1)), float(np.round(da[da["地区"]=="杭州"]["薪资"].mean(),1)), ],color="#37a2da") bar.add_yaxis("最低薪资",[ float(da[da["地区"]=="北京"]["薪资"].min()), float(da[da["地区"]=="上海"]["薪资"].min()), float(da[da["地区"]=="广州"]["薪资"].min()), float(da[da["地区"]=="成都"]["薪资"].min()), float(da[da["地区"]=="深圳"]["薪资"].min()), float(da[da["地区"]=="杭州"]["薪资"].min()), ],color="#c8b2f4") bar.set_global_opts(title_opts={"text": "各城市薪资水平", "subtext": "单位:k/月"}) bar.render_notebook() ``` ```python dic=dict(df["地区"].value_counts()[:6]) dic.update({"其他城市":int(df["地区"].count()-df["地区"].value_counts()[:6].sum())}) x=dic.keys() y=[int(i) for i in dic.values()] dic1=dict(df["学历"].value_counts()) x1=dic1.keys() y1=[int(i) for i in dic1.values()] pie=Pie() pie.add("",[z for z in zip(x,y)], center=["25%", "50%"], radius=[0, "40%"], ) pie.set_colors(["#42506b","#f04a4c","#ffb7a4","#a5673f","#1cbbb4","#3a857a","#8799a3"]) pie.add("",[z for z in zip(x1,y1)], radius=["20%", "40%"], center=["65%", "50%"], ) pie.set_global_opts(title_opts=opts.TitleOpts(title="各城市招聘人数占比以及学历水平要求占比"), legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_right="0%")) pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}占{d}%",is_show=True), tooltip_opts=opts.TooltipOpts(formatter="{b}占{d}%")) pie.render_notebook() ``` ```python df_java=df[(df["薪资"]!="薪资面议")&(df["岗位名称"].str.contains("JAVA",case=False))] df_bigdata=df[(df["薪资"]!="薪资面议")&(df["岗位名称"].str.contains("大数据",case=False))] df_python=df[(df["薪资"]!="薪资面议")&(df["岗位名称"].str.contains("python",case=False))] df_db=df[(df["薪资"]!="薪资面议")&(df["岗位名称"].str.contains("数据库",case=False))] java_avg = float(np.round(df_java["薪资"].mean(),2)) java_max = float(np.round(df_java["薪资"].max(),2)) java_min = float(np.round(df_java["薪资"].min(),2)) bigdata_avg = float(np.round(df_bigdata["薪资"].mean(),2)) bigdata_max = float(np.round(df_bigdata["薪资"].max(),2)) bigdata_min = float(np.round(df_bigdata["薪资"].min(),2)) python_avg = float(np.round(df_python["薪资"].mean(),2)) python_max = float(np.round(df_python["薪资"].max(),2)) python_min = float(np.round(df_python["薪资"].min(),2)) db_avg = float(np.round(df_db["薪资"].mean(),2)) db_max = float(np.round(df_db["薪资"].max(),2)) db_min = float(np.round(df_db["薪资"].min(),2)) bar=Bar() bar.add_xaxis(["JAVA工程师","大数据工程师","Python工程师","数据库工程师"]) bar.add_yaxis("最高薪资",[java_max,bigdata_max,python_max,db_max],color="orange") bar.add_yaxis("平均薪资",[java_avg,bigdata_avg,python_avg,db_avg],color="gray") bar.add_yaxis("最低薪资",[java_min,bigdata_min,python_min,db_min],color="green") bar.set_global_opts(title_opts={"text": "各岗位薪资水平", "subtext": "单位:k/月"}) # 条形图转换 bar.reversal_axis() bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right",font_size=13)) bar.render_notebook() ``` # 可视化展示 ![image-20220610210933810](readme.assets/image-20220610210933810.png)![image-20220610210951667](readme.assets/image-20220610210951667.png)![image-20220610211004866](readme.assets/image-20220610211004866.png)![image-20220610211016864](readme.assets/image-20220610211016864.png)