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使用cPickle模块序列化实例
Sep 25 Python
Python、Javascript中的闭包比较
Feb 04 Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
python 剪切移动文件的实现代码
Aug 02 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
django使用JWT保存用户登录信息
Apr 22 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
keras读取h5文件load_weights、load代码操作
Jun 12 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
用session做客户验证时的注意事项
2006/10/09 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
JS实现轮播图效果
2020/01/11 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
Python多线程实例教程
2014/09/06 Python
python通过smpt发送邮件的方法
2015/04/30 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
大学生村官承诺书
2014/03/28 职场文书
股权转让协议书
2014/12/07 职场文书
深入解析MySQL索引数据结构
2021/10/16 MySQL
mysql sock 文件解析及作用讲解
2022/07/15 MySQL