首页 > Python资料 博客日记
Python爬虫大作业+数据可视化分析(抓取python职位)
2024-06-25 11:00:06Python资料围观168次
这篇文章介绍了Python爬虫大作业+数据可视化分析(抓取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 Request
from urllib.request import urlopen # 制定URL,获取网页数据
from urllib.error import URLError as error
import json
import xlwt
import 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°reefrom=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('\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_requirements
job_fuli = item['jobwelf'] if item['jobwelf'] else '无'
if job_salary == "" or job_area == "" or job_education == "":
continue
else:
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_salary
if '-' 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)) / 2
avg_salary = ('%.2f' % avg_salary)
if u'万' in salary and u'年' in salary: # 单位统一成万/月的形式
avg_salary = float(avg_salary) / 12
avg_salary = ('%.2f' % avg_salary) # 保留两位小数
elif u'千' in salary and u'月' in salary:
avg_salary = float(avg_salary) / 10
else: # 针对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) / 12
avg_salary = ('%.2f' % avg_salary)
elif u'千' in salary and u'月' in salary:
avg_salary = float(avg_salary) / 10
elif 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')
▍学习资源推荐
零基础Python学习资源介绍
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(学习教程文末领取哈)
👉Python必备开发工具👈
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
资料领取
上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj