一.获取全部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的更多相关文章

  1. Day9 - Python 多线程、进程

    Python之路,Day9, 进程.线程.协程篇   本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线 ...

  2. C++面向对象多线程入门

    第1节   背景 为了更好的理解多线程的概念,先对进程,线程的概念背景做一下简单介绍. 早期的计算机系统都只允许一个程序独占系统资源,一次只能执行一个程序.在大型机年代,计算能力是一种宝贵资源.对于资 ...

  3. [Day9]面向对象

    1.面向过程与面向对象 (1)面向对象思维方式是一种更符合人们思考习惯的思想 (2)面向过程思维方式中更多的体现的是执行者,而面向对象中更多的体现的是指挥者 (3)面向对象思维方式将复杂的问题简单化 ...

  4. Day9 面向对象高级

    一.方法 方法包括:普通方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同. 普通方法:由对象调用:至少一个self参数:执行普通方法时,自动将调用该方法的对象赋值给self: ...

  5. OO面向对象多线程编程作业总结

    第五次作业:多线程电梯调度 设计策略 ​ 在本次电梯作业当中,我构造了一个电梯请求队列线程,一个调度器线程,三个电梯线程,一个文件输出线程,还有主线程. ​ 调度器扫描用户的请求队列,将每个队列分配给 ...

  6. Day9 面向对象进阶

    @property装饰器 之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效.我 ...

  7. 【持续更新】JAVA面向对象多线程编程的一些tips

    sleep()和wait()的区别 sleep()方法是Thread类的方法,wait()方法是Object类的方法. 调用sleep()方法的过程中,线程不会释放对象锁,睡眠时间一过,就又开始执行. ...

  8. 第七章使用java实现面向对象- 多线程

    一.Thread类和Runnable接口 1.在java.lang包中定义了Runnable接口和Thread类. Runnable接口中只定义了一个方法,它的格式为: public abstract ...

  9. Java学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

    一.方法的可变个数的参数. 问题:我们能够打印的信息都是来源于方法的参数,也就是形参的传递.那如何要给方法传递不同的参数? .1.采用数组形参来定义方法 public static void test ...

随机推荐

  1. usb驱动程序小结(六)

    title: usb驱动程序小结 tags: linux date: 2018/12/20/ 17:59:51 toc: true --- usb驱动程序小结 linux中为usb驱动也提供了一套总线 ...

  2. flyway和liquibase的使用样例

    在代码上我们有svn和git等诸多的版本控制方法. 但是在数据库上却没有相应的工具.一度导致多环境见的数据库同步难以维持. flyway和liquibase都是常见的数据库版本控制工具. flyway ...

  3. Spring IOC容器对bean的生命周期进行管理的过程

    1.通过构造器或者工厂方法创建bean的实例 2.为bean的属性设置值和对其他bean的引用 3.将bean的实例传递给bean的后置处理器BeanPostProcessor的postProcess ...

  4. 【转载】 C++之split字符串分割

    https://blog.csdn.net/mary19920410/article/details/77372828

  5. 02 Redis关闭服务报错---(error) ERR Errors trying to SHUTDOWN. Check logs.

    127.0.0.1:6379> shutdown (error) ERR Errors trying to SHUTDOWN. Check logs. 1.在redis.conf中修改日志文件的 ...

  6. 迅为IMX6开发板真实产品案例分享-专为研发用芯选择

    迅为IMX6开发板: Android4.4系统 Linux + Qt5.7系统 Ubuntu12.04系统 部分真实案例:HMI:3D打印机:医疗设备:工控机:触控一体机:车载终端 核心板兼容:IMX ...

  7. Studio 5000指令IN_OUT管脚实现西门子风格

    习惯了西门子博途编辑风格的同学,乍一看到Studio 5000的编辑界面,一时不适应,尤其是功能块或指令的IN和OUT管脚在一起,不好分辨,本文简单几步搞定,实现像西门子IN和OUT分左右显示风格. ...

  8. 【汇编语言】Doxbox 0.74 修改窗口大小

    1.打开Doxbox安装路径,找到DOXBox 0.74-2 Option.bat,双击打开. 2.找到windowresolution和output,将其值修改为下图中的值. 注意:图中,1280x ...

  9. HT for Web框架使用心得

    一.简单介绍 在HT for Web的官网首页写着,构建先进2D和3D可视化所需要的一切. 是的,只要你看过官网,你就会知道,这是一个企业的.并非开源的且需要收费的框架. 因为公司的业务需要,且公司使 ...

  10. 解决jenkins构建job报错“NoClassDefFoundError” in jenkins/scm/RunWithSCM问题

    现象 使用Jenkins 2.8,当我运行一个简单的Jenkins工作时,构建一个job获取源代码,出现下面的错误 FATAL: jenkins/scm/RunWithSCM java.lang.No ...