python爬虫某招聘数据进行可视化
今日美文:如果你在学习的过程中感受到了枯燥与无味,你不妨好好看看那些用剩余时间偷闲的人,他们放松了你就能从枯燥与无味的学习里获取到了优越!!!因为坚持学习本就不是一件容易的事。但是如果你比别人坚持得久,你就能超越他们,慢慢来,时间会证明一切。别让拖延症误了你,摆脱它!!!
·
1、数据的获(pa)取
目录
俩天没见,大家的爬虫能力如何了?不知道大家的能力如何,反正我的代码结果依旧很乱,这次我爬的是某聘wang,数据分析的前10页岗位内容,多的不说少的不唠,上代码!!!
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
'''开始实例化浏览器'''
print(0)
f = open('大家记得改下这里-数据分析招聘信息.txt', 'w')
drive = webdriver.Chrome()
drive.get('https://www.zhipin.com/?sid=sem_pz_bdpc_dasou_title')
drive.maximize_window()
drive.find_element(By.CSS_SELECTOR, ".home-body-wrapper .column-search-panel .ipt-search").send_keys("数据分析")
drive.find_element(By.CSS_SELECTOR, ".search-panel-new .btn-search").click()
1-这里的代码是啥意思,相信大家也应该或多或少等看清楚一些,第一个内容当然是用库来获取了,而第二个内容,依旧老样子,初始化浏览器,输入你想要的岗位名称并点击
'''获取元素 1、职位名称
2公司名称
3、薪资水平
4、工作地点
5、工作经验
6、学历条件
'''
for i in range(1, 11):
drive.refresh()
print(1)
drive.implicitly_wait(10)
框架 = drive.find_elements(By.CSS_SELECTOR, '.job-card-wrapper')
print(2)
time.sleep(2)
if len(框架) >= 1:
for i in 框架:
print(3)
time.sleep(2)
'''获取岗位地址'''
address = i.find_element(By.CSS_SELECTOR,
'.job-card-wrapper .job-card-left .job-title .job-area-wrapper .job-area').text
'''获取岗位名称'''
job_name = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .job-title .job-name').text
'''获取公司名称'''
company = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-right .company-name a').text
'''获取薪资水平'''
money = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .salary').text
'''这个是啥意思你就慢慢猜吧,我也是英汉互译,毕竟英语水平有限(经验)'''
experience = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .tag-list :first-child').text
'''获取学历要求'''
edcation = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .tag-list li+li').text
'''写入文档'''
f.write(
str(address + ',' + job_name + ',' + company + ',' + money + ',' + experience + ',' + edcation) + "\n")
print(str(address + ',' + job_name + ',' + company + ',' + money + ',' + experience + ',' + edcation))
2-以上呢就是我如何获取元素信息的内容了,大家记得找元素定位的时候,如果你找的元素不止一个,记得element要加S,这个初中英语老师就已经给你们讲过了吧!
time.sleep(2)
'''利用滑块,使得页面得以跳动,模拟人工'''
js = 'window.scrollTo(0,2000)'
drive.execute_script(js)#读不懂就对了,这是js代码,滑动滑块的
time.sleep(3)
drive.find_element(By.XPATH, '//*[@class="options-pages"]/a[10]').click()
time.sleep(3)
#这里因为我爬取了很多次,为了防止IP被限制,我特地打印一下看看有没有获取到内容,当然
#这里你也可以用try
else:
print('没有内容,停止运行')
break
'''重点,这里一定要记得关闭文档,否则,你看看里面能给你什么'''
f.close()
3-这里是个小重点,一定一定一定要记得close()以下文件,否则你会和我一样懵逼,是不是有没找到元素
上完整代码!
'''导入相关的库'''
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
'''开始实例化浏览器'''
print(0)
'''先打开文件'''
f = open('BOSS直聘网-数据分析招聘信息.txt', 'w')
drive = webdriver.Chrome()
drive.get('https://www.zhipin.com/?sid=sem_pz_bdpc_dasou_title')
drive.maximize_window()
drive.find_element(By.CSS_SELECTOR, ".home-body-wrapper .column-search-panel .ipt-search").send_keys("数据分析")
drive.find_element(By.CSS_SELECTOR, ".search-panel-new .btn-search").click()
'''获取元素 1、职位名称
2公司名称
3、薪资水平
4、工作地点
5、工作经验
6、学历条件
'''
for i in range(1, 11):
drive.refresh()
print(1)
drive.implicitly_wait(10)
框架 = drive.find_elements(By.CSS_SELECTOR, '.job-card-wrapper')
print(2)
time.sleep(2)
if len(框架) >= 1:
for i in 框架:
print(3)
time.sleep(2)
'''获取岗位地址'''
address = i.find_element(By.CSS_SELECTOR,
'.job-card-wrapper .job-card-left .job-title .job-area-wrapper .job-area').text
'''获取岗位名称'''
job_name = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .job-title .job-name').text
'''获取公司名称'''
company = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-right .company-name a').text
'''获取薪资水平'''
money = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .salary').text
'''这个是啥意思你就慢慢猜吧,我也是英汉互译,毕竟英语水平有限(经验)'''
experience = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .tag-list :first-child').text
'''获取学历要求'''
edcation = i.find_element(By.CSS_SELECTOR, '.job-card-wrapper .job-card-left .tag-list li+li').text
'''写入文档'''
f.write(
str(address + ',' + job_name + ',' + company + ',' + money + ',' + experience + ',' + edcation) + "\n")
print(str(address + ',' + job_name + ',' + company + ',' + money + ',' + experience + ',' + edcation))
time.sleep(2)
'''利用滑块,使得页面得以跳动,模拟人工'''
js = 'window.scrollTo(0,2000)'
drive.execute_script(js)#读不懂就对了,这是js代码,滑动滑块的
time.sleep(3)
drive.find_element(By.XPATH, '//*[@class="options-pages"]/a[10]').click()
time.sleep(3)
#这里因为我爬取了很多次,为了防止IP被限制,我特地打印一下看看有没有获取到内容,当然
#这里你也可以用try
else:
print('没有内容,停止运行')
break
'''重点,这里一定要记得关闭文档,否则,你看看里面能给你什么'''
f.close()
你不会以为这就结束了?才走了一半的路,坚持点!继续
2、数据清洗进行可视化
这里是可视化部分,你看,这样看我这些字好看吗?
那不得这样看?继续,上代码!
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
import jieba
f=open('BOSS直聘网-数据分析招聘信息.txt','r')
f1=f.readlines()#导入爬取的文本数据
'''文本数据处理方法'''
def data_handle():
'''定义三个列表,分别为:'''
'''地区'''
address=[]
'''薪资'''
money=[]
'''学历'''
edcation=[]
for i in f1:
'''直接向导入money的平均值'''
money_1=i.strip().split(",")[-3]
if '薪' in money_1:
money_2=money_1[:-5:].split("-")
money.append((int(money_2[0])+int(money_2[1]))//2)
elif '天' in money_1:
pass
money_3=money_1[:-3:].split('-')
money.append((int(money_3[0])+int(money_3[1]))//2)
else:
money_4 = money_1[:-1:].split('-')
money.append((int(money_4[0])+int(money_4[1]))//2)
'''添加学历'''
if '月' in i.split(',')[-1]:
edcation.append('本科')
else:
edcation.append(i.split(',')[-1].strip('\n'))
'''添加地址'''
address_1=i.split(',')[0].split('·')
address.append(address_1[0])
return address,money,edcation
'''数据处理及异常值清洗'''
def save(address,money,edcation):
data={"工作地点":address,
"薪资":money,
"学历":edcation}
'''使得数据整体美观'''
pd.set_option("display.unicode.east_asian_width", True)
df=pd.DataFrame(data=data)
'''重复值处理'''
df[df.duplicated(subset=['工作地点'])]#查找重复值
df.drop_duplicates(subset=['工作地点'],inplace=True)#删除重复值,我这里就保留第一条
return df
n--不记得多少了--还记得你保存了的数据文档吗?很难慢慢翻构思出大概情况来吧。。。。。。。。这里就该好好的处理一下它,让他变得好看起来,同学们要记得数据分析可视化的库,pandas,numpy ,sklearn,seaborn,matplotlib,当然,就这些小数据用不上这么大排面,熊猫(pandas)和matplotlib就够了,你又不是要进行什么聚类分析,相关分析,敏感分析啥的,这些就够了,想要去了解这些库的同学记得画圈,是个小重点
第一个方法!!!这是说的是上图,第一个方法的作用是用于进行数据的清洗,你爬这么多页人家肯定会有重复的地区吧,咱现在就把重复的地区给去除掉,薪资就取平均值,学历就取众数,当然,我这里是瞎取得,数据分析岗位的薪资咋可能这么低是吧。df[df.duplicated(subset=['工作地点'])]这个方法要记得是用于按照某列筛选重复值的, df.drop_duplicates(subset=['工作地点'],inplace=True)而这个方法是按照什么列来去掉重复值的,data={"工作地点":address,
"薪资":money,
"学历":edcation}
'''使得数据整体美观'''
pd.set_option("display.unicode.east_asian_width", True)
df=pd.DataFrame(data=data),这个方法,是用来将txt文本的内容读取出来筛选后转化为熊猫duixiang的,没错,就是他的对象。
def show(df):
df1=df[0:15]
df2=df[15:30]
df3=df[30:46]
return df1,df2,df3
def show_1(df):
'''这里需要提前说明解决中文乱码问题'''
plt.rcParams["font.sans-serif"]=["SimHei"]
'这里通过print(df.shape[0]) 返回行数'
x=[i for i in range(15)]
fig = plt.figure(figsize=(10, 10))
ax1 = fig.add_subplot(1, 1, 1)
'''设置图表标题'''
plt.title("数据分析岗位要求情况",fontsize=20,fontweight=20)
'''绘制柱状图'''
ax1.bar(df['工作地点'], df['薪资'])
'''添加x标签'''
ax1.set_xlabel('地区', fontsize=20)
'''添加y1轴标签'''
ax1.set_ylabel('薪资/千元', fontsize=20)
'''共享x轴'''
ax2 = ax1.twinx()
'''绘制y形式'''
ax2.plot(x, df["学历"], color='red', linestyle='--', marker='o')
'''添加y2轴标签'''
ax2.set_ylabel("学历", fontsize=15,fontweight=20)
plt.show()
2n--——能看懂吗?看不懂?那就对了,这玩意是用来把你清洗好的数据绘图的,思考一下,你的变量有三个,money,学历,公司地址,但是你又想只在一张表上做,这咋办?换样?不可能,好歹还是个python,当然自有双y方法,来,上完整代码
# 作者:杨家乐
# 阶段:进阶练习中,请稍后.......
# 开发时间:2022/10/10 21:24
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
import jieba
f=open('BOSS直聘网-数据分析招聘信息.txt','r')
f1=f.readlines()#导入爬取的文本数据
'''文本数据处理方法'''
def data_handle():
'''定义三个列表,分别为:'''
'''地区'''
address=[]
'''薪资'''
money=[]
'''学历'''
edcation=[]
for i in f1:
'''直接向导入money的平均值'''
money_1=i.strip().split(",")[-3]
if '薪' in money_1:
money_2=money_1[:-5:].split("-")
money.append((int(money_2[0])+int(money_2[1]))//2)
elif '天' in money_1:
pass
money_3=money_1[:-3:].split('-')
money.append((int(money_3[0])+int(money_3[1]))//2)
else:
money_4 = money_1[:-1:].split('-')
money.append((int(money_4[0])+int(money_4[1]))//2)
'''添加学历'''
if '月' in i.split(',')[-1]:
edcation.append('本科')
else:
edcation.append(i.split(',')[-1].strip('\n'))
'''添加地址'''
address_1=i.split(',')[0].split('·')
address.append(address_1[0])
return address,money,edcation
'''数据处理及异常值清洗'''
def save(address,money,edcation):
data={"工作地点":address,
"薪资":money,
"学历":edcation}
'''使得数据整体美观'''
pd.set_option("display.unicode.east_asian_width", True)
df=pd.DataFrame(data=data)
'''重复值处理'''
df[df.duplicated(subset=['工作地点'])]#查找重复值
df.drop_duplicates(subset=['工作地点'],inplace=True)#删除重复值,我这里就保留第一条
return df
'''制作双2-y轴图标'''#应为要涉及到学历与薪资这俩个应变量,也可以用热力图
def show(df):
df1=df[0:15]
df2=df[15:30]
df3=df[30:46]
return df1,df2,df3
def show_1(df):
'''这里需要提前说明解决中文乱码问题'''
plt.rcParams["font.sans-serif"]=["SimHei"]
'这里通过print(df.shape[0]) 返回行数'
x=[i for i in range(15)]
fig = plt.figure(figsize=(10, 10))
ax1 = fig.add_subplot(1, 1, 1)
'''设置图表标题'''
plt.title("数据分析岗位要求情况",fontsize=20,fontweight=20)
'''绘制柱状图'''
ax1.bar(df['工作地点'], df['薪资'])
'''添加x标签'''
ax1.set_xlabel('地区', fontsize=20)
'''添加y1轴标签'''
ax1.set_ylabel('薪资/千元', fontsize=20)
'''共享x轴'''
ax2 = ax1.twinx()
'''绘制y形式'''
ax2.plot(x, df["学历"], color='red', linestyle='--', marker='o')
'''添加y2轴标签'''
ax2.set_ylabel("学历", fontsize=15,fontweight=20)
plt.show()
if __name__ == '__main__':
address,money,edcation=data_handle()
df=save(address,money,edcation)
df1,df2,df3=show(df)
show_1(df1)
show_1(df2)
show_1(df3)
4n—————大家千万要记得,我的df1 df2 df3 是用熊猫对象来切分出来的,这么多数据,你不得从电脑这头看到你宿舍对面去?肯定得让他们乖乖分开,至于在哪分的,你好好思考看看。
好奇图片长啥样吗?、、
、、、要学会坚持,这个就会是你的成果啦
图片与具体情况不具体符合,因为是我的处理,所以误差不可避免
3、成品展示
大家千万不要被作者的成果蒙蔽了双眼,数据可视化的能力可不止这一点,是我的能力太弱,只能勉强召唤一下它,给你们好好看看他的真正面目(数据可视化也能如此)
怎么样?炫酷吧,没错,也许你看到的只是图片,但其实图片下面隐藏了成千百万条数据,如果让你一个个慢慢看,肯定得猴年马月了,这就是数据可视化的作用,想学吗?从熊猫开始!变成一名强者。不断地坚持你就能拥有它!
今日美文:如果你在学习的过程中感受到了枯燥与无味,你不妨好好看看那些用剩余时间偷闲的人,他们放松了你就能从枯燥与无味的学习里获取到了优越!!!因为坚持学习本就不是一件容易的事。但是如果你比别人坚持得久,你就能超越他们,慢慢来,时间会证明一切。别让拖延症误了你,摆脱它!!!
更多推荐
已为社区贡献2条内容
所有评论(0)