目录

一、抓取并解析数据

1.导入相关库

2、获取网页信息

3.数据清洗

4.爬取结果:

二、保存数据

1.保存到excel中

2.保存到数据库中

3.调用

三、使用flask,实现可视化

1.主函数

2.可视化界面:

2.1职位信息展示+分页

2.2使用echars制作图标

2.3导入地图

2.4制作词云

三.总结


一、获取数据

运用正则表达式,找到相对应的数据,然后对数据进行清洗,最后保存数据,保存为excel文件和保存到数据库中。(这里用的是sqlite数据库)

1.导入相关库

import re# 正则表达式,进行文字匹配from urllib.request import Requestfrom urllib.request import urlopen# 制定URL,获取网页数据from urllib.error import URLError as errorimport jsonimport xlwtimport sqlite3

2、获取网页信息

爬取到的信息是很多,需要用正则表达式进行匹配,一个工作岗位有:8个属性,我只爬取职位名称、公司名称、公司链接、工资、工作地点、是否是实习、员工待遇。

def main():baseurl = "https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="# 1.爬取网页datalist = getData(baseurl)savepath = "51job.xls"jobpath = "newjob.db"# 保存数据到表格saveData(datalist, savepath)# 保存数据到数据库saveData2DB(datalist, jobpath)# 爬取网页def getData(baseurl):datalist = []for page in range(0, 30):url1 = baseurl.format(page + 1)html = askURL(url1)# 保存获取到的网页源码# 2.逐一解析数据html_data = re.findall('window.__SEARCH_RESULT__ =(.*?)', html, re.S)html_data = ''.join(html_data)infodict = json.loads(html_data)# 将str类型的数据转换为dict类型engine_jds = infodict['engine_jds']for item in engine_jds:data = []job_href = item["job_href"]# 工作链接name = item['job_name']temp1 = re.sub('\t', '', name)# 去掉括号中的内容,英文的括号要加反斜杠temp2 = re.sub('\(.*?\)', '', temp1)# 去掉括号中的内容,中文括号job_name = re.sub('(.*?)', '', temp2)job_company = item['company_name']job_salary1 = item['providesalary_text']if job_salary1:job_salary = get_avgsalary(job_salary1)else:job_salary = ""area = item["workarea_text"]# 工作地点newarea = re.findall('(.*?)-', area, re.S)job_area = ''.join(newarea)demand = item['attribute_text'][1:]job_requirements = ' '.join(demand)if job_requirements.find(' ') != -1:job_experience, job_education = job_requirements.split(' ')else:job_experience = job_requirementsjob_fuli = item['jobwelf'] if item['jobwelf'] else '无'if job_salary == "" or job_area == "" or job_education == "":continueelse:data.append(job_href)data.append(job_name)data.append(job_company)data.append(job_salary)data.append(job_area)# data.append(job_requirements)data.append(job_experience)data.append(job_education)data.append(job_fuli)datalist.append(data)# print(datalist)return datalist

3.数据清洗

主要对薪资进行清洗,统一以万/月为单位,并取区间平均值。

# 对薪资进行数据清洗def get_avgsalary(salary):global avg_salaryif '-' in salary:# 针对10-20千/月或者10-20万/年的情况,包含-low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]high_salary = re.findall(re.compile('(\d?\.?\d+)'), salary)[1]avg_salary = (float(low_salary) + float(high_salary)) / 2avg_salary = ('%.2f' % avg_salary)if u'万' in salary and u'年' in salary:# 单位统一成万/月的形式avg_salary = float(avg_salary) / 12avg_salary = ('%.2f' % avg_salary)# 保留两位小数elif u'千' in salary and u'月' in salary:avg_salary = float(avg_salary) / 10else:# 针对20万以上/年和100元/天这种情况,不包含-,取最低工资,没有最高工资avg_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]if u'万' in salary and u'年' in salary:# 单位统一成万/月的形式avg_salary = float(avg_salary) / 12avg_salary = ('%.2f' % avg_salary)elif u'千' in salary and u'月' in salary:avg_salary = float(avg_salary) / 10elif u'元' in salary and u'天' in salary:avg_salary = float(avg_salary) / 10000 * 21# 每月工作日21天avg_salary = str(avg_salary) + '万/月'# 统一薪资格式return avg_salary

