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读取mp3中ID3信息的方法
Mar 05 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
Numpy掩码式数组详解
Apr 17 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
python批量修改图片大小的方法
Jul 24 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
Django 项目重命名的实现步骤解析
Aug 14 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Django路由层URLconf作用及原理解析
Sep 24 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
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
PHP中header用法小结
2016/05/23 PHP
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
jsonp原理及使用
2013/10/28 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
python smtplib发送带附件邮件小程序
2018/05/22 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
销售人员个人求职信
2013/09/26 职场文书
应届生求职信写作技巧
2013/10/24 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
战略合作意向书范本
2014/04/01 职场文书
啤酒节策划方案
2014/05/28 职场文书
副总经理任命书
2014/06/05 职场文书
抗震救灾标语
2014/06/26 职场文书
见义勇为事迹材料
2014/12/24 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers