专栏首页机器学习和数学[编程经验] 拉勾网爬虫数据的后续处理

[编程经验] 拉勾网爬虫数据的后续处理

上一篇我们介绍了如何爬拉勾的数据,这次介绍一下如何分析爬下来的数据,本文以自然语言处理这个岗位为例。

上次那个爬虫的代码有一点问题,不知道大家发现没有,反正也没有人给我说。。然后后面我把我最后改好的代码附在本文的最后。

本文主要分析的是岗位职责和岗位要求,基本思路是先分词,然后统计词频,最后最词云展示出来。先看下效果

从这个图可以看出来,自然语言处理大多数需要掌握深度学习,需要用深度学习去解决问题,然后是工作经验,项目经验,以及对算法的理解。

首先分词,要正确分词,需要有一份高质量的词典,因为在岗位描述里面有好多专有名词,比如深度学习,命名实体识别,词性标注等等。我还是使用的jieba来做分词,结巴对这些词是分不出来的,所以先要建一个词典,我选了大概100个左右,然后加上公司的名字,一共400个左右。这个也可以分享给大家,非常欢迎大家补充,建立一份高质量的AI领域的专业词典,其实是非常有意义的事情,对这方面的文本分析非常有帮助。

对分词过程中标点符号的处理,有2种办法,一种是先去标点,然后分词,还有一种是先分词,然后去标点。常用的做法是先分词,然后把标点符号放在stopwords里面,这次我没有这么做,我是先按照可以划分句子、短语结构的标点符号,先把句子做切割,比如句号,一般以句号分割的两句话之间,肯定不会是一个词。最后对切割完毕的句子做分词,这样可以提高准确率,能防止分错不少词。分词的时候先把不能分割语义的标点符号先去掉,然后分词。

接下来,对上面切割好的词,统计词频,做一个词云,这里生成的词云可以做成那个样子,是因为我把本文开头的那个图片,作为背景图片,用wordcloud生成的词云就会是那个样子的。

好,直接看代码:

import os
import pandas as pd
import re
import jieba
import matplotlib.pyplot as plt
import wordcloud
from collections import OrderedDict
from tqdm import tqdm

from scipy.misc import imread
sw = []
jieba.load_userdict("./dictionary/ai_dict.txt")


def linesplit_bysymbol(line):
    # 先按句子切割,然后去标点,
    line = line.replace("\n", "").replace("\r", '')
    out = []
    juzi = r"[\]\[\,\!\】\【\:\,\。\?\?\)\(\(\『\』\<\>\、\;\.\[\]\(\)\〔\〕\+\和\的\与\在]"
    p = r"[\^\$\]\/\.\’\~\#\¥\#\&\*\%\”\“\]\[\&\×\@\]\"]"

    salary_pattern = r'\d+\k\-\d+\k'
    salarys = re.compile(salary_pattern).findall(line)

    for salary in salarys:
        out.append(salary)
    linesplit = re.split(juzi, line)
    for x in linesplit:

        if str(x).isnumeric():
            continue
        if len(x) < 1:
            continue
        if x == '职位描述':
            continue
        if x == '岗位要求':
            continue
        if x == '岗位职责':
            continue
        if x == '工作职责':
            continue
        if x == '岗位说明':
            continue
        res = re.sub(p, "", x)
        rescut = jieba.lcut(res)
        for w in rescut:
            if str(w).isdigit():
                continue
            out.append(w)
    return " ".join(out)


def analysis(job):
    path = './datasets/lagou'
    res = []
    for file in tqdm(os.listdir(path)):
        if "{}".format(job) in file:
            file_name = os.path.join(path, file)
            data = pd.read_csv(file_name, usecols=['job_bt', 'company_name']).values
            for x in data:
                rows = OrderedDict()
                rows['company'] = x[0]
                rows['bt'] = linesplit_bysymbol(x[1])
                res.append(rows)
    df = pd.DataFrame(res)
    df.to_csv("./datasets/lagou/{}.csv".format(job), index=None)
    
analysis(job='ziran')

下面是做词云的代码:

import os
import pandas as pd
import re
import jieba
import matplotlib.pyplot as plt
import wordcloud
from collections import OrderedDict
from tqdm import tqdm


def plot_word_cloud(file_name, savename):
    text = open(file_name, 'r', encoding='utf-8').read()

    alice_coloring = imread("suanfa.jpg")
    wc = wordcloud.WordCloud(background_color="white", width=918, height=978,
                             max_font_size=50,
                             mask=alice_coloring,
                             random_state=1,
                             max_words=80,
                             mode='RGBA',
                             font_path='msyh.ttf')
    wc.generate(text)
    image_colors = wordcloud.ImageColorGenerator(alice_coloring)

    plt.axis("off")
    plt.figure()
    plt.imshow(wc.recolor(color_func=image_colors))
    plt.axis("off")
    plt.figure(dpi=600)
    plt.axis("off")
    wc.to_file(savename)



plot_word_cloud(file_name="./datasets/lagou/suanfagongchengshi.csv",
                     savename='suanfagongchengshi.png')

最后,附上上一篇文章,最终修改的代码,主要是增加了异常处理,异常处理在爬虫中真的很重要,不然中间挂了,就很尴尬,还有就是数据保存的间隔,没爬5页就保存一次,防止爬虫中断,前功尽弃。

import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import requests
from collections import OrderedDict
from tqdm import tqdm, trange
import urllib.request
from urllib import error
import logging


logging.basicConfig(level=logging.WARNING)


def isurl(url):
    if requests.get(url).status_code == 200:
        return True
    else:
        return False


def urlhelper(url):
    try:
        req = urllib.request.Request(url)
        req.add_header("User-Agent",
                       "Mozilla/5.0 (Windows NT 6.1; WOW64)"
                       " AppleWebKit/537.36 (KHTML, like Gecko) "
                       "Chrome/45.0.2454.101 Safari/537.36")
        req.add_header("Accept", "*/*")
        req.add_header("Accept-Language", "zh-CN,zh;q=0.8")
        data = urllib.request.urlopen(req)
        html = data.read().decode('utf-8')

        return html
    except error.URLError as e:
        logging.warning("{}".format(e))


names = ['ziranyuyanchuli', 'jiqixuexi', 'shenduxuexi', 'rengongzhineng',
         'shujuwajue', 'suanfagongchengshi', 'jiqishijue', 'yuyinshibie',
         'tuxiangchuli']
fw = open("./datasets/lagou/job.txt", 'a+')
for name in tqdm(names):
    savedata = []
    page_number = 0
    for page in range(1, 31):

        rooturl = 'https://www.lagou.com/zhaopin/{}/{}/'.format(name, page)
        if not isurl(rooturl):
            continue
        html = urlhelper(rooturl)
        soup = BeautifulSoup(html, "lxml")
        resp = soup.findAll('div', attrs={'class': 's_position_list'})
        if len(resp) == 1:
            resp = resp[0]
            resp = resp.findAll('li', attrs={'class': 'con_list_item default_list'})
            page_number += 1
            if page_number % 5 == 0:
                print(page_number)
                # 保存到本地
                df = pd.DataFrame(savedata)
                df.to_csv("./datasets/lagou/{}_{}.csv".format(name, page_number), index=None)
                savedata = []
            for i in trange(len(resp)):
                position_link = resp[i].findAll('a', attrs={'class': 'position_link'})
                link = position_link[0]['href']
                if isurl(link):
                    htmlnext = urlhelper(link)
                    soup = BeautifulSoup(htmlnext, "lxml")
                    try:
                        # 职位描述
                        job_bt = soup.findAll('dd',
                                              attrs={'class': 'job_bt'})[0].text
                    except:
                        continue
                    try:
                        # 工作名称
                        jobname = position_link[0].find('h3').get_text()
                    except:
                        continue
                    try:
                        # 工作基本要求
                        p_bot = resp[i].findAll('div',
                                                attrs={'class': 'p_bot'})[0].text
                    except:
                        continue
                    try:
                        # 月薪
                        money = resp[i].findAll('span',
                                                attrs={'class': 'money'})[0].text
                    except:
                        continue
                    try:
                        # 行业
                        industry = resp[i].findAll('div',
                                                   attrs={'class': 'industry'})[0].text
                    except:
                        continue
                    try:
                        # 公司名字
                        company_name = resp[i].findAll(
                            'div', attrs={'class': 'company_name'})[0].text
                    except:
                        continue
                    rows = OrderedDict()
                    rows["jobname"] = jobname.replace(" ", "")
                    rows["money"] = money
                    rows["company_name"] = company_name.replace("\n", "")
                    rows["p_bot"] = p_bot.strip().replace(" ", ""). \
                        replace("\n", ",").replace("/", ",")
                    rows["industry"] = industry.strip(). \
                        replace("\t", "").replace("\n", "")
                    rows["job_bt"] = job_bt
                    savedata.append(rows)

最后还有一份词典,需要的伙伴也可以后台回复,

我要补充AI词典

获取txt文件,如果有补充的伙伴可以直接后台私信,非常感谢!

自然语言处理
NLP
命名实体识别
词性标注
语义分析
情感分析
文本摘要
主题发现
文本相似度
中文分词
语义识别
自动聚类
文本挖掘
机器学习
数据计算平台
数据
业务
java
数学
正则
中英文分词
词性标注
实体识别
句法分析
自动文本分类
关键值提取
相似度计算
本体理论
语义推理
人机对话
人工智能
对话系统
语音交互
意图解析
对话生成
知识图谱
软件设计
开发编程
信息抽取
分类
聚类
情感分析
关联规则挖掘
协同过滤
数据挖掘
机器学习
python
c++
数据结构
算法
系统设计
编程能力
计算机科学
数学
统计
提取标签化信息
推荐系统
shell
awk
python
perl
意图分类
自动对话
语义挖掘
计算机视觉
语音识别
文本分类
主题模型
特征抽取
智能问答
语义理解
意图识别
知识问答
多轮对话
智能聊天
CRF
pLSALDA
LSTM
Attention
word2vec
cnn
rnn
linux
n-gram
NNLM
Tensorflow
Theano
Pytorch
keras
智能客服
问答系统
新词发现
汽车之家
舆情分析
意图识别
Apache
Hadoop
Spark
Storm
MxNet
Deep Learning
Scala
PHP泛微
美团点评
知网
Gridsum 国双
中邮消费
秒针系统
笨鸟社交
蓦然认知科技
海知智能
一下科技
懂球帝
云孚科技
搜狗
逸途科技
数美
泛微
通达海
roobo
考拉阅读
金山办公软件
搜狗
清帆科技
美团点评
印孚瑟斯
360
游族网络
Gridsum 国双
CTR
飞常准
粉笔网
泛微
搜狗
Gridsum 国双
逸途科技
慧影医疗
ZingFront智线
麦达数字
阿博茨科技
追一科技
泰迪智慧
百度
联想集团
所问数据
瓜子二手车直卖网
金山办公软件
泛微
逸途科技
上海你我贷互联网金融信息服务
多牛传媒
丝路天地
爱云校
一览科技
世纪超星
鸟瞰智能
roobo
图灵机器人
明略数据
安易信
Bello
搜狗
泛微
金山办公软件
阿博茨科技
美团点评
ZingFront智线
经传多赢
Gridsum 国双
VINCI
触宝
搜狗
知网
普强信息
联想集团
搜狐集团
ZingFront智线
触宝
一起作业网
同盾科技
新浪网
源杉FIR.ai
京东商城
海知智能
滴滴出行
网龙网络有限公司
Moka
好未来
上海你我贷互联网金融信息服务
猎户星空
美团点评
ZingFront智线
触宝
阿里云
转转
亿咖通科技
沪江
新浪网
乐言科技
一览科技
金山办公软件
恒生电子
普强信息
智课网
美团点评
达闼科技
世纪超星
阿博茨科技
InnoTREE
江村市隐
达观数据
学霸君
Eyespage
竹间智能科技(上海)有限公司
金山办公软件
深睿医疗
Rokid
平安科技
平安科技
图灵机器人
东方国信
腾讯
卖座网
映客直播
阿博茨科技
英语流利说
广电运通
明略数据
美洽
美团点评
大河网
Bello
InnoTREE
卖座网
东方国信
美团点评
狗尾草智能科技
马上金融
多牛传媒
掌门集团
喜马拉雅
拼多多
任你说
罗辑思维
融慧金科
集微科技
粉笔网
英威诺
爱奇艺
陌陌
出门问问
爱智慧科技
扇贝
考拉阅读
科达
减约
小红书
Datatist
创极地
智课网
上海黔易
暴风集团
小米
Datatist
英语流利说
沪江
好未来
康夫子
国信安石
美团点评
Remark Holdings
喜马拉雅
亲宝宝
捷通华声
2345.com
滴滴出行
FutureData
美团点评
大特保
小红书
鼎阅
新浪网
有米科技
助理来也
印孚瑟斯
海乂知
金蝶
有鱼智能科技
FellowPlus
颐圣智能
阿里巴巴集团-中台
饿了么
上海黔易
名片全能王
掌阅
云知声
猎户星空
小鹏汽车
星环科技
多牛传媒
小红书
爱咔咔
智慧芽
拼多多
易车公司
考拉阅读
爱云校
慧闻科技
八爪鱼
物灵
热巢
灵智优诺
新浪网
51信用卡管家
脑洞科技
泰迪智慧
鼎复
易车公司
美团点评
商汤科技
AKULAKU
橙鹰
物灵
遥望网络
新浪微博
汤臣倍健
四达时代集团
爱奇艺
中译语通
主要是IT通讯及互联网行业业务
深思考人工智能机器人
滴滴出行
商汤科技
马上金融
焦点科技
腾讯无线大连研发中心
新国都
马上金融
爱奇艺
顺网科技
iPIN.com
新浪微博
京东金融
久其软件
PartnerUnite
蚂蚁金服集团
阿里巴巴IoT事业部
减约
51信用卡管家
大麦电商
网易
Airfot.
达观数据
猎户星空
滴滴出行
时度检测
汽车之家
美团点评
平安科技
亿咖通科技
物灵
腾讯
思迪股份
阿博茨科技
妙点网络
蚂蚁短租
顺网科技
京东
融畅软件
乐视
小米
名片全能王
新译
新浪网
鹏元数据技术
北京智慧正安科技有限公司
朗牧泽
网易
万城一圈
百分点
阿里巴巴集团-中台
蚂蚁短租
小米
2345.com
知乎
京东
菁优网
Kika Tech(新美互通)
达观数据
图灵机器人
杭州数睿科技
百度
北京语知科技有限公司
牧笛机器人
商理事
腾讯
360
Udesk-企业级智能客服平台
泛微
东方国信
Udesk-企业级智能客服平台
360
泛微
数美
爱奇艺
美团点评
广州棒谷科技股份有限公司
新浪网
宜信
海知智能
VINCI
任你说
大洋
爱智慧科技
誉存科技
泛微
Udesk-企业级智能客服平台
数美
宜信
誉存科技
知道创宇
杭州明霖
InnoTREE
美柚
新浪微博
百分点
美团点评
NaturLing教育科技
一览科技
达闼科技
泛微
宜信
诚壹财富
达闼科技
roobo
朗播网
蚂蚁金服集团
联想集团
阿博茨科技
猎户星空
美团点评
Gridsum 国双
汽车之家
一览科技
多牛传媒
职位描述
岗位要求
岗位职责
工作职责
岗位说明

