个推push数据统计(爬虫)
该方案基于任务调度框架Gearman,采用Python开发的分布式数据统计系统。
项目的目录结构很简单:
# apple at localhost in ~/Develop/getui [11:24:26]
$ tree
.
├── Browser.py
├── PickleGearman.py
├── SpiderWorker.py
└── countPushNum.py
0 directories, 4 files
我们的Mac Pro Book,Gearman安装并启动:
# apple at liujingyu.local in ~/Develop/getui [::]
$ brew install gearman
3 $ gearmand -d -L 127.0.0.1 -p 4307
Python需要安装Gearman、mechanize等库,(pip用于安装常用的包,具体安装见, https://pip.pypa.io/en/latest/installing.html#install-pip)
# apple at liujingyu.local in ~/Develop/getui [::]
$ pip install gearman mechanize
workder之间发送,接受Python对象。
$ cat PickleGearman.py
#!/usr/bin/env python
#coding:utf-8 import pickle
import gearman class PickleDataEncoder(gearman.DataEncoder):
@classmethod
def encode(cls, encodable_object):
return pickle.dumps(encodable_object) @classmethod
def decode(cls, decodable_string):
return pickle.loads(decodable_string) class PickleWorker(gearman.GearmanWorker):
data_encoder = PickleDataEncoder class PickleClient(gearman.GearmanClient):
data_encoder = PickleDataEncoder
运行图:

8个Spider运行过程图:

Spider代码:
$ cat SpiderWorker.py
#!/usr/bin/env python from PickleGearman import PickleWorker
from Browser import Browser class GearmanWorker(PickleWorker):
def on_job_execute(self, current_job):
return super(GearmanWorker, self).on_job_execute(current_job) def SpiderWorker(gearman_worker, gearman_job):
taskIds = gearman_job.data try:
doc = Browser(taskIds)
except Exception as e:
config.logging.info(e) return doc worker = GearmanWorker(['127.0.0.1:4307'])
worker.register_task("SpiderWorker", SpiderWorker)
worker.work()
countPushNum.py代码:
# apple at localhost in ~/Develop/getui [11:30:38]
$ cat countPushNum.py
#!/usr/bin/python
# -*- coding: utf-8 -*- import cookielib
import json
import socket
socket.setdefaulttimeout(10)
import redis
import mechanize
from PickleGearman import PickleClient
import numpy as np
currency = 30 def printEveryGroupMsg(groupSum):
"""docstring for printEveryGroupMsg"""
print '有效可发送数 实际下发数 收到数'
print groupSum def main():
gearman_clients = PickleClient(['127.0.0.1:4307'])
"""docstring for main"""
r1 = redis.Redis(host='xxx.xx.xx.x', port=6379, db=0, password='pasword')
r2 = redis.Redis(host='xx.xx.xx.xx', port=6379, db=0, password='pasword') #总数统计
yesterdaykeys = '*'+yesterday+':count' totalkeys = r1.keys(yesterdaykeys)
for key in totalkeys:
print key,r1.get(key)
totalkeys = r2.keys(yesterdaykeys)
for key in totalkeys:
print key,r2.get(key) #push数统计
yesterdaykeys = '*'+yesterday+':taskIds' totalkeys = r1.keys(yesterdaykeys)
for key in totalkeys:
print key
taskIds = list(r1.smembers(key))
everyGroup = []
jobs = [dict(task='SpiderWorker', data=taskId) for taskId in [taskIds[i:i+currency] for i in range(0, len(taskIds), currency)]]
for per_jobs in [jobs[i:i+currency] for i in range(0, len(jobs), currency)]:
completed_requests = gearman_clients.submit_multiple_jobs(per_jobs)
for current_request in completed_requests:
content = current_request.result
if len(content) == 3:
everyGroup.append(content)
printEveryGroupMsg(np.sum(everyGroup, 0)) totalkeys = r2.keys(yesterdaykeys)
for key in totalkeys:
print key
taskIds = list(r2.smembers(key)) everyGroup = []
jobs = [dict(task='SpiderWorker', data=taskId) for taskId in [taskIds[i:i+currency] for i in range(0, len(taskIds), currency)]]
for per_jobs in [jobs[i:i+currency] for i in range(0, len(jobs), currency)]:
completed_requests = gearman_clients.submit_multiple_jobs(per_jobs)
for current_request in completed_requests:
content = current_request.result
if len(content) == 3:
everyGroup.append(content)
printEveryGroupMsg(np.sum(everyGroup, 0)) if __name__ == '__main__': from datetime import date, timedelta day = input('请输入时间<昨天请输入1>\n>') or 0 yesterday = (date.today() - timedelta(day)).strftime('%y%m%d')
today = (date.today() - timedelta(0)).strftime('%y%m%d') main()
抓取模块代码:
$ cat Browser.py
#!/usr/bin/env python
#coding:utf-8 import mechanize
import numpy as np
import cookielib,json def Browser(taskIds):
url = 'http://dev.igetui.com/login.htm'
# Browser
br = mechanize.Browser() # Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj) # Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False) # Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) # Want debugging messages?
br.set_debug_http(False)
br.set_debug_redirects(False)
br.set_debug_responses(False) # User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) \
Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] # Open some site, let's pick a random one, the first that pops in mind:
r = br.open(url) br.select_form(name = 'loginForm')
# 登陆用户名和密码
br['username'] = 'getui'
br['password'] = 'password'
br.submit() everyGroup = []
for taskId in taskIds:
try:
tsum = []
try:
home_url = 'http://dev.getui.com/dos/statistics/apiStatistics'
response = br.open('https://dev.getui.com/dos/pushRecords/queryApiPushList?curPage=1&appId=16500&taskId=%s' % taskId)
html = response.read() result = json.loads(html.strip())
if result.has_key('resultList'):
resultList = result['resultList'] tsum.append(int(resultList[0]['sendNum']))
tsum.append(int(resultList[0]['realSendNum']))
tsum.append(int(resultList[0]['receiveNum']))
except Exception as e:
print e
else:
print tsum if len(tsum) == 3:
everyGroup.append(tsum)
except Exception as e:
print e return np.sum(everyGroup, 0)
个推push数据统计(爬虫)的更多相关文章
- 个推数据统计产品(个数)iOS集成实践
最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用统计”,根据官方的说法,个推的数据统计产品通过专业的 ...
- Android之友盟多渠道打包与数据统计
文章大纲 一.多渠道打包与数据统计介绍二.友盟实现多渠道打包实战三.友盟数据统计实战四.项目源码下载五.参考文章 一.多渠道打包与数据统计介绍 多渠道打包,相信很多同学都知道.在Android ...
- Echarts 之三 —— 地市联动数据统计二
一.简介 除了是一个地图之外,我们也可以使用多地图进行地市.区县联动数据统计.需求如下:展示整改广东省的地图,并显示统计信息,当点击某一个地市的时候,就显示该地市的地图,并统计该地市区县的数据信息.二 ...
- Echarts 之二——地市联动数据统计
一.简介 通过地图可以更直观地展示各个地区的统计数据,能够更清楚地进行数据分析.有些场景下,我们不仅仅需要对每个地市进行统计分析.更需要对地市一下的区县进行数据统计,并进行联动.此事我们可以通过Ech ...
- 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计
[转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics ...
- PHP+Mysql+jQuery实现中国地图区域数据统计(raphael.js)
使用过百度统计或者cnzz统计的童鞋应该知道,后台有一个地图统计,不同访问量的省份显示的颜色也不一样,今天我将带领大家开发一个这样的案例.上一篇<使用raphael.js绘制中国地图>文章 ...
- CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线
很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...
- Android 推送和统计最优轮循(心跳策略)探究实践
http://blog.csdn.net/sk719887916/article/details/51398416 skay亲笔 Android开发中经常会用到周期性执行一个动作的需求,大的场景有推送 ...
- iOS 轻松使用 App 数据统计
想获取用户各项行为数据吗? 想轻松查看用户行为图表吗? 想高效进行 App 运营管理吗? 想,来我带你玩转 App 数据统计.这里我使用专业.轻便的 JAnalytics. 本文内容分为两部分:代码示 ...
随机推荐
- pyppeteer基本使用demo
# -*- coding: utf-8 -*- # 类似selenium,支持异步,不需要再单独安装环境,pyppeteer自动安装环境 # 异步await要写到一个函数的内部 from pyppet ...
- 详解分页组件中查count总记录优化
1 背景 研究mybatis-plus(以下简称MBP),使用其分页功能时.发现了一个JsqlParserCountOptimize的分页优化处理类,官方对其未做详细介绍,网上也未找到分析该类逻辑的只 ...
- c# 导出excel的两种常见方法
1,不是用第三方插件(html直接输出) StringBuilder ssb = new StringBuilder(); StringBuilder sb = new StringBuilder() ...
- 小程序post请求,后台接收不到数据的解决方法
wx.request({ url: 'myurl', method:'POST', dataType:'json', data: { mydata:mydata }, success(res) { c ...
- 【TIJ4】照例,每个分类的第一篇文章随便说两句
[其实没啥好说的,完].... 嘛,其实本来也就是放练习的地方. 如果说世界上的课本按练习难度分成两类,一类是像Weiss那种习题比内容难的,还有就是TIJ这种讲得详尽但是习题相对简单的了吧. 不过不 ...
- 欲善事先利器-IEAD插件篇
工欲善其事,必先利其器,好鞋踢好球是非常合乎逻辑的事情. --<长江七号> 同样的开场白,不一样的酒,不一样的故事. 上篇<欲善事先利器--系统篇>已经推荐了一些个人常用的效率 ...
- JavaScript和JSCript的标准ECMAScript
相信很多人都听过JavaScript(简称JS),甚至学过JavaScript.但是却没听过ECMAScript(简称:EC). ECMAScript其实是JavaScript的标准,也就是JavaS ...
- 《吐血整理》Redis 性能优化的 13 条军规!史上最全
Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1) ...
- dom&JavaScript&Jquery
目录 dom&JavaScript&Jquery 建节点 添加节点 删除节点: 替换节点: 属性节点 获取值操作 class的操作 指定CSS操作 操作节点 获取input用户输入 操 ...
- Worktile正式入驻飞书,助力企业轻松实现敏捷开发与协作
企业在敏捷研发中时常面临着交付延期.需求不匹配等问题,如何更高效地完成敏捷研发? Worktile携手飞书,为企业用户提供敏捷开发服务,帮助企业实现软件项目的需求管理.缺陷追踪.迭代规划与推进以及效能 ...