[编程经验] 拉勾网爬虫数据的后续处理
上一篇我们介绍了如何爬拉勾的数据,这次介绍一下如何分析爬下来的数据,本文以 自然语言处理 这个岗位为例。
上次那个爬虫的代码有一点问题,不知道大家发现没有,反正也没有人给我说。。然后后面我把我最后改好的代码附在本文的最后。
本文主要分析的是岗位职责和岗位要求,基本思路是先分词,然后统计词频,最后最词云展示出来。先看下效果
从这个图可以看出来,自然语言处理大多数需要掌握深度学习,需要用深度学习去解决问题,然后是工作经验,项目经验,以及对算法的理解。
首先分词,要正确分词,需要有一份高质量的词典,因为在岗位描述里面有好多专有名词,比如深度学习,命名实体识别,词性标注等等。我还是使用的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):
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")
# 职位描述
job_bt = soup.findAll('dd',
attrs={'class': 'job_bt'})[0].text
except:
continue
# 工作名称
jobname = position_link[0].find('h3').get_text()
except:
continue
# 工作基本要求
p_bot = resp[i].findAll('div',
attrs={'class': 'p_bot'})[0].text
except:
continue
money = resp[i].findAll('span',
attrs={'class': 'money'})[0].text
except:
continue
industry = resp[i].findAll('div',
attrs={'class': 'industry'})[0].text
except:
continue
# 公司名字
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文件,如果有补充的伙伴可以直接后台私信,非常感谢!
自然语言处理
命名实体识别
文本相似度
数据计算平台
中英文分词
自动文本分类
关键值提取
相似度计算
关联规则挖掘
python
计算机科学
提取标签化信息
shell
python
计算机视觉
pLSALDA
Attention
word2vec
linux
n-gram
Tensorflow
Theano
Pytorch
keras
Apache
Hadoop
Spark
Storm
MxNet
Deep Learning
Scala
PHP泛微
Gridsum 国双
蓦然认知科技
roobo
金山办公软件
Gridsum 国双
Gridsum 国双
ZingFront智线
阿博茨科技
瓜子二手车直卖网
金山办公软件
上海你我贷互联网金融信息服务
roobo
图灵机器人
Bello
金山办公软件
阿博茨科技
ZingFront智线
Gridsum 国双
VINCI
ZingFront智线
一起作业网
源杉FIR.ai
网龙网络有限公司
上海你我贷互联网金融信息服务
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(新美互通)
图灵机器人
杭州数睿科技
北京语知科技有限公司
牧笛机器人
Udesk-企业级智能客服平台
Udesk-企业级智能客服平台
广州棒谷科技股份有限公司
VINCI
爱智慧科技
Udesk-企业级智能客服平台
InnoTREE
NaturLing教育科技
roobo
蚂蚁金服集团
阿博茨科技
Gridsum 国双