1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python爬虫大作业+数据可视化分析(抓取python职位)

Python爬虫大作业+数据可视化分析(抓取python职位)

时间:2024-01-14 17:16:00

相关推荐

Python爬虫大作业+数据可视化分析(抓取python职位)

目录

一、抓取并解析数据

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 = "/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__ =(.*?)</script>', 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('', '', 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(pile('(d*.?d+)'), salary)[0]high_salary = re.findall(pile('(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(pile('(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)mit()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)mit()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'staticassetsimgdemo.png') # 打开图片img_array = np.array(img) # 将图片转化为二维数组wc = WordCloud(background_color="white",mask=img_array,font_path="msyh.ttc" # 字体所在位置 c:windowsonts)wc.generate_from_text(string)# 绘制图片fip = plt.figure(1)plt.imshow(wc)plt.axis("off") # 是否显示坐标轴# plt.show() #显示生成的词云图片#输出词云图片到文件plt.savefig(r'staticassetsimgdemo1.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'staticassetsimgdemo.png') # 打开图片img_array = np.array(img) # 将图片转化为二维数组wc = WordCloud(background_color="white",mask=img_array,font_path="msyh.ttc" # 字体所在位置 c:windowsonts)wc.generate_from_text(string)# 绘制图片fip = plt.figure(1)plt.imshow(wc)plt.axis("off") # 是否显示坐标轴# plt.show() #显示生成的词云图片#输出词云图片到文件plt.savefig(r'staticassetsimgdemo1.jpg')

三.总结

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

先自我介绍一下,小编上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。