4.爬取结果:

二、保存数据

1.保存到excel中

def saveData(datalist, savepath):print("sava....")book = xlwt.Workbook(encoding="utf-8", style_compression=0)# 创建work对象sheet = book.add_sheet('python', cell_overwrite_ok=True)# 创建工作表col = ("工作链接", "工作名称", "公司", "薪资", "工作地区", "工作经验", "学历", "员工福利")for i in range(0, 8):sheet.write(0, i, col[i])# 列名for i in range(0, 1000):# print("第%d条" %(i+1))data = datalist[i]for j in range(0, 8):sheet.write(i + 1, j, data[j])# 数据book.save(savepath)# 保存数据

结果显示:

2.保存到数据库中

# 创建数据表 (表名为newjob)def init_job(jobpath):sql = '''create table newjob(id integer primary key autoincrement,job_href text,job_name varchar,job_company varchar,job_salary text ,job_area varchar ,job_experience text,job_education text,job_fuli text)'''conn = sqlite3.connect(jobpath)cursor = conn.cursor()cursor.execute(sql)conn.commit()conn.close()#将数据保存到数据库中def saveData2DB(datalist, jobpath):init_job(jobpath)conn = sqlite3.connect(jobpath)cur = conn.cursor()for data in datalist:for index in range(len(data)):data[index] = '"' + str(data[index]) + '"'sql = '''insert into newjob (job_href,job_name,job_company,job_salary,job_area,job_experience,job_education,job_fuli) values(%s)''' % ",".join(data)# print(sql)cur.execute(sql)conn.commit()cur.close()conn.close()

3.调用

在main函数中

# 保存数据到表格saveData(datalist, savepath)# 保存数据到数据库saveData2DB(datalist, jobpath)

三、使用flask,实现可视化

1.主函数

实现绘图、分词、连接数据库导入数据、制作词语等

import jieba# 分词作用from matplotlib import pyplot as plt# 绘图作用,数据可视化from wordcloud import WordCloud# 词云from PIL import Image# 图片处理import numpy as np# 矩阵运算import sqlite3# 数据库# 准备词云所需要的词con = sqlite3.connect("newjob.db")cur = con.cursor()sql = "select job_name from newjob"data = cur.execute(sql)test = ""for item in data:test = test + item[0]# print(test)cur.close()con.close()# 分词cut = jieba.cut(test)string = " ".join(cut)print(len(string))img = Image.open(r'static\assets\img\demo.png')# 打开图片img_array = np.array(img)# 将图片转化为二维数组wc = WordCloud(background_color="white",mask=img_array,font_path="msyh.ttc"# 字体所在位置c:\windows\fonts)wc.generate_from_text(string)# 绘制图片fip = plt.figure(1)plt.imshow(wc)plt.axis("off")# 是否显示坐标轴# plt.show()#显示生成的词云图片#输出词云图片到文件plt.savefig(r'static\assets\img\demo1.jpg')

2.可视化界面:

2.1职位信息展示+分页

2.2使用echars制作图标

2.3导入地图

2.4制作词云

import jieba# 分词作用from matplotlib import pyplot as plt# 绘图作用,数据可视化from wordcloud import WordCloud# 词云from PIL import Image# 图片处理import numpy as np# 矩阵运算import sqlite3# 数据库# 准备词云所需要的词con = sqlite3.connect("newjob.db")cur = con.cursor()sql = "select job_name from newjob"data = cur.execute(sql)test = ""for item in data:test = test + item[0]# print(test)cur.close()con.close()# 分词cut = jieba.cut(test)string = " ".join(cut)print(len(string))img = Image.open(r'static\assets\img\demo.png')# 打开图片img_array = np.array(img)# 将图片转化为二维数组wc = WordCloud(background_color="white",mask=img_array,font_path="msyh.ttc"# 字体所在位置c:\windows\fonts)wc.generate_from_text(string)# 绘制图片fip = plt.figure(1)plt.imshow(wc)plt.axis("off")# 是否显示坐标轴# plt.show()#显示生成的词云图片#输出词云图片到文件plt.savefig(r'static\assets\img\demo1.jpg')

三.总结

第一次写项目总结,笔记还不太完善,只是做了一个很简单的框架,简单记录一下!(需要完整项目工程文件,可以私信或留言)