#!/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方便,还可以建立仪表盘和故事,可以动态展示图表以及分析思路。