day9面向对象,多线程2
一.获取全部qq成员头像
import os,requests,pymongo class Qqgroup(object):#定义一个类
#定义获取QQ群的请求rul,抓包获取
group_rul = 'https://qun.qq.com/cgi-bin/qun_mgr/get_group_list'
#定义获取某个群的url,抓包获取
serach_url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
#定义获取图片的地址,抓包获取,将nk的值替换为%s,方便后面拼接
img_url = 'http://q4.qlogo.cn/g?b=qq&nk=%s&s=140'
def __init__(self,cookie):#构造函数,先把需要事先执行的写在这里
self.cookie = cookie#传入的cookie
#连接mongodb
self.client = pymongo.MongoClient(host='118.24.3.40',port=27017)
self.db = self.client['qq_group']#连接mongodb中的一个库,如果没有则新建
self.table = self.db['qq_group_wjp']#连接库中的表,没有则新建
def get_all_group(self):#定义一个函数用于获取qq群号码
data = {'bkn':1112777603}#请求中要传入的数据,抓包获取
#请求url,其中包括url,data,cookie,返回一个json格式的数据
#注意cookie不能直接写self.cookie,而要写成headers={'cookie':self.cookie}
res = requests.post(self.group_rul,data,headers={'cookie':self.cookie}).json()
#在获取的结果中取得所有的群,如果没有创建者默认为空,不是管理员默认为空
#在获得的群join,creat,manager的后面加上[],表示如果没有默认为空,
all_groups = res.get('join',[]) + res.get('creat',[]) + res.get('manager',[])
#使用列表生成式取得请求中的全部qq群号码gc(返回的数据中gc代表群号码)
all_gc = [i.get('gc') for i in all_groups]
print(all_gc)
return all_gc # 定义一个函数获取qq群的qq号码(uin)性别(gender)和群名片(card),需要传入一个QQ群号码
#同样需要构建请求,所有数据都抓包获得
def get_mem_info(self,qq_num):
#构建请求中需要的参数,其中bkn为固定值,故类常量中已经定义,注意字典中应该使用双引号("")
data = {"gc": qq_num, "st": 0, "end": 1000, "sort": 0, "bkn": 1112777603}
#执行post请求,返回一个josn格式值
res = requests.post(self.serach_url, data, headers={'cookie': self.cookie}).json()
mems = res.get("mems") #从请求结果res中获得所有群成员的信息
for i in mems:#循环获得群成员信息
#构建一个字典men存放循环取得所需要的数据(uni代表qq号码,g代表性别,card代表群名片)
#i.get("xxx")表示从循环中获取的值
mem = {
"qq":i.get("uin"),
"gender":i.get("g"),
"nick":i.get("nick"),
"card":i.get("card"),
"qage":i.get("qage")
}
# 判断性别gender
if mem.get("gender") == 1:#如果获得gender=1
mem['gender'] = "男"#就将字典mem中gender的值改为'男'
elif mem.get("gender") == 0:#如果获得gender=0
mem['gender'] = "女"#就将字典mem中gender的值改为'女'
else:#否则
mem['gender'] = "未知性别"#就将字典mem中gender的值改为'未知性别'
#判断群名片card
if mem.get("card") == "":#如果数据中card的值为空
mem['card'] = "没有群名片"#就将该值设定为"没有群名片"
self.save_mongo(mem)#调用存储mongo的函数,将最后的值存放到mongodb
self.down_qq_pic(i.get("uin"))#调用下载qq头像的函数
#定义函数将传入的数据存放到mongodb
def save_mongo(self,data):
self.table.insert(data)#在mongo表table中插入传入的数据
print('插入成功')
#定义函数下载qq头像,
def down_qq_pic(self,qq_num):#传入参数QQ号码
real_url = self.img_url%qq_num#将传入的qq号码和类常量中的img_url拼接好
res = requests.get(real_url).content#执行get请求,返回二进制的数据
if not os.path.isdir('imgs'):#判断imgs如果不存在
os.mkdir('imgs')#就创建一个目录imgs
#将qq号码(qq_num)和(.jpg)拼接到一起插入到创建好的目录(imgs)中
#将上一步的文件使用with open和wb的形式赋值到fw
with open(os.path.join('imgs',str(qq_num)+'.jpg'),'wb') as fw:
fw.write(res)#将执行get请求结果写入打开的文件fw中
print('%s头像下载完成'%qq_num)#输出.....
#定义一个main方法,程序运行的入口
def main(self):
all_group = self.get_all_group()#调用get_qq_group方法赋值到all_group中(获取到全部的群号)
for group in all_group:#循环all_group(群号)
self.get_mem_info(group)#调用get_all_group方法,并将群号传入 cookie = 'xxxxx'
aa = Qqgroup(cookie)
# aa.get_all_group()
# aa.get_mem_info('248338124')
aa.main()
二.析构函数(def __del__),实例被销毁的时候执行(实例被删除的时候),也就是程序最后执行的.作用:在断开数据库链接,端口文件打开的时候使用,把关闭的代码写在该函数中
三.私有函数(def __car()),在函数前面加上两根下划线叫私有函数,只能在所在的类中使用
三.类方法,用类可以直接调用(My.eat()),实例化也可以调用.可以使用类变量cls.xxx,实例也可以通过self.xxx来使用类方法
四.静态方法,一个静态函数,只是定义在类里面而已,用不了实例方法和类方法,类变量,直接用类名调用
五.属性方法(@property).看起来像变量的函数,不能有入参,使用的时候直接用.方法名(.red_pag),获取到函数的返回值,没有返回值就获取到None
六.继承,子类继承父类的属性和方法,目的是为了简化代码,.修改父类方法就调用父类方法,其中Base .__init__(self,ip,port)=super().__init__(ip,port).父类的方法都可以用super().方法名(参数)来调用和修改原来方法
方法调用中 m = My()实列化后调用类中方法m.asy(),就等于My.say(m)
七.测试环境的搭建
第一次搭建,
1.安装依赖软件如,MySQL,redis,tomcat,nginx,jdx,pthon等,数据库,中间件;
2.获取代码,一般存在svn或者git上;
3.编译java,c(解释型语言不需要编辑python,php);
4.导入基础数据;
5.修改配置文件
6.启动项目
八.多线程,一个进程就是一个程序,线程就是进程中的最小执行单位,线程在进程里面,一个进程中最少有一个线程,线程之间是相互独立的,
用
while throeading.active_count()!=1 :
pass
来判断活动的线程数,如果不等于1就循环,如果等于1就释放
九.锁,多线程操作统一数据时,最好加上锁
十.线程池,为了防止系统运行的时候,起了过多的线程,首先导入threadpool,在创建一个线程连接数pool = threadpool.TheardPool(200),下面截图中主要说明使用使用多线程获取mongo中存的qq号来下载对应qq头像
十一.多进程,其用法是固定的,下图使用多进程下载QQ头像
十二.多线程适用于IO密集型任务,如磁盘 io,网络 io,多进程适用于CPU密集型任务,如排序
day9面向对象,多线程2的更多相关文章
- Day9 - Python 多线程、进程
Python之路,Day9, 进程.线程.协程篇 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线 ...
- C++面向对象多线程入门
第1节 背景 为了更好的理解多线程的概念,先对进程,线程的概念背景做一下简单介绍. 早期的计算机系统都只允许一个程序独占系统资源,一次只能执行一个程序.在大型机年代,计算能力是一种宝贵资源.对于资 ...
- [Day9]面向对象
1.面向过程与面向对象 (1)面向对象思维方式是一种更符合人们思考习惯的思想 (2)面向过程思维方式中更多的体现的是执行者,而面向对象中更多的体现的是指挥者 (3)面向对象思维方式将复杂的问题简单化 ...
- Day9 面向对象高级
一.方法 方法包括:普通方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同. 普通方法:由对象调用:至少一个self参数:执行普通方法时,自动将调用该方法的对象赋值给self: ...
- OO面向对象多线程编程作业总结
第五次作业:多线程电梯调度 设计策略 在本次电梯作业当中,我构造了一个电梯请求队列线程,一个调度器线程,三个电梯线程,一个文件输出线程,还有主线程. 调度器扫描用户的请求队列,将每个队列分配给 ...
- Day9 面向对象进阶
@property装饰器 之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效.我 ...
- 【持续更新】JAVA面向对象多线程编程的一些tips
sleep()和wait()的区别 sleep()方法是Thread类的方法,wait()方法是Object类的方法. 调用sleep()方法的过程中,线程不会释放对象锁,睡眠时间一过,就又开始执行. ...
- 第七章使用java实现面向对象- 多线程
一.Thread类和Runnable接口 1.在java.lang包中定义了Runnable接口和Thread类. Runnable接口中只定义了一个方法,它的格式为: public abstract ...
- Java学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递
一.方法的可变个数的参数. 问题:我们能够打印的信息都是来源于方法的参数,也就是形参的传递.那如何要给方法传递不同的参数? .1.采用数组形参来定义方法 public static void test ...
随机推荐
- pandas常用函数之diff
diff函数是用来将数据进行某种移动之后与原数据进行比较得出的差异数据,举个例子,现在有一个DataFrame类型的数据df,如下: index value1 A 0 B 1 C 2 D 3 如果执行 ...
- RTC子系统
目录 RTC子系统 引入 hctosys.c interface.c class.c 小结 流程一览 框架分析 rtc_init rtc_device_register s3c_rtc_probe o ...
- ACM-ICPC 2018 沈阳赛区网络预赛 I Lattice's basics in digital electronics(模拟)
https://nanti.jisuanke.com/t/31450 题意 给出一个映射(左为ascll值),然后给出一个16进制的数,要求先将16进制转化为2进制然后每9位判断,若前8位有奇数个1且 ...
- NOI-OJ 2.2 ID:8758 2的幂次方表示
思路 可以把任意一个数转化为2^a+2^b+2^c+...+2^n 例如137的二进制为10001001,这就等效于2^7+2^3+2^0 以上结果如何通过程序循环处理呢?需要把数字n分解为上述公式, ...
- 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定
一. 简介 1. 正宗的CodeFirst模式是不含有edmx模型,需要手动创建实体.创建EF上下文,然后生成通过代码来自动映射生成数据库. 2. 旨在:忘记SQL.忘记数据库. 3. 三类配置:On ...
- Three ways to detect outliers
Z-score import numpy as np def outliers_z_score(ys): threshold = 3 mean_y = np.mean(ys) stdev_y = np ...
- John von Neumann和Ulam
John von Neumann和Ulam是好朋友,两人经常在一起喝酒.旅行.谈女人.有一次诺伊曼认出身边的一位女士,他们交谈了几句.随后他给Ulam介绍那是他的一位老朋友,刚刚离婚.Ulam就问:那 ...
- fstat函数
一.函数原型 #include<sys/stat.h> #include<unistd.h> int fstat(int fildes,struct stat *buf); 返 ...
- APPLE-SA-2019-3-25-5 iTunes 12.9.4 for Windows
APPLE-SA-2019-3-25-5 iTunes 12.9.4 for Windows iTunes 12.9.4 for Windows is now available and addres ...
- CentOS 安装 ceph 单机版
简介 Ceph是一个分布式存储软件. 它支持用3种方式存储数据,分别是:对象存储.块设备存储.分布式文件系统存储. Ceph这个软件,分为3层,最底层是Rados对象存储系统.中间是一个librado ...