当前位置:   article > 正文

【ML项目】基于网络爬虫和数据挖掘算法的web招聘数据分析(一)——数据获取与处理_数据挖掘比赛的数据集 求职推荐数据集

数据挖掘比赛的数据集 求职推荐数据集

前言

这个项目是在学校做的,主要是想对各大招聘网站的招聘数据进行分析,没准能从中发现什么,这个项目周期有些长,以至于在项目快要结束时发现网上已经有了一些相关的项目,我后续会把相关的项目材料放在我的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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

后来发现对于个别网页,这样跑会挂掉,有的匹配不成功就会出问题,于是将代码做了修改:

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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上面的代码实现了对出现问题的匹配进行异常捕获,出现异常的匹配直接在文本中写入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)
        '''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

网页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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/1010375
推荐阅读
相关标签
  

闽ICP备14008679号