Python爬取阿拉丁统计信息过程图解


Posted in Python onMay 12, 2020

背景

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

实现思路

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

获取数据流程

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

Python爬取阿拉丁统计信息过程图解

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

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

Python爬取阿拉丁统计信息过程图解

这里隐去敏感信息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爬取阿拉丁统计信息过程图解

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

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

Python爬取阿拉丁统计信息过程图解

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

Python爬取阿拉丁统计信息过程图解

梳理一下:

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 相关文章推荐
python 判断一个进程是否存在
Apr 09 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
简单谈谈python中的lambda表达式
Jan 19 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
Python把图片转化为pdf代码实例
Jul 28 Python
Python使用protobuf序列化和反序列化的实现
May 19 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 #Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 #Python
小 200 行 Python 代码制作一个换脸程序
May 12 #Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 #Python
Python如何根据时间序列数据作图
May 12 #Python
python logging.info在终端没输出的解决
May 12 #Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 #Python
You might like
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
Document 对象的常用方法
2009/07/31 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python二分法搜索算法实例分析
2015/05/11 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
Python中字符串的处理技巧分享
2016/09/17 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
跟单文员岗位职责
2014/01/03 职场文书
结婚典礼证婚词
2014/01/11 职场文书
保护环境倡议书范文
2014/05/13 职场文书
2015年安全生产责任书
2015/01/30 职场文书
培训感想范文
2015/08/07 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
总结Pyinstaller打包的高级用法
2021/06/28 Python
Python采集股票数据并制作可视化柱状图
2022/04/04 Python