Python獲取阿拉丁統計信息

背景

目前項目在移動端上,首推使用微信小程序。各項目的小程序訪問數據有必要進行採集入庫,方便後續作統計分析。雖然阿拉丁後臺也提供了趨勢分析等功能,但一個個的獲取數據作數據分析是很痛苦的事情。經過將數據轉換成sql持久化到數據庫上,爲後面的數據分析和展現提供了基礎。python

實現思路

阿拉丁產品分開放平臺和統計平臺兩個產品線,目前開放平臺有api及配套的文檔。統計平臺api須要收費,並且賊貴。既然沒有現成的api能夠獲取數據,那麼咱們嘗試一下用python抓取頁面上的數據,畢竟python擅長幹這種事情。mysql

獲取數據流程
一、首先登錄阿拉丁的統計平臺,以下圖
Python獲取阿拉丁統計信息sql

發現實際須要獲取的關鍵數據主要是「新用戶數」、「訪問人數」、「訪問次數」、「打開次數」、「次均停留時長」、「跳出率」、「累計用戶」,並且這裏有現成的昨日數據,那麼咱們一天爬一次這個頁面而後格式化昨日數據入庫就能夠了。數據庫

二、打開瀏覽器F12,發現這個頁面的數據主要來自連接以下圖
Python獲取阿拉丁統計信息json

這裏隱去敏感信息token,默認是20條數據進行分頁顯示,那麼問題來了,這裏的token從哪裏獲取的呢?猜想這個token應該是用戶登陸以後生成的,只要有正確的token,就能夠獲取數據。小程序

Python獲取阿拉丁統計信息

在preview標籤中能夠看到實際返回了50條的數據
Python獲取阿拉丁統計信息
展開詳細的數據,這裏隱去敏感信息app_key和app_name
Python獲取阿拉丁統計信息
展開第1條數據,能夠看到詳細的統計數據信息,如今咱們的目標就是如何經過python獲取這些信息。
Python獲取阿拉丁統計信息微信小程序

登陸過程

下面咱們來看一下登陸過程。瀏覽器退出帳號以後,從新登陸(帳密方式登陸),打開瀏覽器F12,發現實際登陸請求的url地址以下圖
Python獲取阿拉丁統計信息
注意content-type和user-agent參數,這裏隱去敏感數據用戶名、密碼和secretkey, 這個secretkey又是哪裏冒出來的呢?
Python獲取阿拉丁統計信息
無論三七二十一,先用postman請求一下這個地址,的確獲取到了token。
Python獲取阿拉丁統計信息
前面登陸url的payload中有code字段,實際用postman請求發現能夠忽略。經過F12發現,驗證碼的url是經過拼接實現的,具體以下圖。
Python獲取阿拉丁統計信息
Python獲取阿拉丁統計信息api

若是驗證碼是強制須要的,咱們能夠先拼接好url獲取圖片,經過pytesseract進行識別,固然這裏面可能存在準確率問題,不過既然這個目前是非必須的,咋們就忽略吧。瀏覽器

Python獲取阿拉丁統計信息
Python獲取阿拉丁統計信息

代碼實現

一、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)

三、入庫效果
Python獲取阿拉丁統計信息

相關文章
相關標籤/搜索