爬取千库网ppt_前程无忧爬虫、数据清洗及可视化

本文展示了如何使用Python爬取前程无忧网站的职位信息,包括岗位名称、公司名称、工作地点、工资等,并进行了数据清洗,如去重、格式转换和关键词筛选。接着对数据进行了简单的分析,如工资水平计算、工作地点处理和经验要求整理。最后,数据被保存为Excel文件,便于使用Tableau进行进一步的可视化和分析。
摘要由CSDN通过智能技术生成

#!/usr/bin/env python

# -*- coding:utf-8 -*-

importrequests

importpandasaspd

#from pprint import pprint

fromlxmlimportetree

importtime

foriinrange(39,1000):

print("正在爬取第"+ str(i) +"页的数据")

url_end =".html?"

url = url_start + str(i) + url_end

headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'

}

response = requests.get(url, headers=headers)

response.encoding ="gbk"

#解析内容

content = etree.HTML(response.text)

# 1、岗位名称

job_name = content.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@title')

print(job_name)

# 2、公司名称

company_name = content.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t2"]/a[@target="_blank"]/@title')

# 3、工作地点

address = content.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t3"]/text()')

# 4、工资

salary_mid = content.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t4"]')

salary = [i.textforiinsalary_mid]

# 5、获取二级网址url

deep_url = content.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@href')

Education = []

Experience = []

CompanyType = []

CompanySize = []

Industry = []

df = pd.DataFrame()

foriinrange(len(deep_url)):

response_deep = requests.get(deep_url[i], headers=headers)

response_deep.encoding ="gbk"

content_deep = etree.HTML(response_deep.text)

#6学历和7经验要求

education = content_deep.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[3]')

experience = content_deep.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[2]')

# 8、公司类型

company_type = content_deep.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[1]/text()')

# 9、公司规模(人数)

company_size = content_deep.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[2]/text()')

# 10、所属行业(公司)

industry = content_deep.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[3]/a/text()')

# 将上述信息保存到各自的列表中

Education.append(education)

Experience.append(experience)

CompanyType.append(company_type)

CompanySize.append(company_size)

Industry.append(industry)

# 为了反爬,设置睡眠时间

time.sleep(1)

# 由于我们需要爬取很多页,为了防止最后一次性保存所有数据出现的错误,因此,我们每获取一页的数据,就进行一次数据存取。

df["岗位名称"] = job_name

df["公司名称"] = company_name

df["工作地点"] = address

df["工资"] = salary

df["学历要求"] = Education

df["经验要求"] = Experience

df["公司类型"] = CompanyType

df["公司规模"] = CompanySize

df["所属行业"] = Industry

# 这里在写出过程中,有可能会写入失败,为了解决这个问题,我们使用异常处理。

try:

df.to_csv("51job_info1.csv", mode="a+", header=None, index=None, encoding="gbk")

except:

print("当页数据写入失败")

time.sleep(2)

数据清洗使用的是pandas,为了学习tableau,可视化没有使用matplotlib。

#!/usr/bin/env python

# coding=gbk

importpandas aspd

importnumpy asnp

importre

importwarnings

warnings.filterwarnings("ignore")

df = pd.read_csv(r'C:\Users\Administrator\PycharmProjects\untitled1\venv\51job_info.csv')

# 为数据框指定行索引

df.index = range(len(df))

df.columns = ["岗位名称","公司名称","工作地点","工资",

"学历要求","经验要求","公司类型","公司规模","所属行业"]

# 数据去重

print("去重之前的记录数",df.shape)

df.drop_duplicates(["岗位名称","公司名称"],inplace=True)

df.reset_index(drop = True)

print("去重之后的记录数",df.shape)

#数据格式化

#1、岗位名称

a = df["岗位名称"].value_counts()

print(a)

df["岗位名称"] = df["岗位名称"].apply(lambdax:x.lower()) #不区分大小写AI=Ai

target_job = ['数据','分析','算法', '开发', '工程', '运营', '运维'] #列出关键字

shifouhanyou = [df["岗位名称"].str.count(i) fori intarget_job] #对岗位名称进行筛选求和

shifouhanyou= np.array(shifouhanyou).sum(axis=0) > 0

df = df[shifouhanyou].reset_index(drop=True)

#2、工资

df["工资"].str[-1].value_counts()

df["工资"].str[-3].value_counts()

defget_money_max_min(x):

try:

ifx[-3] == "万":

z = [float(i)*10000 fori inre.findall("[0-9]+\.?[0-9]*",x)]

elifx[-3] == "千":

z = [float(i) * 1000 fori inre.findall("[0-9]+\.?[0-9]*", x)]

ifx[-1] == "年":

z = [i/12 fori inz]

returnz

except:

returnx

salary = df["工资"].apply(get_money_max_min)

df["最低工资"] = salary.str[0]

df["最高工资"] = salary.str[1]

df["工资水平"] = df[["最低工资","最高工资"]].mean(axis=1)

print(df["工资水平"])

#3、工作地点

address_list = ['北京', '上海', '广州', '深圳', '杭州', '苏州', '长沙',

'武汉', '天津', '成都', '西安', '东莞', '合肥', '佛山',

'宁波', '南京', '重庆', '长春', '郑州', '常州', '福州',

'沈阳', '济南', '宁波', '厦门', '贵州', '珠海', '青岛',

'中山', '大连','昆山',"惠州","哈尔滨","昆明","南昌","无锡"]

address_list = np.array(address_list)

defrename(x=None,address_list=address_list):

index = [ i inx fori inaddress_list] #判断x是否在list中

#print("******",index)

ifsum(index) > 0:

returnaddress_list[index][0]

else:

returnx

df["工作地点"] = df["工作地点"].apply(rename)

#4、学历

df['学历要求'] = df['学历要求'].apply(lambdax : re.findall(r"(本科|大专|应届生|在校生|硕士)",x))

#5、经验

df['经验要求']=df['经验要求'].apply(lambdax : re.search(r"[1-9]",x))

print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')

fori inrange(len(df)):

ifdf["经验要求"][i] is None:

df["经验要求"][i]= df.fillna(0)

else:

df["经验要求"][i] = df["经验要求"][i].group()

# 6、所属行业

# df["所属行业"].value_counts()

df["所属行业"] = df["所属行业"].apply(lambdax:re.sub(",","/",x))

df["所属行业"] = df["所属行业"].str[2:-2].str.split("/").str[0]

#7、规模

deffunc(x):

ifx == "['少于50人']":

return "<50"

elifx == "['50-150人']":

return "50-150"

elifx == "['150-500人']":

return '150-500'

elifx == "['500-1000人']":

return '500-1000'

elifx == "['1000-5000人']":

return '1000-5000'

elifx == "['5000-10000人']":

return '5000-10000'

elifx == "['10000人以上']":

return ">10000"

else:

returnnp.nan

df["公司规模"] = df["公司规模"].apply(func)

print(df.iloc[:20,7:9])

#构建新的数据表

feature = ["岗位名称","公司名称","工作地点","工资水平",

"学历要求","经验要求","公司类型","公司规模","所属行业"]

new_df = df[feature]

new_df.to_excel(r'D:\数据分析\数据\51job.xlsx',encoding="gbk",index=None)

用tableau分析得到的数据表,由于使用的功能较为基础,直接感受是tableau是升级版的数据透视图,比matplotlib方便,还可以建立仪表盘和故事,可以动态展示图表以及分析思路。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值