个推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. 本文内容分为两部分:代码示 ...
随机推荐
- JVM04——七个GC垃圾收集器,一个都不能少
了解了JVM内存区域与垃圾回收算法,今天将为各位带来关于垃圾收集器的知识.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆内存被划分为新生代和老年代两部分,因此 JVM 通 ...
- 使用StreamHttpResponse和FileResponse下载文件的注意事项及文件私有化
为什么需要编写下载视图方法? 你或许知道,我们上传的文件默认放在media文件夹中的,且Django会为每个上传的静态文件分配一个静态url.在模板中,你可以使用{{ mymodel.file.url ...
- 区间DP(力扣1000.合并石头的最低成本)
一.区间DP 顾名思义区间DP就是在区间上进行动态规划,先求出一段区间上的最优解,在合并成整个大区间的最优解,方法主要有记忆化搜素和递归的形式. 顺便提一下动态规划的成立条件是满足最优子结构和无后效性 ...
- touch.js——手机端的操作手势
TOUCH.JS手势操作,例如一指拖动.两指旋 基本事件: touchstart //手指刚接触屏幕时触发 touchmove //手指在屏幕上移动时触发 touchend //手指 ...
- 【Python】2.11学习笔记 注释,print,input,数据类型,标识符
前面学了好多内存什么的知识,没什么用(我有眼不识泰山233 吐槽一句,这课简直就是讲给完全的编程小白听得 就从语言开始写吧(其实好多已经看过了,再来一遍 话说我已经忘了\(Markdown\)怎么写了 ...
- ipadmini从9.3.5降级8.4.1并完美越狱
ipadmini之前是iOS9.3.5实在是卡的用不了,于是打算降级,但是尝试了包括改版本描述等很多方法一直失败.今天突然成功降级8.4.1并且完美越狱,运行流畅了非常多.赶紧发个教程,回馈一下网友. ...
- C结构体与链表
今天来总结C语言的学习盲点--结构体,为了不显单一,也为了补足作者链表的编程缺陷,特更此博文,总结近段时间的学习成果.话不多说,先上一段代码 struct none{int item; link ne ...
- try_catch_return
1.情况一(try中有return,finally中没有return): public class TryTest{ public static void main(String[] args){ S ...
- Lambda表达式学习笔记
Lambda基础语法 Java8中引入了一个新的操作符" -> ",该操作符被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分: 左侧:Lamb ...
- JDBC封装-Java(新手)
JDBC的封装,自己总结的自己总结的自己总结的 dao (代码分层)命名规范: 1.com.XXX.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据 2. ...