目錄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篇文章.
從這裏徹底能夠看出這家公司的野望,先經過普及知識類型的,能夠吸引一批對數據分析感興趣的大學生和初入數據分析行業的菜鳥,達到吸引潛在生力軍的目的;而後;最後經過一些有意思的小故事和經濟管理案例,維持粉絲.
一樣是有神祕顧客業務的,勺海不會在每一篇文章下面都貼一個招集神祕顧客的二維碼,這彷佛顯示出了一個細節:勺海不是特別在乎神祕顧客這塊業務,或者說他們的常備力量已經足夠應對業務需求了.
若是是前者,對於其餘神祕顧客相關行業的公司來講是利好消息,這極可能意味着勺海業務的變化;後者的話也至少意味着勺海暫時不會擴大業務.
爲何要提網站呢?由於網站上展現的文章基本都來源於微信公衆號.
網站做爲一個企業的臉面,是企業面向客戶的第一個交流點,上面基本上都放置的是微信公衆號的內容,這是否意味着微信公衆號的思路其實也就是網站的思想?也就是想要展現給客戶的呢?
勺海身爲一家專業的數據分析公司,單從公司網站看,其志不小. 和普通的網站相比(包括我公司),勺海試圖成爲一家數據應用平臺.
勺海的官網能夠分爲三部分:
仔細研究一番勺海的官網,發現網站和微信公衆號的思想幾乎保持一致,那就是:
把勺海打形成一個數據分析愛好者,數據分析師和客戶,同行都能用上的一個數據平臺.
這是很恐怖的,這意味着勺海已經脫離了一家公司的視界,而是妄圖定義整個行業.幸虧不是每一家企業都叫麥肯錫,勺海做爲一家國內企業,還沒成長到行業的天花板.
並且對於勺海來講,網站作的有一些弊端:
本身合做過的企業,真實案例沒有進行過展現. 也就是說,勺海強化了本身做爲一個平臺的概念,弱化了做爲一家企業的概念,這從某種角度來講也算是一件好事吧.
根據上述分析,咱們基本能夠得出如下結論:
對應策略: