python怎样收集数据

python怎样收集数据,第1张

这么具体的问题,找通用demo很难啊,个人觉得问题的难点不在Python。

1. 获取什么服务器性能数据和如何获取,可以请教公司内部运维。

2. 获取什么数据库性能数据和如何获取,可以请教公司内部DBA。

3. 以上两点搞定了,才能确定临时数据存储结构和最终数据库表结构。

以上三点是关键,Python的事情就简单多了,提供一种思路:一分钟一次,实时性不高,每台服务器用cron部署一个a.py,用于获取性能数据,在某一台服务器有一个b.py,负责获取所有服务器a.py产生的数据,然后写入数据库;a.py如何上报到b.py取决于你擅长什么,如果熟悉网络编程,用a.py做客户端上报到服务端b.py,如果熟悉shell的文件同步(如rsync),a.py只写本地文件,b.py调用c.sh(封装rsync)拉取远程文件。

一次偶然的机会我看见了一个群里的一个QQ号总是根据你所发的消息自动回复,当时很感觉到神奇,我知道可以模拟登录网站,没想到竟然也能模拟登录QQ,首先自己想到的就是如何实现模拟登录PC端的QQ, 开始研究了下,发现QQ所发送的包都很难理解。

于是就转到了网页版的QQ,因为在网页里可以捕获所有的请求从而更好的实现模拟功能!

首先第一步就是打开网页版的qq,打开浏览器的开发者模式 这里可以监控所有的请求!

打开登录界面的的时候

会捕捉到一个GET请求

其中uin是你的QQ号

返回值是 ptui_checkVC('1','AAr4bdjMeh2hEa77PTuoHhqMTxbRqOp3','\x00\x00\x00\x00\x00\xa1\x92\x12')

其中1表示需要验证码 还有一种返回值 ptui_checkVC('0','!LJV','\x00\x00\x00\x00\x00\xa1\x92\x12') 这种表示是不需要的验证码的

[python] view plain copy

def CheckVerify(self,uin):

check="h"

check=check.replace('{uin}',uin)

pattern=re.compile("ptui_checkVC′(.∗)′,′(.∗)′,′(.∗)′")

result=self.Get(check)

checked= pattern.search(result).groups()

print 'Step1: CheckVerify'

return checked

获取验证码的方法

[python] view plain copy

def GetVerify(self):

#url = 'hage?&uin='+str(self.QQ)+'&aid=1002101&0.45644426648505' + str(random.randint(10,99))

verify="htqq.com/getimage?aid=1003903&r=0.6472875226754695&uin={QQ}&cap_cd=aSD-ZVcNEcozlZUurhNYhp-MBHf4hjbJ"

verify=verify.replace('{QQ}',self.QQ)

path= r"c:/verify/1.jpg"

#data = urllib.urlretrieve(url,path)

data = urllib2.urlopen(verify)

localPic =open(r"c:/verify/1.jpg",'wb')

localPic.write(data.read())

localPic.close()

data.close()

输入用户名和密码 还有验证码后发送一个GET请求

这里面u代表账号  p代表密码 密码是经过一定算法加密的 verify是验证码

加密算法如下

[python] view plain copy

def PasswordSecret(self,password,v1,v2,md5=True):

if md5==True:

password=self.PCMd5(password).upper()

length=len(password)

temp=''

for i in range(0,length,2):

temp+=r'\x'+password[i:i+2]

return self.PCMd5(self.PCMd5(self.hex2asc(temp)+self.hex2asc(v2)).upper()+v1).upper()

#md5加密函数

def PCMd5(self,s):

h=hashlib.md5()

h.update(s)

return h.hexdigest()

#16进制转字符

def hex2asc(self,s):

_str="".join(s.split(r'\x'))

length=len(_str)

data=''

for i in range(0,length,2):

data+=chr(int(_str[i:i+2],16))

return data

然后是登录部分代码

[python] view plain copy

def Login(self,uin,pwd):

#获取参数

cheked=self.CheckVerify(uin)

#加密密码

#pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])

#pwd=self.PasswordSecret(pwd,r'AAST',r'\x00\x00\x00\x00\x00\xa1\x92\x12')

loginurl="h&t=1&g=1&js_type=0&js_ver=10080&login_sig=YPD0P*wu2n8vW1OS2f7VfzvPf3Ku5vnkP4nzImF0GybR02fsKZdjGYB7f9R7nQRn&pt_uistyle=5"

loginurl=loginurl.replace('{uin}',uin)

#loginurl=loginurl.replace('{pwd}',pwd)

#loginurl=loginurl.replace('{verify}',cheked[1])

#result=Get(loginurl)

if(cheked[0]=="1"):

#下载验证码

self.GetVerify()

image = Image.open(r"c:/verify/1.jpg")

image.show()

code=raw_input("verifycode:").strip()

loginurl=loginurl.replace('{verify}',code.upper())

pwd=self.PasswordSecret(pwd,r''+code.upper(),cheked[2])

#pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])

else:

loginurl=loginurl.replace('{verify}',cheked[1])

pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])

loginurl=loginurl.replace('{pwd}',pwd)

result=self.Get(loginurl,'ssl.ptlogin2.qq.com','hin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_urlm%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20140514001',None)

print 'Step2: Login'

pattern=re.compile("ptuiCB′(.∗)′,′(.∗)′,′(.∗)′,′(.∗)′,′(.∗)′,\s′(.∗)′")

ret= pattern.search(result).groups()

#获取必要的cookie 否则第二次登陆会出错

self.Get(ret[2])

print 'Step3: GetCookie'

for c in self.cj:

if c.name=="ptwebqq":

self.ptwebqq=c.value

return result

登录成功后服务器会返回一串json数据

ptuiCB('0','0','ebqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=1003903&daid=164&j_later=0&low_login_hour=0&regmaster=0&pt_login_type=1&pt_aid=0&pt_aaid=0&pt_light=0','0','登录成功!', '小竹')

第一个为0 就表示登录成功了 ,但是这并没有真正的登录成功

上面的返回值中的url是用来获取一个关键cookie的 那就是ptwebqq

然后进行第二次登录,这次才是真正的登录

请求如下

Accept:*/*

Accept-Encoding:gzip,deflate,sdch

Accept-Language:zh-CN,zhq=0.8

Connection:keep-alive

Content-Length:244

Content-Type:application/x-www-form-urlencoded

Cookie:o_cookie=455910092RK=fMEaWEZ0Qcts_last=web2.qq.com/ts_refer=www.baidu.com/ts_uid=4588821804pgv_pvid=914251705pgv_info=ssid=s3525422600&pgvReferrer=verifysession=h02LeYrtarkWBZeSu_czkiczeNSNlDm7V1mCm-A5qatkwnHaNfgb2z46zH4X7OfyhFT7wH6LfschPvSLhDGXFA4eA**ptui_loginuin=10588690ptisp=cncptcz=dace9cf90e7064a16ee56c8153273eff9f2de1d2827ba31f6571412ac18c50c3ptwebqq=b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4pt2gguin=o0010588690uin=o0010588690skey=@gmEO6N2JDp_uin=o0010588690p_skey=cZ5*kS-NOcXlD2Q0AEpJnmExwC2yA0g7jbTygpVFiA8_pt4_token=1SyuJ39Eq6oKEwEhGIizeg__

Host:d.web2.qq.com

Origin:h

Referer:htttml?v=20110331002&callback=1&id=2

User-Agent:Mozilla/5.0 (Windows NT 6.2WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

Form Dataview sourceview URL encoded

r:{"status":"online","ptwebqq":"b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4","passwd_sig":"","clientid":"7963288","psessionid":null}

clientid:7963288

psessionid:null

其中的ptwebqq就是刚才我们从cookie中获取的

这部分代码是

[python] view plain copy

def Login2(self):

try:

url="htel/login2"

postdata="r=%7B%22status%22%3A%22online%22%2C%22ptwebqq%22%3A%22{$ptwebqq}%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3Anull%7D&clientid={$clientid}&psessionid=null"

postdata=postdata.replace("{$ptwebqq}",self.ptwebqq)

postdata=postdata.replace("{$clientid}",str(self.clientid))

print 'Step4: Login2'

result=self.Post(url,postdata,QQRobot.HOST[0],QQRobot.REFERER[0],QQRobot.ORIGIN[0])

retjson=json.loads(result)

retjson=retjson["result"]

return retjson

except Exception,e:

print "Login2 error "+str(e)

第二次登陆成功后会返回一个

'''{"retcode":0,

"result":{

"uin":10588690,

"cip":1707901841,

"index":1075,

"port":59571,

"status":"online",

"vfwebqq":"c043f1f6ce5c3b76a4603ab60082668bef2dde0b987808f728e2071eb7c164eeb30fcd85c31018d2",

"psessionid":"8368046764001d636f6e6e7365727665725f77656271714031302e3133392e372e31363000006cb000001ae1036200a192126d0000000a40356c593742635175316d00000028c043f1f6ce5c3b76a4603ab60082668bef2dde0b987808f728e2071eb7c164eeb30fcd85c31018d2",

"user_state":0,

"f":0

}

}'''

这样的数据结构  其中0表示登陆成功

需要把这写数据保存下来 后面进行 *** 作需要

登陆成功后我们就可以拉去群列表了

[python] view plain copy

#获取群列表信息

def GetGroupNameList(self,vfwebqq):

try:

url="h/get_group_name_list_mask2"

postdata="r=%7B%22vfwebqq%22%3A%22{$vfwebqq}%22%7D"

postdata=postdata.replace("{$vfwebqq}",vfwebqq)

ret=self.Post(url,postdata,QQRobot.HOST[1],QQRobot.REFERER[1],QQRobot.ORIGIN[1])

print 'Step5: GetGroupList'

retjson=json.loads(ret)

retjson=retjson["result"]

self.grouplist=retjson

for group in self.grouplist['gnamelist']:

print group["code"],group["name"]

except Exception,e:

主要使用selenium+chrome,加了Tkinter的简单GUI,代码比较简单,就不细说了,请自行品味:

获取qq好友列表

这个是从QQ充值获取的,可得"原始数据",“分组”,“显示名”,“QQ号”:

import selenium

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

import tkinter as tk

from tkinter.filedialog import asksaveasfilename

from bs4 import BeautifulSoup

import lxml

import openpyxl

from openpyxl import Workbook

def callback():

driver.switch_to_frame('webpay-iframe')

iframe =driver.find_element_by_xpath('//*[@id="midas-webpay-main-1450000186"]/div[2]/div[1]/iframe')

driver.switch_to_frame(iframe)

html=driver.page_source

soup=BeautifulSoup(html,"lxml")

a=soup.find_all(attrs={'class':'icon-friend-s'})

wb = Workbook()

ws = wb.active

ws.append(["原始数据","分组","显示名","QQ号"])

for i in a:

if i.next_sibling !=' {undefined{el.name}}({undefined{el.qq}})':

#re,qq匹配:

#pattern = re.compile(r'[1-9][0-9]{4,}')

#re,括号匹配:

#pattern = re.compile(r'(?<=).∗?(?=).∗?(?=)')

#m = pattern.search(i.next_sibling)

k=0

for x in i.next_sibling:

if x == '(':

f=k

if x == ')':

l=k

k=k+1

ws.append([i.next_sibling,i.next_sibling.parent.parent.parent.parent.find(attrs={'class':'icon-more-friend'}).next_sibling,i.next_sibling[:f],i.next_sibling[f+1:l]])

print([i.next_sibling,i.next_sibling.parent.parent.parent.parent.find(attrs={'class':'icon-more-friend'}).next_sibling,i.next_sibling[:f],i.next_sibling[f+1:l]])

wb.save(asksaveasfilename(defaultextension ='.xlsx',filetypes = [('Excel 工作簿', '*.xlsx')]))


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10049659.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存