赞
踩
这个项目是在学校做的,主要是想对各大招聘网站的招聘数据进行分析,没准能从中发现什么,这个项目周期有些长,以至于在项目快要结束时发现网上已经有了一些相关的项目,我后续会把相关的项目材料放在我的GitHub上面,链接为:https://github.com/roguesir ,项目主要分为以下几项:数据获取与处理、探索性数据分析、数据挖掘算法建模等,这篇blog先介绍数据获取与处理。
Mac OS系统,python3.6
各个招聘网站的结构不同,进行正则匹配的方式也不同,本项目供爬取了前程无忧、智联招聘、拉勾网等多家招聘网站的web数据,以51job为例进行介绍:
前程无忧的招聘页面如下图所示,项目最终想要得到的数据包括岗位名称、工作地点、薪资待遇、岗位介绍、公司性质等信息,实际上需要两次爬取页面,第一次爬取搜索页面获得URL,第二次通过URL爬取相关信息。第一次使用Python的urllib和requests库实现,第二次使用Python的BeautifulSoup库实现。
起初的爬虫代码设置如下
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import sys
import importlib
importlib.reload(sys)
def get_html_page(lst,html):
res = requests.get(html)
res.encoding = 'gbk'
soup = BeautifulSoup(res.text, 'html.parser')
for job in soup.select('.tHjob'):
position = job.select('h1')[0]['title']
print(position)
lst.append(position)
location = job.select('.lname')[0].text
lst.append(location)
salary = job.select('strong')[0].text
lst.append(salary)
companyname = job.select('a')[0]['title']
if len(companyname) > 0:
lst.append(companyname)
property = job.select('.ltype')[0].text
lst.append(property)
for comp in soup.select('.tCompany_main'):
experience = comp.select('.sp4')[0].text
lst.append(experience)
education = comp.select('.sp4')[1].text
lst.append(education)
number = comp.select('.sp4')[2].text
lst.append(number)
introduce = comp.select('.tmsg')[0].text
lst.append(introduce)
return lst
def write_txt(content):
with open('raw-cs-info1.txt','a') as f:
for item in content:
f.write(item+'\n')
def main():
print('running main')
for url in open('web-mis-url1-1.txt'):
print(url)
lst = []
content = get_html_page(lst, url)
write_txt(content)
print('Finished!')
main()

后来发现对于个别网页,这样跑会挂掉,有的匹配不成功就会出问题,于是将代码做了修改:
try:
for job in soup.select('.tHjob'):
position = job.select('h1')[0]['title']
print(position)
if len(position)<1:
lst.append(discribe[0])
else:
lst.append('null')
except:
lst.append('null')
上面的代码实现了对出现问题的匹配进行异常捕获,出现异常的匹配直接在文本中写入null,而不会中断程序,对每个属性进行设置,最终只需要对文本中的null进行处理就OK了。
爬虫爬下来的数据基本上还算干净,只有个别的匹配出现失误,这可能由于网站html标签不规则导致,这个问题在爬取前程无忧时候出现了,在智联招聘等网站没有出现。
# coding=utf-8
import re
with open('new098.txt','a') as f:
for line in open('cs-job-discribe.txt'):
new_line = line.replace('<br>','')
new_line = re.sub(r'<.+>','',line)
new_line = re.sub(r'[0-9][0-9]\-[0-9][0-9].+','',new_line)
f.write(new_line)
'''
if len(new_line)==1:
new_line = re.sub(r'\s',',',new_line) # 将样本中的\空格\t\v\n\f等用','替换
f.write(new_line)
'''
网页html中本身带有的\空格\v\f\t\n等,写入文档会显示,因此需要进行预处理,把爬取下来的数据规范化。
由于项目是从不同的招聘网站上爬取数据,存在同一条招聘信息出现多次的情况,需要进行去重处理,另外,全部信息存储在cs-info.xlsx文件中,另将每个属性的数据存储在txt文件中,其中存在大量重复数据需要进行去重处理。
在此过程中出现的一些问题进行说明:
(1)编码问题:在设置了utf-8编码的情况下,爬取保存的数据仍然会出现乱码现象,需要设置html.decode=’gbk’才能解决。
(2)使用时也尝试了用requests和urllib库实现匹配提取,这个用在岗位描述信息匹配上比较好,代码如下:
import re
import requests
import urllib
res = requests.get(html)
res.encoding = 'gbk'
try:
a = urllib.urlopen(html)
html = a.read()
html = html.decode('gbk')
reg = re.compile(r'<div class="bmsg job_msg inbox.*?<br>(.*?)<div class="mt10">',re.S)
discribe = re.findall(reg,html)
print discribe[0]
# print(discribe)
lst.append(discribe[0])
except:
lst.append('null')

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。