副标题[/!--empirenews.page--]
脉脉是一个实名职场社交平台。之前爬了脉脉职言版块,大概爬了4027条评论,本文对爬取过程给出详细说明,对于评论内容仅做可视化分析,之前存了一堆这方面的文章,今天一看全都404了”。
爬虫
仍然使用python编程,对爬虫没兴趣的可以直接跳过看下部分,不影响悦读。
网址https://maimai.cn/gossip_list。
需要先登录才能看到里面的内容。爬取目标:
只爬文字部分,图片不考虑。
在浏览器内按F12打开开发者,向下滑,会看到很多gossip开头的json文件(不行的话刷新一下)
右键open in new tab,里面是一条一条记录,text后面是评论内容。
我们感兴趣的信息是下面这些
看一看每个网站的地址,都是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的最开头有total和remain两个参数,给出了目前所有可见评论剩余数和总数,可以作为循环的停止条件。
但比较坑的一点是,脉脉并不能可见所有评论,而且评论是不断刷新的,所有如果爬完一页循环到下一页或者尝试过很多次之后,他会提示你:
直接看的时候有这样的提示会体验很好,但对于爬虫来说就不是很友好了,,需要加个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)
数据可视化
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|