目录html
咱们的竞争对手在看向哪里---对勺海公众号的挖掘与细分python
勺海是一家数据分析公司,现暂时观察到的有北京勺海和深圳勺海两家公司,其中深圳勺海并不从事与三桶油合做的相关项目,侧重点是软硬件,互联网方面. 北京勺海和我公司部分业务冲突,好比神秘顾客行业.咱们不得不重视这件事情. 经过细节了解对方公司动向,可以在迷茫中给人一点提示和建议.web
本项目着力于爬取勺海的微信公众号,根据推送时间,文章标题,文章内容,相关网站进行分析,最终提出相关建议.mongodb
代码:
python相关:
requests,selenium,xpath.chrome
数据库:
MongoDB:存储相关信息数据库
其余:
百度AI开放平台的api:用于文章分类.
echarts:展现数据.json
{ '_id':'ObjectId', 'title':'xxxx', 'content_url':'文章连接', 'cover':'封面', 'datetime':'xxx', }
# # # 勺海公众号目录 # # m_url = 'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MjM5MTY3MjIxNA==&scene=124' # 爬取微信公众号而且放到MongoDB里面 # 须要修改的参数 ''' uin key Cookie User-Agent ''' import requests import json import time from pymongo import MongoClient url = 'https://mp.weixin.qq.com/mp/profile_ext' # Mongo配置 conn = MongoClient('127.0.0.1', 27017) db = conn.wx #链接wx数据库,没有则自动建立 mongo_wx = db.article #使用article集合,没有则自动建立 def get_wx_article(index=0, count=10): offset = (index + 1) * count params = { 'action': 'getmsg', '__biz': 'MjM5MTY3MjIxNA==', 'f': 'json', 'offset': offset, 'count': 10, 'is_ok': 1, 'scene': '', 'uin': 777, 'key': 777, 'pass_ticket': '', 'wxtoken': '', 'appmsg_token': '1021_CJykttHiBi95yOiXF0ng2w0Mnol0sU1X8kAcHQ~~', 'x5': 0 } headers = { 'Cookie': 'RK=2cQY6O/pSU; ptcz=893bc880c1675d92ad3d1aefd62555c4c372d39b00dd9ddb18f0c8edeacdce2c; pgv_pvid=8386041760; gr_user_id=a69ffd00-b039-4d9d-a148-73e2de181c35; ' 'grwng_uid=b94c04db-fb58-4a48-8da3-cdf239fd9ff3; pgv_pvi=6928166912; tvfe_boss_uuid=6cabcbaf997804b3; o_cookie=810395333; pac_uid=1_810395333; ' 'eas_sid=w1b5d6X4H259O3T9b012W5U8e1; uin=o0810395333; ptisp=cnc; rewardsn=; wxtokenkey=777; ' 'skey=@vATOrb2kn; pgv_info=ssid=s1342811293; wxuin=1830578711; devicetype=Windows7; version=62060833; ' 'lang=zh_CN; pass_ticket=A1ooUCr21gSquzom9vu6btcgJbkuAtiIpwdBx/tZ/REG/Yi7JXT5+pAJya2pKXrJ; wap_sid2=CJfU8egGElw5aTlsTjVUT1JKQzZ1WDZVYVZOdUNsMEFvczlZbWpBSWVIU' 'F93RzBHRjRydXlmVFpXOFVKYXBVdFhGSXduSWdoWnRxZVROSFYySno1Mk01OFlMQUpUUDBEQUFBfjCP/MPqBTgNQAE=', 'Host': 'mp.weixin.qq.com', 'Referer': 'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MjM5MTY3MjIxNA==', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3719.400 QQBrowser/10.5.3715.400' } response = requests.get(url=url, params=params, headers=headers) resp_json = response.json() # print(resp_json) if resp_json.get('errmsg') == 'ok': resp_json = response.json() # 是否还有分页数据, 用于判断return的值 can_msg_continue = resp_json['can_msg_continue'] # 当前分页文章数 msg_count = resp_json['msg_count'] general_msg_list = json.loads(resp_json['general_msg_list']) list = general_msg_list.get('list') # print(list, "**************") for i in list: app_msg_ext_info = i['app_msg_ext_info'] # 标题 title = app_msg_ext_info['title'] # 摘要(有则执行,没则不要) digest = app_msg_ext_info['digest'] # 文章地址 content_url = app_msg_ext_info['content_url'] # 封面图 cover = app_msg_ext_info['cover'] # 发布时间 datetime = i['comm_msg_info']['datetime'] datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime)) mongo_wx.insert({ 'title': title, 'content_url': content_url, 'cover': cover, 'datetime': datetime }) if can_msg_continue == 1: return True return False else: print('获取文章异常...') return False if __name__ == '__main__': index = 0 while 1: print(f'开始抓取公众号第{index + 1} 页文章.') flag = get_wx_article(index=index) # 防止和谐,暂停8秒 time.sleep(8) index += 1 if not flag: print('公众号文章已所有抓取完毕,退出程序.') break print(f'..........准备抓取公众号第{index + 1} 页文章.')
# 调用百度AI进行文章分类 # import collections # 词频统计库 # import os # import time # # import numpy as np # numpy数据处理库 # import jieba # 结巴分词 # import requests # import wordcloud # 词云展现库 # from PIL import Image # 图像处理库 # import matplotlib.pyplot as plt # 图像展现库 # from lxml import etree from aip import AipNlp from pymongo import MongoClient """ 你的 APPID AK SK """ APP_ID = 'xxx' API_KEY = 'xxx' SECRET_KEY = 'xxx' client = AipNlp(APP_ID, API_KEY, SECRET_KEY) # Mongo配置 from selenium import webdriver conn = MongoClient('127.0.0.1', 27017) db = conn.wx # 链接wx数据库,没有则自动建立 mongo_article = db.article # 使用article集合,没有则自动建立 FILE_PATH = 'shaohai' params = { '__biz': 'MjM5MTY3MjIxNA==', 'amp;mid': '2657778963', 'amp;idx': '1', 'amp;sn': 'f2e5833c1ff036487f966aefa7453ed8', 'amp;chksm': 'bd2f2fea8a58a6fceec8ff03cf44901f560e3bf5d3012e4cb5bcf82ea91f78d0425c0f9195c1', 'amp;scene': '27' } get_data = mongo_article.find() title_ele_list = ['用户', '中国', '数据', '产品''研究', '体验', '消费者', '报告', '消费', '设计'] lst = [] dic = {} count = 0 for data in get_data: for title_ele in title_ele_list: if title_ele in data.get('title'): count += 1 if count % 25 == 0: lst.append(dic) print(dic) dic = {} son_url = data.get('content_url') # print(son_url) # 通过半天尝试,发现微信反爬机制很是顽强,彷佛是认证电脑的,总之,我由于no session没办法继续爬取文章了 title = data.get('title') content = title * 5 """ 调用文章分类 """ item = client.topic(title, content).get('item') if item: kinds = item['lv1_tag_list'][0].get('tag') if dic.get(kinds): dic[kinds] += 1 else: dic[kinds] = 1 break print(lst) # {'科技': 176, '社会': 46, '娱乐': 7, '时尚': 26, '健康养生': 14, '时事': 20, '文化': 5, '体育': 41, '家居': 33,'教育': 7 , '财经': 28, '汽车': 13, '历史': 12, '情感': 7, '军事': 7} # headers = { # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', # 'Accept-Encoding': 'gzip, deflate, br', # 'Accept-Language': 'zh-CN,zh;q=0.9', # 'Cache-Control': 'no-cache', # 'Connection': 'keep-alive', # 'Cookie': 'pgv_pvi=9564880896; RK=BdQY6O/pTW; ptcz=a81334855602b86ab4e3f674e6a21eb72fad39108bff3d025746b03038993e79; rewardsn=; wxtokenkey=777', # 'Host': 'mp.weixin.qq.com', # 'Pragma': 'no-cache', # 'Sec-Fetch-Mode': 'navigate', # 'Sec-Fetch-Site': 'none', # 'Sec-Fetch-User': '?1', # 'Upgrade-Insecure-Requests': '1', # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36' # } # text = requests.post(url=son_url, headers=headers, params=params).json() # print(text) # break # bro = webdriver.Chrome(executable_path='chromedriver.exe') # bro.get(son_url) # tree = etree.HTML(bro.page_source) # print(bro.page_source) # title = tree.xpath('//*[@id="activity-name"]/text()')[0].replace(' ','').strip('\n').replace('|',':') # print(title,str(title)) # file_path = os.path.join(FILE_PATH, title)+'.txt' # print(file_path) # 写名字的时候不要用管道符 # with open(file_path,'w',encoding='utf8') as f: # f.write(title+'\n') # digest = tree.xpath('//*[@id="js_content"]/section[4]/section/section/section[1]/section/section/p/text()') # if digest == []: # digest = tree.xpath('//*[@id="js_content"]/section/section[4]/section/section/section[1]/section/section/p/text()') # f.write(digest[0]) # section_list = tree.xpath('//*[@id="js_content"]/section[5]/section/section/section') # # for section in section_list: # content = section.xpath('.//span/text()') # if content: # for i in content: # print(i) # f.write(i) # # print(content) # # time.sleep(3) # bro.close() # # print(text) # break # 总共有500多篇 # http://mp.weixin.qq.com/s?__biz=MjM5MTY3MjIxNA==&mid=2657779153&idx=1&sn=f48669ede69430c941ce4654e9efe9b0&chksm=bd2f2f288a58a63e5694f795e8a2f57cf9f0d2e193c4d2866e4cc05c8db3673ab89e668feab2&scene=27#wechat_redirect # http://mp.weixin.qq.com/s?__biz=MjM5MTY3MjIxNA==&mid=2657779140&idx=1&sn=b41c63d20f256991beca880fe84e0d15&chksm=bd2f2f3d8a58a62b9010eefdc9ee552407efe341e1798c60f323c49cc857d5eac3075ae21254&scene=27#wechat_redirect # http://mp.weixin.qq.com/s?__biz=MjM5MTY3MjIxNA==&mid=2657779123&idx=1&sn=f1920b6c267ac65a2a357576d3145fff&chksm=bd2f2f4a8a58a65c7e59f1ece9dbd31b3d66a81003e875df841a5e8a19ae0addff85fb55aba3&scene=27#wechat_redirect # http://mp.weixin.qq.com/s?__biz=MjM5MTY3MjIxNA==&mid=2657779107&idx=1&sn=00c951e2d95d10e75c6647c444515420&chksm=bd2f2f5a8a58a64cb58ffb5d22ec920101fd07e5edd5720d09ad5fad8a114aa384c9b27fa51b&scene=27#wechat_redirect
因为500多篇连接过多,只放几个.api
柱状图微信
# {'科技': 176, '社会': 46, '娱乐': 7, '时尚': 26, '健康养生': 14, '时事': 20, '文化': 5, '体育': 41, '家居': 33,'教育': 7 , '财经': 28, '汽车': 13, '历史': 12, '情感': 7, '军事': 7} from pyecharts import Bar # from pyecharts import Scatter columns = ['科技', '社会', '娱乐', '时尚', '健康养生', '时事', '文化', '体育', '家居','教育', '财经', '汽车', '历史', '情感', '军事'] count = [176,46,7,26,14,20,5,41,33,7,28,13,12,7,7] bar = Bar('柱状图','文章分类') bar.add('文章数量',columns,count,mark_line=["average"],mark_point=["max","min"]) bar.render() # columns = ["Jan", "Feb", "har", "Apr", "may", "Jun", "Jul", "Aug", "sep", "oct", "Nov", "Dec"] # data1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.8, 6.4, 3.3] # bar = Bar("柱状图", "一年的降水量与蒸发量") # bar.add("降水量", columns, data1, mark_line = ["average"], mark_point = ["max", "min"]) # bar.render()
散点图(更新了pyecharts的版本致使操做有所不一样)cookie
from pymongo import MongoClient conn = MongoClient('127.0.0.1', 27017) db = conn.wx # 链接wx数据库,没有则自动建立 mongo_article = db.article # 使用article集合,没有则自动建立 date_list = [] time_list = [] for data in mongo_article.find(): datetime = data['datetime'].split(' ') date_list.append(datetime[0]) print(datetime[1], type(datetime[1])) # 因为字符串的大小没法体如今y轴上,此处取比率. h, m, s = datetime[1].split(':') ratio = (int(h) * 3600 + int(m) * 60 + int(s)) / (24 * 3600) time_list.append(ratio) date_list = date_list[::-1] time_list = time_list[::-1] print(date_list) print(time_list) # 折线图 # from pyecharts import Line # # # line = Line("折线图","文章发布时间") # # //is_label_show是设置上方数据是否显示 # line.add("文章发布时间", [str(i) for i in date_list],time_list, is_label_show=True) # line.render() from pyecharts import options as opts from pyecharts.charts import Scatter def scatter_base() -> Scatter: c = ( Scatter() .add_xaxis([str(i) for i in date_list]) .add_yaxis("文章发布时间", time_list) .set_global_opts(title_opts=opts.TitleOpts(title="Scatter-文章发布日期与时间")) ) return c scatter_base().render()
日期和时间的关系基本以下:
该公众号大概2013年末开始运营,前期文章发放时间并不明确,且常常在晚上发放文章,在一个大范围分布,可是到了2015年左右主键重视公众号运营,发放文章的时间多为12点(0.5左右)和6点到7点左右(0.7到0.8之间). 而且时间趋于固定,并且2013年和2015年时间间隔较大,所以前期的数据仅起参考做用. 后期稳定的缘由极可能是肯定了公众号的发展方向,且把公众号运营提上线程,这时候的数据对于分析对方公司的战略会有必定的帮助.
下图是经过对勺海的1500篇左右的微信公众号的抓取得出的一幅词云
其中,该企业热衷于写关于用户,体验,消费者的文章,说明企业更愿意从客户的角度出发,考虑更多事情.
另一些标签是中国,企业,时代,新趋势这样的字眼,说明这个公众号更愿意站在更高的平台上.
还有一些则是产品,研究,数据,经济,营销,分析等. 这里彷佛是为了标榜本身是一家数据驱动的企业,这是比较值得确定的.
除了上面的一些标签,很难看到跑题的,基本都是围绕提高企业效益的主题进行的,或者就是将来的前景,而勺海如今更可能是基于过去和如今的数据为客户提供复盘和总结,且考虑到企业不可能全盘把本身的发展方向放手给第三方企业,那么是否是能够认为勺海的战略重心会逐渐移向战略咨询企业转移呢? 这对于我司来讲是有必定影响的. 我公司的实力不如勺海,若是它选择放弃了较为吃力的神秘顾客行业,进军战略咨询,那么咱们是应当选择继续坚持当下的状况仍是也随之转进?
咱们获得了下列数据:
{'科技': 176, '社会': 46, '娱乐': 7, '时尚': 26, '健康养生': 14, '时事': 20, '文化': 5, '体育': 41, '家居':
33,'教育': 7 , '财经': 28, '汽车': 13, '历史': 12, '情感': 7, '军事': 7}
.
明显,该公司侧重科技方面. 公众号总体给人的感受也是如此,基本符合数据驱动企业的定义.
颇有可能该公众号的主体就会围绕着科技进行文章发放.
然而,尽管该公众号以科技为主体,可是值得深思的是,为何如今风头正盛的5G和AI的文章却这么少?5G一篇没有,AI的话只有3篇. 是勺海在囤积力量准备一举爆发?仍是勺海自身没有这方面的实力呢?
多是该公司行为谨慎,不肯意借助本身不熟悉的一些东西.但这何尝不是其余公司的契机. 如今的人工智能相关技术通常都掌握在大厂手里,咱们彻底能够调用他们的api进行使用. 可以应用在神秘顾客项目中的恐怕也就是人脸识别,语音识别和词性分析了,如今的识别率达不到那么高,但至少能辅助工做,这都是后话了,在建议那里会详细说明的.
符合咱们关键字的有将近500篇,咱们对其抽样仔细研究.
咱们选取下列文章进行研究:
这里面不乏其余一些好的文章,我仅是抽取了上述5篇文章.
从这里彻底能够看出这家公司的野望,先经过普及知识类型的,能够吸引一批对数据分析感兴趣的大学生和初入数据分析行业的菜鸟,达到吸引潜在生力军的目的;而后;最后经过一些有意思的小故事和经济管理案例,维持粉丝.
一样是有神秘顾客业务的,勺海不会在每一篇文章下面都贴一个招集神秘顾客的二维码,这彷佛显示出了一个细节:勺海不是特别在乎神秘顾客这块业务,或者说他们的常备力量已经足够应对业务需求了.
若是是前者,对于其余神秘顾客相关行业的公司来讲是利好消息,这极可能意味着勺海业务的变化;后者的话也至少意味着勺海暂时不会扩大业务.
为何要提网站呢?由于网站上展现的文章基本都来源于微信公众号.
网站做为一个企业的脸面,是企业面向客户的第一个交流点,上面基本上都放置的是微信公众号的内容,这是否意味着微信公众号的思路其实也就是网站的思想?也就是想要展现给客户的呢?
勺海身为一家专业的数据分析公司,单从公司网站看,其志不小. 和普通的网站相比(包括我公司),勺海试图成为一家数据应用平台.
勺海的官网能够分为三部分:
仔细研究一番勺海的官网,发现网站和微信公众号的思想几乎保持一致,那就是:
把勺海打形成一个数据分析爱好者,数据分析师和客户,同行都能用上的一个数据平台.
这是很恐怖的,这意味着勺海已经脱离了一家公司的视界,而是妄图定义整个行业.幸亏不是每一家企业都叫麦肯锡,勺海做为一家国内企业,还没成长到行业的天花板.
并且对于勺海来讲,网站作的有一些弊端:
本身合做过的企业,真实案例没有进行过展现. 也就是说,勺海强化了本身做为一个平台的概念,弱化了做为一家企业的概念,这从某种角度来讲也算是一件好事吧.
根据上述分析,咱们基本能够得出如下结论:
对应策略: