该方案基于任务调度框架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. scrapy pip中间件个人处理

    import pymongo from scrapy.conf import settings import pymysql class Mongodb_Pipeline(object): def _ ...

  2. Core + Vue 后台管理基础框架1——运行系统

    1.down源码 git clone https://github.com/KINGGUOKUN/SystemManagement.git,项目目录如下: 2.还原数据库 找到项目根目录下System ...

  3. 免费开源的 HelloDjango 系列教程,结束还是开始?

    作者:HelloGitHub-追梦人物 我们已经成功地开发了一个功能比较完备的个人博客,是时候来总结一下我们的工作了.博客系列完整的源代码地址: https://github.com/HelloGit ...

  4. Codeforces Round #378 (Div. 2)F

    题目:一个带权连通无向图,给第i条边权值减1需要花费ci元,你一共有S元,求最小生成树. 容易得出钱全部花在一条边上是最优的. 我们先做一遍最小生成树. 然后我们枚举减哪一条边. 如果这条边是树上的, ...

  5. php 调用curl_init失败

    当你在开发微信公众号,微信小程序的时候,往往会遇到困难 进入服务器,输入 tail -f /var/log/apache2/error.log 看看apache2的日志 就因为php 的curl扩展没 ...

  6. Spring Boot + LayUI 批量修改数据 数据包含着对象

    页面展示 HTML 代码 <blockquote class="layui-elem-quote demoTable"> <div class="lay ...

  7. 通达OA rce复现

    通达OA下载:链接:https://pan.baidu.com/s/1c0P-M-IyY5VxfH5d0qKHsQ 提取码:l0pc 漏洞原因:未授权文件上传 + 文件包含(利用nginx日志也可以g ...

  8. 全国职业技能大赛信息安全管理与评估-一些细节tips

    Base64加解密: ubuntu@VM-0-5-ubuntu:~$ echo iloveyou | base64aWxvdmV5b3UKubuntu@VM-0-5-ubuntu:~$ echo aW ...

  9. .gitignore排除(不忽略)二级以上目录下的文件或目录

    在.gitignore中,结合使用/*和!filename的语法,可以达到除特定文件或目录外全部忽略的目的.但当希望不忽略的文件或目录在二级或多级目录下时,如果这样写 /* !/sub/subsub/ ...

  10. http服务部署

    [root@xiaoyi ~]# vim /etc/ssh/sshd_config 17行 Port 22 49行 PermitRootLogin yes 观察IP地址与物理机属于同一个网段 打开Fi ...