本文分享自微信公众号 - 机器学习和数学(ML_And_Maths),作者:Alvin_2580

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [编程经验] 利用TensorFlow和argparse模块解析命令行参数

    今天的内容主要包括如何用TensorFlow解析命令行参数和利用Python自带的argparse模块解析命令行参数。我会分别写一个例子,通过这个例子彻底学会如...

    用户1622570
  • Newton迭代法

    今天和大家分享一下,之前抽空写的一篇论文,主要内容就是Newton迭代法,属于数学里面比较基础的,原理也不难,主要通过Newton迭代法可以体会到迭代的思想,以...

    用户1622570
  • [深度学习] 我理解的循环神经网络RNN

    本来今天在写毕业论文,就不打算更新了,但是写毕业论文挺痛苦的,因为我发现毕业论文的文字不能像公众号这样比较随意,随意的文字不是说不严谨,而是为了便于大家理解,这...

    用户1622570
  • Feign统一设置header

    Feign可以通过实现接口feign.RequestInterceptor,完成对feign.RequestTemplate的修改,比如添加header

    十毛
  • SpringMVC当中请给出一个下载的例子,文件名必需是中文

    4.文件下载 例4.1: <%@ page contentType="text/html; charset=GBK" %> <html> <body > <A ...

    马克java社区
  • 请给出一个SpringMVC文件上传的SmartUpload版例子

    3.文件上传 例3.1: <%@ page contentType="text/html; charset=GBK" %> <html> <body> <h1>...

    马克java社区
  • SpringBoot 中使用自定义的 Servlet, Filter, Listener

    1. 使用 @ServletComponentScan 定义要扫描的包目录, Servlet, Filter, Listener 可以通过 @WebServle...

    北漂的我
  • OC代码规范2——在类的头文件中尽量少引入其他头文件

    前面我提到过,凡是前面带有#符号的,都是编译预处理指令,也就是在编译阶段就执行的语句。

    拉维
  • Spring Boot 之 Spring Data JPA 三(Specifications)一、首先建立一个Spring Boot 工程二、编写一个实体类来记录数据三、通过接口实现Specifica

    孙亖
  • SpringBoot2.x配置Shiro实现权限管理,根据URL鉴权

    之前使用 Shiro 鉴权的时候,一直用的是注解,如 @RequiresPermissions() 和 @RequiresRoles(),这种方法不利于维护和动...

    奋斗蒙

扫码关注云+社区

领取腾讯云代金券