用Python教你如何爬取脉脉职言

脉脉是一个实名职场社交平台。以前爬了脉脉职言版块,大概爬了4027条评论,本文对爬取过程给出详细说明,对于评论内容仅作可视化分析,以前存了一堆这方面的文章,今天一看全都404了​。html

 

爬虫python

 

仍然使用python编程,对爬虫没兴趣的能够直接跳过看下部分,不影响悦读。程序员

 

网址https://maimai.cn/gossip_listweb

须要先登陆才能看到里面的内容。爬取目标:编程

只爬文字部分,图片不考虑。json

 

在浏览器内按F12打开开发者,向下滑,会看到不少gossip开头的json文件(不行的话刷新一下)api

 

右键open in new tab,里面是一条一条记录,text后面是评论内容。浏览器

咱们感兴趣的信息是下面这些cookie

 

欢迎加入个人QQ群`923414804`与我一块儿学习,群里有我学习过程当中整理的大量学习资料。加群便可免费获取app

1. Python编程从入门到实践.pdf
2. Python编程快速上手——让繁琐工做自动化.pdf
3. Python高级编程.pdf
4. Python高性能编程.pdf
5. Python核心编程.第3版.pdf
6. Python极客项目编程.pdf
7. Python数据科学手册.pdf
8. 贝叶斯思惟:统计建模的PYTHON学习法.pdf
9. 笨办法学python+第二版.pdf
10.机器学习实战(扫描版).pdf
11.像计算机科学家同样思考Python.pdf
12.用Python进行天然语言处理.pdf

....

看一看每一个网站的地址,都是page=数字结尾,因此爬的时候写一个循环,数字从1开始日后取就能够了。

https://maimai.cn/sdk/web/gossip_list?u=206793936&channel=www&version=4.0.0&_csrf=coAlLvgS-UogpI75vEgHk4O1OQivF2ofLce4&access_token=1.9ff1c9df8547b2b2c62bf58b28e84b97&uid=%22MRlTFjf812rF62rOeDhC6vAirs3A3wL6ApgZu%2Fo1crA%3D%22&token=%22rE8q1xp6fZlxvwygWJn1UFDjrmMXDrSE2tc6uDKNIDZtRErng0FRwvduckWMwYzn8CKuzcDfAvoCmBm7%2BjVysA%3D%3D%22&page=1&jsononly=1

 

json的最开头有totalremain两个参数,给出了目前全部可见评论剩余数和总数,能够做为循环的中止条件。

但比较坑的一点是,脉脉并不能可见全部评论,并且评论是不断刷新的,全部若是爬完一页循环到下一页或者尝试过不少次以后,他会提示你:

直接看的时候有这样的提示会体验很好,但对于爬虫来讲就不是很友好了,须要加个if判断。

 

另外爬的太快,也会出错,记得加time.sleep

 

大概把能踩的坑都踩了,因此若是顺利的话,每次只能爬几百条信息,想爬更多的话,须要过一段时间等信息更新的差很少了再爬,代码以下

# -*- coding: utf-8 -*- """ Created on Fri Oct 19 18:50:03 2018 """ import urllib import requests from fake_useragent import UserAgent import json import pandas as pd import time import datetime #comment_api = 'https://maimai.cn/sdk/web/gossip_list?u=206793936&channel=www&version=4.0.0&_csrf=7ZRpwOSi-JHa7JrTECXLA8njznQZVbi7d4Uo&access_token=1.b7e3acc5ef86e51a78f3410f99aa642a&uid=%22MRlTFjf812rF62rOeDhC6vAirs3A3wL6ApgZu%2Fo1crA%3D%22&token=%22xoNo1TZ8k28e0JTNFqyxlxg%2BdL%2BY6jtoUjKZwE3ke2IZ919o%2FAUeOvcX2yA03CAx8CKuzcDfAvoCmBm7%2BjVysA%3D%3D%22&page={}&jsononly=1' # 发送get请求 comment_api = 'https://maimai.cn/sdk/web/gossip_list?u=206793936&channel=www&version=4.0.0&_csrf=FfHZIyBb-H4LEs35NcyhyoAvRM7OkMRB0Jpo&access_token=1.0d4c87c687410a15810ee6304e1cd53b&uid=%22MRlTFjf812rF62rOeDhC6vAirs3A3wL6ApgZu%2Fo1crA%3D%22&token=%22G7rGLEqmm1wY0HP4q%2BxpPFCDj%2BHqGJFm0mSa%2BxpqPg47egJdXL%2FriMlMlHuQj%2BgM8CKuzcDfAvoCmBm7%2BjVysA%3D%3D%22&page={}&jsononly=1' """ author:做者 text:评论 cmts :评论数 circles_views:被查看数 spread :转发数 likes :点赞数 time : 时间 """ headers = { "User-Agent": UserAgent(verify_ssl=False).random} j = 0 k = 0 response_comment = requests.get(comment_api.format(0),headers = headers) json_comment = response_comment.text json_comment = json.loads(json_comment) num = json_comment['total'] cols = ['author','text','cmts','likes','circles_views','spreads','time'] dataall = pd.DataFrame(index = range(num),columns = cols) remain = json_comment['remain'] print(remain) while remain!= 0 :    n = json_comment['count']    for i in range(n):        if json_comment['data'][i]['text'] !='下面内容已经看过了,点此刷新':            dataall.loc[j,'author'] = json_comment['data'][i]['author']            dataall.loc[j,'text'] = json_comment['data'][i]['text']            dataall.loc[j,'cmts'] = json_comment['data'][i]['cmts']            dataall.loc[j,'likes'] = json_comment['data'][i]['likes']            dataall.loc[j,'circles_views'] = json_comment['data'][i]['circles_views']            dataall.loc[j,'spreads'] = json_comment['data'][i]['spreads']            dataall.loc[j,'time'] = json_comment['data'][i]['time']            j+= 1                     else:            k = -1                break                                 k+= 1    comment_api1 = comment_api.format(k)        response_comment = requests.get(comment_api1,headers = headers)    json_comment = response_comment.text    json_comment = json.loads(json_comment)    remain = json_comment['remain']    print('已完成 {}% !'.format(round(j/num*100,2)))    time.sleep(3)           dataall = dataall.dropna() dataall = dataall.drop_duplicates() dataall.to_csv('data_20181216_part3.csv',index = False)

 

 

