背景

目前项目在移动端上,首推使用微信小程序。各项目的小程序访问数据有必要进行采集入库,方便后续做统计分析。虽然阿拉丁后台也提供了趋势分析等功能,但一个个的获取数据做数据分析是很痛苦的事情。通过将数据转换成sql持久化到数据库上,为后面的数据分析和展示提供了基础。

实现思路

阿拉丁产品分开放平台和统计平台两个产品线,目前开放平台有api及配套的文档。统计平台api需要收费,而且贼贵。既然没有现成的api可以获取数据,那么我们尝试一下用python抓取页面上的数据,毕竟python擅长干这种事情。

获取数据流程

1、首先登陆阿拉丁的统计平台,如下图

发现实际需要获取的关键数据主要是“新用户数”、“访问人数”、“访问次数”、“打开次数”、“次均停留时长”、“跳出率”、“累计用户”,而且这里有现成的昨日数据,那么我们一天爬一次这个页面然后格式化昨日数据入库就可以了。

2、打开浏览器F12,发现这个页面的数据主要来自链接如下图

这里隐去敏感信息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是通过拼接实现的,具体如下图。

如果验证码是强制需要的,我们可以先拼接好url获取图片,通过pytesseract进行识别,当然这里面可能存在准确率问题,不过既然这个目前是非必须的,咋们就忽略吧。

网页上退出登录,发现页面请求了token地址如下

直接用浏览器访问,可以看到secretKey

梳理一下:

1、目前我们已经有了登录的url、获取统计数据的url、用户名密码、secretKey等信息,code可忽略

2、登录完可以获取到token信息

3、可以通过token请求获取统计数据的url来获取数据

代码实现

1、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

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

3、入库效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python爬网页统计数据_Python爬取阿拉丁统计信息过程图解相关推荐

  1. python爬取网页json数据_python爬取json数据库

    手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. [二. ...

  2. python搜索网页特定区域内容_Python爬取练习:指定百度搜索的内容并提取网页的标题内容...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章源于白菜学python ,作者小白菜 刚接触Python的新手.小白,可以复制下面的链接去 ...

  3. python操作网页flash视频_Python爬取FLASH播放器中的资料

    Python爬取FLASH播放器中的资料. 一.首先了解一下AMF协议:AMF(Action Message Format)是Flash与服务端通信的一种常见的二进制编码模式,其传输效率高,可以在HT ...

  4. python 获取网页表格数据_python实战4获取tushare数据

    python 4 实战4 获取Tushare数据 阅读之前请注意: 代码都为红色.由于公众号宽度不够,没有特别注明,即使换行都是同一句代码,中间没有换行符.如果是两行代码,会用空行隔开. SQL语句请 ...

  5. python爬虫之股票数据定向爬取

    python爬虫之股票数据定向爬取 功能描述 目标:获取上交所和深交所所有股票的名称和交易的信息 输出:保存到文件中 技术路线:requests-bs4-re 前期分析 选取原则:股票的信息静态存在H ...

  6. ajax获取网页新闻,基于Ajax的新闻网页动态数据的抓取方法及系统

    主权项: 1.基于Ajax的新闻网页动态数据的抓取方法,其特征是,包括如下步骤:步骤(101):建立新闻网页爬取内容数据库,设置新闻网页爬取内容数据库的编码方式:获得待抓取新闻网页的新闻列表页面的UR ...

  7. python爬取天气数据_Python爬取历史天气数据

    Python爬取历史天气数据 作者:梅昊铭 1. 导读 之前Mo给大家分享过杭州历年天气情况的数据集,相信有不少小伙伴好奇这些数据是怎么获取.今天Mo就来教大家如何使用Python来进行历史天气数据的 ...

  8. python提取ajax异步加载数据_python爬取豆瓣电影分类排行榜引出的异步加载(AJAX)问题...

    1.背景 之前的文章中已经介绍过猫眼TOP100的电影信息爬取案例,网页每页有10条电影信息,通过翻页发现URL变化规律构造循环爬取10页100条全部电影信息.但是豆瓣电影分类排行榜的网页情况就所不同 ...

  9. python教程app下载地址_Python爬取APP下载链接的实现方法

    首先是准备工作 Python 2.7.11:下载python 其中python2和python3目前同步发行,我这里使用的是python2作为环境.Pycharm是一款比较高效的Python IDE, ...

最新文章

  1. HDU1531(差分约束+Bellman_ford)
  2. 【原创】CGAL中,2D Arrangements学习笔记
  3. python 0o10_Python 从业十年的程序员,写的万字经验分享
  4. idea mybatis generator插件_Mybatis使用自定义插件去掉POJO的Getter和Setter方法
  5. ios kb转m_iOS 音频录音和格式转换
  6. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
  7. android抽屉屏幕右滑,android - Android - 使滑动抽屉从左向右滑动 - 堆栈内存溢出...
  8. 1360E. Polygon
  9. (02)VHDL模块介绍
  10. 【报告分享】我国数字基础设施建设现状及推荐措施研究报告.pdf(附下载链接)...
  11. 永远不要在代码中使用“User”这个单词
  12. 改键走a显示攻击距离_英雄联盟谁才是真正的走A怪?大神钟爱VN,新手都去玩复仇之矛!...
  13. 前端Js处理百度地图和腾讯/高德地图经纬度不同的转换问题
  14. 快慢指针解决回文问题
  15. SQLServer 2008 下载地址(微软官方网站)
  16. Autodesk Maya入门到精通学习教程
  17. linux红帽8怎么安yum,RedHat Linux 8本地Yum源配置方法
  18. 【odroid-xu3】 ODROID-XU3软件环境搭建记录
  19. 腾讯公关总监张军“青年睡觉言论”大翻车,惨遭网友“群攻”
  20. poly-yolo笔记

热门文章

  1. ACM模块解析之 数论
  2. 作为时代齿轮的Wi-Fi 6,如何转动园区网络的产业格局
  3. 老男孩mysql 百度云_英语语录:除了你,没人能掌控你的幸福
  4. jsoup-1.11.2.jar,JsoupXpath-0.3.2.jar相关jar包及Jsoup开发说明文档
  5. Matlab聚类分析_层次聚类+kmeans聚类等
  6. 漫谈腾讯微服务平台 TSF Mesh 统一容器和虚拟机之路
  7. 内网后渗透,生成免杀后门!!
  8. MATLAB基础之MATLAB实现阶乘和阶乘累加
  9. java+web+股票图表_基于Echarts的股票K线图展示
  10. 考试周刊杂志考试周刊杂志社考试周刊编辑部2022年第24期目录