该方案基于任务调度框架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数据统计(爬虫)的更多相关文章

  1. 个推数据统计产品(个数)iOS集成实践

    最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用统计”,根据官方的说法,个推的数据统计产品通过专业的 ...

  2. Android之友盟多渠道打包与数据统计

    文章大纲 一.多渠道打包与数据统计介绍二.友盟实现多渠道打包实战三.友盟数据统计实战四.项目源码下载五.参考文章   一.多渠道打包与数据统计介绍   多渠道打包,相信很多同学都知道.在Android ...

  3. Echarts 之三 —— 地市联动数据统计二

    一.简介 除了是一个地图之外,我们也可以使用多地图进行地市.区县联动数据统计.需求如下:展示整改广东省的地图,并显示统计信息,当点击某一个地市的时候,就显示该地市的地图,并统计该地市区县的数据信息.二 ...

  4. Echarts 之二——地市联动数据统计

    一.简介 通过地图可以更直观地展示各个地区的统计数据,能够更清楚地进行数据分析.有些场景下,我们不仅仅需要对每个地市进行统计分析.更需要对地市一下的区县进行数据统计,并进行联动.此事我们可以通过Ech ...

  5. 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

    [转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics ...

  6. PHP+Mysql+jQuery实现中国地图区域数据统计(raphael.js)

    使用过百度统计或者cnzz统计的童鞋应该知道,后台有一个地图统计,不同访问量的省份显示的颜色也不一样,今天我将带领大家开发一个这样的案例.上一篇<使用raphael.js绘制中国地图>文章 ...

  7. CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线

    很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...

  8. Android 推送和统计最优轮循(心跳策略)探究实践

    http://blog.csdn.net/sk719887916/article/details/51398416 skay亲笔 Android开发中经常会用到周期性执行一个动作的需求,大的场景有推送 ...

  9. iOS 轻松使用 App 数据统计

    想获取用户各项行为数据吗? 想轻松查看用户行为图表吗? 想高效进行 App 运营管理吗? 想,来我带你玩转 App 数据统计.这里我使用专业.轻便的 JAnalytics. 本文内容分为两部分:代码示 ...

随机推荐

  1. 双列集合Map相关面试题

    一.了解Map集合吗?Map集合都有哪些实现 HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap 二.HashMap和HashTable ...

  2. 痞子衡嵌入式:恩智浦SDK驱动代码风格检查工具预览版

    大家好,我是痞子衡,是正经搞技术的痞子. 接上文 <恩智浦SDK驱动代码风格.模板.检查工具> 继续聊,是的,过去的三天里我花了一些时间做了一个基于 PyQt5 的 GUI 工具,可以帮助 ...

  3. css中:如何让一个图片(不知道宽高,宽高可能比父元素div大),在父元素div内部水平垂直居中,并且不溢出父元素div,且图片不拉伸变形(可等比例缩小)?

    欢迎进入:http://www.jscwwd.com/article/list/%E5%85%A8%E9%83%A8 效果图: 不管父元素的宽高怎么变化,图片都是水平垂直居中的,并且不溢出父元素. 注 ...

  4. element中的树形组件,如何获取父级菜单的id

    一般多选的树形组件,使用getCheckedNodes()方法只能获取到本级的菜单id,只有在子菜单全部选中的情况下才会选中上级.但我们想要不全选中子级的情况下也要获取它的上级,甚至上上级等,怎么办呢 ...

  5. 032.核心组件-kube-proxy

    一 kube-proxy原理 1.1 kube-proxy概述 Kubernetes为了支持集群的水平扩展.高可用性,抽象出了Service的概念.Service是对一组Pod的抽象,它会根据访问策略 ...

  6. git命令,github网站以及sourceTree用法详解

    1.git下载安装 这里只是windows安装方法: 进入这个网址:http://msysgit.github.com/,点击下载,就会下载下来一个exe文件,双击打开,安装即可 完成安装之后,就可以 ...

  7. WSGI标准、MVC和MTC框架

    WSGI服务: wsgiref模块其实就是将整个请求信息给封装了起来,就不需要你自己处理了,假如它将所有请求信息封装成了一个叫做request的对象,那么你直接request.path就能获取到用户这 ...

  8. MySQL----DML(增删改表中数据)

    ##DML:增删改表中的数据 1.添加数据 *语法: *  insert into 表名(列名1,列名2,...列名n) values (值1,值2,...值n); *注意: 1.列名和值要一一对应. ...

  9. linux pdftk

    部分内容来源网络,如有版权问题,请联系删除: http://xuqin.blog.51cto.com/5183168/1117780,   http://blog.sina.com.cn/s/blog ...

  10. OpenCV-Python SIFT尺度不变特征变换 | 三十九

    目标 在这一章当中, 我们将学习SIFT算法的概念 我们将学习找到SIFT关键点和描述算符. 理论 在前两章中,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了, ...