前言:
8个小时内完成爬虫,数据清洗并可视化。因为自己也是小白,做的时候时间还挺赶的。很多地方没有做到完美,比如一些数据清洗的步骤走了捷径。有不足的地方,欢迎大神们留言指教。
selenium :3.141.0
pyecharts:1.9.0
1.Selenium爬取信息
我个人是喜欢用selenium做爬虫的,可以享受web自动化的这个过程。因为要爬取的东西不是很多,如果要爬取很多内容的同学,还是老老实实用request的吧。
此次爬取的是51job前程无忧,这里的url可以替换成你想查询的该网站的任何职业或者岗位。
爬取几个我们需要的重要信息,包括:职位名称,发布日期,工资,学历要求,经验要求,工作地点等等等。
网速快的同学记得把睡眠时间调短一些,不然真的会爬很久。我自己大概爬了7.8分钟吧
from selenium import webdriver
import pandas as pd
import time
wd = webdriver.Chrome()
wd.get('https://search.51job.com/list/000000,000000,0000,00,9,99,%25E5%25BB%25BA%25E7%25AD%2591%25E8%25AE%25BE%25E8%25AE%25A1,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=')
wd.implicitly_wait(10)
max_pages = 100
titles = []
times = []
wages = []
infos = []
company_names = []
company_infos = []
company_atrri = []
def get_data(titles,times,wages,infos,company_names,company_infos,company_atrri):
#获取职位名称
title0 = wd.find_elements_by_css_selector('.jname.at')
for each_title in title0:
titles.append(each_title.text)
#获取发布时间
time0 = wd.find_elements_by_css_selector('.time')
for each_time in time0:
times.append(each_time.text)
#获取工资信息
wage0 = wd.find_elements_by_css_selector('.sal')
for each_wage in wage0:
wages.append(each_wage.text)
#获取更多职位信息
info0 = wd.find_elements_by_css_selector('.d.at')
for each_info in info0:
infos.append(each_info.text)
#获取公司信息
company_name0 = wd.find_elements_by_css_selector('.cname.at')
for each_c_name in company_name0:
company_names.append(each_c_name.text)
#获取更多公司信息
company_info0 = wd.find_elements_by_css_selector('.dc.at')
for each_c_info in company_info0:
company_infos.append(each_c_info.text)
#获取公司性质
company_atrri0 = wd.find_elements_by_css_selector('.int.at')
for each_c_attr in company_atrri0:
company_atrri.append(each_c_attr.text)
for i in range(max_pages):
print(f'正在爬取第{i}页')
get_data(titles,times,wages,infos,company_names,company_infos,company_atrri)
wd.find_element_by_css_selector('.next').click()
time.sleep(5) # 网速快的同学,请在这里操作,过快的操作可能会被检验出IP异常
data = {
'岗位名称': titles,
'发布时间':times,
'薪酬':wages,
'更多职位信息':infos,
'公司名称':company_names,
'公司更多信息':company_infos,
'公司性质':company_atrri
}
df = pd.DataFrame(data)
df.to_csv('建筑岗位信息.csv')
wd.quit()
最后将爬取的5000条信息转存为CSV格式。
下面是部分结果展示:
2 . Pandas清洗数据
这里清洗数据的工作是比较乱的,因为对我来说时间太紧了。下次会发一个另外的爬虫悉尼房价的代码,想对来说清洗很多。
清洗数据的几个主要目的:
- 工资的单位是不统一的,有些是年,有些是月;有些是万,有些是千。(可以从上图中看到)。为此得统一单位。
- 工资是一个范围,这个范围不利于我们后续的可视化和分析。我这是用的split,用正则表达式也是可以的,把上限和下限取出来求一个平均值。
- 需要把经验要求,上班地点和学历要求提出来作为一个单独的特征进行分析。
- 嗷对!还有一个很重要的点,一共爬取了5000条信息,但其中只有2500条是建筑设计师,所以同学们在自己做其他岗