爬取前程无忧北上广深各国际学校招聘信息,统计一线城市国际学校员工(老师,非老师)薪酬水平。可用数据实际不够准确,数量很少,这里只是提供一套demo进行一遍操作。原始数据如下:
这里不想过多说怎么具体爬取页面,网上有很多类似例子并不难,最后页我也附录了爬虫代码。主要讲一下爬取这类招聘网站所遇到的难点。
# 交大可匹配:交大剑桥或者交大国际
d_guangzhou = {
'英国': '学校', '华南师范': '国际',
'交大': '剑桥|国际', '第二外国语': '国际'
}
for key, value in d_shenzhen.items():
regexp_key = re.compile(r'{}'.format(key)) # 匹配第一个词
regexp_value = re.compile(r'{}'.format(value)) # 匹配第二个词
if regexp_key.search(company) and regexp_value.search(company): # 如果两个字同时存在于所检索的company中
# Extact the data
# 创建新的dataframe"薪水_万每月"
job["薪水_万每月"] = ''
for i in range(len(job["薪水"])):
str = job["薪水"][i]
# 匹配类型有 :1.5—2万/月,6-8千/月,15-20万/年,120元/天
regex = re.match('(((.+)-(.+))|(.+))([万千元])/([月天年])', str)
if regex.group(7) == "月":
if regex.group(6) == "万":
m = [float(regex.group(3))*10000,float(regex.group(4))*10000]
num = stats.mean(m)
job["薪水_万每月"][i] = num
elif regex.group(6) == "千":
m = [float(regex.group(3))*1000,float(regex.group(4))*1000]
num = stats.mean(m)
job["薪水_万每月"][i] = num
elif regex.group(7) == "年":
y = [float(regex.group(3)),float(regex.group(4))]
num = stats.mean(y) / 12 * 10000
job["薪水_万每月"][i] = num
else:
num = float(regex.group(1)) * 20
job["薪水_万每月"][i] = num
# -------------------------------- 部分代码转载于网络 -----------------------------------------
def get_html():
k=1 #参数k代表存储到excel的行数
wb = xlwt.Workbook() # 创建工作簿
f = wb.add_sheet("招聘信息") # 创建工作表
'''
下方的循环是将Excel表格中第一行固定
Excel表第一行的前五列分别对应 职位、公司、工作地点、薪水、发布日期
'''
raw = ['职位', '公司', '工作地点', '薪水', '发布日期']
for i in range(len(raw)):
f.write(0, i, raw[i])
'''
write函数中第一个参数表示存储到多少行
第二各参数存储到多少列表,第三个参数代表存储到对应行列的值
'''
url='https://search.51job.com/list/040000,000000,0000,23,9,99,%2520,2,{}.html'
try:
for page in range(300): #解析前11页
res = requests.get(url.format(page))
res.encoding = 'gbk'
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
t1 = soup.select('.t1 span a')
t2 = soup.select('.t2 a')
t3 = soup.select('.t3')
t4 = soup.select('.t4')
t5 = soup.select('.t5')
for i in range(len(t2)):
job = t1[i].get('title')#获取职位
href = t2[i].get('href')#获取链接
company = t2[i].get('title')#获取公司名
location = t3[i+1].text#获取工作地点
salary = t4[i+1].text#获取薪水
date = t5[i+1].text#获取发布日期
for key, value in d_shenzhen.items():
regexp_key = re.compile(r'{}'.format(key))
regexp_value = re.compile(r'{}'.format(value))
if regexp_key.search(company) and regexp_value.search(company):
print(job + " " + company + " " + location + " " + salary + " " + date + " " + href)
f.write(k,0,job)
f.write(k,1,company)
f.write(k,2,location)
f.write(k,3,salary)
f.write(k,4,date)
k+=1
else:
continue
print(f"Page : {page}")
wb.save('招聘_深圳_分割.csv')
except TimeoutError:
print("请求失败")
return None
if __name__=='__main__':
get_html()
大多数情况的爬虫其实所爬网站已经可以设定好关键字,但是有些情况下并不能完成我们所需的任务。正则表达是一个很好应用与此的技术,特别是在特定词句匹配方面。值得好好钻研。不足之处是字典的建立和关键词的决定需要人类来判断,希望有更好的匹配办法可以应用在类似这样的爬虫案例上。