前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[编程经验] 拉勾网爬虫数据的后续处理

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

作者头像
用户1622570
发布2018-04-11 16:14:05
发布2018-04-11 16:14:05
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

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

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

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

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

好,直接看代码:

代码语言:javascript
代码运行次数:0
运行
复制
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')

下面是做词云的代码:

代码语言:javascript
代码运行次数:0
运行
复制
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页就保存一次,防止爬虫中断,前功尽弃。

代码语言:javascript
代码运行次数:0
运行
复制
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文件,如果有补充的伙伴可以直接后台私信,非常感谢!

代码语言:javascript
代码运行次数:0
运行
复制
自然语言处理
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 国双
汽车之家
一览科技
多牛传媒
职位描述
岗位要求
岗位职责
工作职责
岗位说明
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习和数学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档