数据可视化

 

就这样断断续续爬了一堆文件去重以后,获得了4027条数据,格式以下

 

接下来对爬到的数据作一些简单的分析。由于并不没有爬到全量评论,只是一个小样本,因此结果确定是有偏的,但爬的时间很随机,并且前先后后爬了两周多,这样选样也比较随机,仍是有必定的表明性。

 

脉脉中发言用户有两类,一类是彻底匿名的,用系统生成的昵称,一类显示为xx公司员工,咱们统计爬到的样本中这两种用户的数量及发帖量。4027条职言中,不一样发帖人共计1100名。

匿名发帖人超过70%,你们都并不肯意用真实身份发言,毕竟被公司/学校人肉风险仍是很高的。

 

发帖数也毫无心外,匿名发帖人贡献了85%以上的帖子。

 

匿名发帖人没法获取更细致的数据,但对于那些不匿名的发帖人,能够获取他们所在公司 信息,将发帖数按公司汇总,看各大企业发帖量,能够做为总体的一个估计。统计时已经考虑了公司名称输入不一致的状况,将蚂蚁金服、支付宝等替换成了阿里巴巴,京东金融等替换成京东,今日头条、抖音等替换为字节跳动,取发帖数TOP20。

能够看到,发帖人大多来自互联网企业,金融、地产等其余企业相对较少。

 

文本分析

 

对于转发、评论数、点赞数,由于有爬取时间上的差别,因此很差直接比较,给出评论数最多的前5条评论,看看你们最愿意参与的话题是什么。

1. 用一个字归纳一下你的2018年。(1659条评论)

2. 【再就业求助帖】本人是刚被优化掉的知乎程序员,工做3年。比较想去BAT等大厂,但愿贵厂HR们带公司认证来回复一下,发一发真实有hc的岗位,祝愿兄弟们都能找到新工做。(610条评论)

3. 用两个字归纳你如今的工做。(477条评论)

4. 网易涨今年薪涨了50%.....公司是发财了吗?(458条评论)

5. 用2个字总结你的工做。(415条评论)

 

1,4,5都是蛮有意思的问题,咱们把1,4,5的评论都爬下来,作成词云,看看你们都在说些什么。

 

用一个字归纳你的2018年

爬虫过程跟上面基本是同样的,找到json,不过这个能够爬到所有评论。

# -*- coding: utf-8 -*- """ Created on Fri Oct 19 18:50:03 2018 """ import urllib import requests from fake_useragent import UserAgent import json import pandas as pd import time # 发送get请求 comment_api = 'https://maimai.cn/sdk/web/gossip/getcmts?gid=18606987&page={}&count=50&hotcmts_limit_count=1&u=206793936&channel=www&version=4.0.0&_csrf=38244DlN-X0iNIk6A4seLXFx6hz3Ds6wfQ0Y&access_token=1.9ff1c9df8547b2b2c62bf58b28e84b97&uid=%22MRlTFjf812rF62rOeDhC6vAirs3A3wL6ApgZu%2Fo1crA%3D%22&token=%22rE8q1xp6fZlxvwygWJn1UFDjrmMXDrSE2tc6uDKNIDZtRErng0FRwvduckWMwYzn8CKuzcDfAvoCmBm7%2BjVysA%3D%3D%22' """ author:做者 text:评论 、 """ #headers = { "User-Agent": UserAgent(verify_ssl=False).random,'Cookie':cookie} headers = { "User-Agent": UserAgent(verify_ssl=False).random} j = 0 k = 0 response_comment = requests.get(comment_api.format(0),headers = headers) json_comment = response_comment.text json_comment = json.loads(json_comment) num = json_comment['total'] cols = ['author','text'] dataall = pd.DataFrame(index = range(num),columns = cols) while j < num :    n = json_comment['count']    for i in range(n):        dataall.loc[j,'author'] = json_comment['comments'][i]['name']        dataall.loc[j,'text'] = json_comment['comments'][i]['text']        j+= 1                 k += 1    comment_api1 = comment_api.format(k)         response_comment = requests.get(comment_api1,headers = headers)    json_comment = response_comment.text    json_comment = json.loads(json_comment)    print('已完成 {}% !'.format(round(j/num*100,2)))    time.sleep(3)              dataall.to_excel('用一个字归纳你的2018年.xlsx')

爬下来以后,删掉超过一个字的评论,按词频肯定大小,作词云图以下

用两个字归纳你如今的工做|用2个字总结你的工做

2,5是同样的,爬下来合并到一块儿后分析。代码再也不重复,实际上用上面那段代码,找到json地址后替换,任何一个话题下的评论均可以全爬到,删掉不是2个字的评论后根据词频做图。

使用SnowNLP对评论进行情感分析,最终4027条中,积极的有2196条,消极的有1831条。

积极

消极

模型对大部分评论的情感倾向判断的比较准确,小部分有误。

 

最后对全部评论提取关键词作词云收尾。

相关文章
相关标签/搜索