目前項目在移動端上,首推使用微信小程序。各項目的小程序訪問數據有必要進行採集入庫,方便後續作統計分析。雖然阿拉丁後臺也提供了趨勢分析等功能,但一個個的獲取數據作數據分析是很痛苦的事情。經過將數據轉換成sql持久化到數據庫上,爲後面的數據分析和展現提供了基礎。python
阿拉丁產品分開放平臺和統計平臺兩個產品線,目前開放平臺有api及配套的文檔。統計平臺api須要收費,並且賊貴。既然沒有現成的api能夠獲取數據,那麼咱們嘗試一下用python抓取頁面上的數據,畢竟python擅長幹這種事情。mysql
獲取數據流程
一、首先登錄阿拉丁的統計平臺,以下圖sql
發現實際須要獲取的關鍵數據主要是「新用戶數」、「訪問人數」、「訪問次數」、「打開次數」、「次均停留時長」、「跳出率」、「累計用戶」,並且這裏有現成的昨日數據,那麼咱們一天爬一次這個頁面而後格式化昨日數據入庫就能夠了。數據庫
二、打開瀏覽器F12,發現這個頁面的數據主要來自連接以下圖json
這裏隱去敏感信息token,默認是20條數據進行分頁顯示,那麼問題來了,這裏的token從哪裏獲取的呢?猜想這個token應該是用戶登陸以後生成的,只要有正確的token,就能夠獲取數據。小程序
在preview標籤中能夠看到實際返回了50條的數據
展開詳細的數據,這裏隱去敏感信息app_key和app_name
展開第1條數據,能夠看到詳細的統計數據信息,如今咱們的目標就是如何經過python獲取這些信息。微信小程序
下面咱們來看一下登陸過程。瀏覽器退出帳號以後,從新登陸(帳密方式登陸),打開瀏覽器F12,發現實際登陸請求的url地址以下圖
注意content-type和user-agent參數,這裏隱去敏感數據用戶名、密碼和secretkey, 這個secretkey又是哪裏冒出來的呢?
無論三七二十一,先用postman請求一下這個地址,的確獲取到了token。
前面登陸url的payload中有code字段,實際用postman請求發現能夠忽略。經過F12發現,驗證碼的url是經過拼接實現的,具體以下圖。api
若是驗證碼是強制須要的,咱們能夠先拼接好url獲取圖片,經過pytesseract進行識別,固然這裏面可能存在準確率問題,不過既然這個目前是非必須的,咋們就忽略吧。瀏覽器
一、login.py微信
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests import json #釘釘告警函數 def dingtalk(content): dingtalk_url = 'https://oapi.dingtalk.com/robot/send?access_token="請輸入釘釘token"' dingtalk_header ={"Content-Type": "application/json"} dingtalk_payload = {"msgtype": "text","text": {"content": "%s" %content}} requests.post(dingtalk_url, data=json.dumps(dingtalk_payload), headers=dingtalk_header) #獲取secretkey函數 def get_secretkey(): token_url = 'http://betaapi.aldwx.com/m/Login_reg/Login/token' header = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "user-agent": "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"} req = requests.post(token_url,headers=header).text return json.loads(req).get("secretKey") #獲取token函數 def get_token(secretkey): s = requests.Session() login_url = 'https://betaapi.aldwx.com/Main/action/Login_reg/Login/login' header = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "user-agent": "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"} payload = {"phone": "用戶名", "password": "密碼", "source": "0", "plan": "0", "creative": "0", "keyword1": "0", "secretKey": secretkey} req = s.post(login_url, data=payload, headers=header).text if json.loads(req).get("code") == 200: return json.loads(req).get("data").get("token") else: dingtalk("獲取阿拉丁登陸token失敗,請檢查!") return None
二、aldwx.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests import json from common.mysql_conn import DBAPI from conf import settings from login import get_token,get_secretkey,dingtalk #定義寫數據庫函數 def exec_sql(sql): my_conn = DBAPI(settings.Params['host'], settings.Params['user'], settings.Params['password'], int(settings.Params['port']), settings.Params['database'], settings.Params['charset']) my_conn.conn_dml(sql) #獲取統計數據拼接成列表 def get_data(token): header = {"Content-Type": "application/x-www-form-urlencoded", "user-agent": "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"} url = 'http://betaapi.aldwx.com/upgrade/api/applet_homepage' payload = {'currentpage': '1', 'total': '80', 'token': token, 'appkey': '', 'is_demo': '0'} try: req = requests.post(url, data=payload, headers=header).text data = (json.loads(req).get("data")) sql_value = [] for i in data: app_name = i.get('app_name') yesterday_data = i.get('countList')[1] create_time = yesterday_data.get('day') new_comer_count = yesterday_data.get('new_comer_count') visitor_count = yesterday_data.get('visitor_count') open_count = yesterday_data.get('open_count') total_page_count = yesterday_data.get('total_page_count') secondary_avg_stay_time = yesterday_data.get('secondary_avg_stay_time') bounce_rate = yesterday_data.get('bounce_rate') total_visitor_count = yesterday_data.get('total_visitor_count') value = "(\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")" % (app_name, create_time, new_comer_count, visitor_count, open_count, total_page_count,secondary_avg_stay_time,bounce_rate, total_visitor_count) sql_value.append(value) if sql_value != 'None': return sql_value else: dingtalk("獲取微信小程序統計信息失敗,token: %s" %token) except Exception as e: dingtalk("獲取微信小程序%s統計信息失敗,%s" %e) if __name__ == '__main__': secretkey=get_secretkey() token = get_token(secretkey) sql = """INSERT INTO operations_db.aldwx_stat (APP_NAME,CREATE_TIME,NEW_COMER_COUNT,VISITOR_COUNT,OPEN_COUNT,TOTAL_PAGE_COUNT,SECONDARY_AVG_STAY_TIME,BOUNCE_RATE,TOTAL_VISITOR_COUNT) VALUES""" value = get_data(token) #拼接並轉換sql value = str(value).strip("'[").strip("]'").strip().replace("', '",",") sql = "%s%s;" % (sql, value) print(sql) exec_sql(sql)
三、入庫效果