爬取微信好友头像拼接为大图
代码:
#导入对应的包 from numpy import * import itchat import PIL.Image as Image import os def get_imgs():#完成主要的下载头像的任务 #使用热登录(已经登录的程序,再一次运行程序不需要扫描验证码),执行这一步就会有二维码需要扫描登录 itchat.auto_login(hotReload=True) #获取朋友列表,返回字典类型的数据集,获取好友的索引数 friends = itchat.get_friends(update=True)[0:256] #为图片命名的变量 num = 0 #遍历好友列表 for i in friends: #获取好友的头像 img = itchat.get_head_img(userName=i["UserName"]) #在项目文件的主创建一个user文件用于放头像,并写入对应的图片名,空白的 if not os.path.exists('user'):os.makedirs("user") fileImage = open( "user\" + str(num) + ".jpg",'wb') #将获取到的头像文件写到创建的图片文件中 fileImage.write(img) #关闭资源 fileImage.close() num += 1 #制作大的大头像 def get_big_img(): #获取usr文件夹所有文件的名称 pics = os.listdir("user") numPic = len(pics) #创建图片大小 toImage = Image.new("RGB", (800, 800)) #用于图片的位置 x = 0 y = 0 #遍历user文件夹的图片 for i in pics: try: #依次打开图片 img = Image.open("user\{}".format(i)) except IOError: print("Error: 没有找到文件或读取文件失败",i) else: #重新设置图片的大小 img = img.resize((50, 50), Image.ANTIALIAS) #将图片粘贴到最后的大图片上,需要注意对应的位置 toImage.paste(img, (x * 50, y * 50)) #设置每一行排16个图像 x += 1 if x == 16: x = 0 y += 1 #保存图片为bigPhoto.jpg toImage.save("user\" +"bigPhoto.jpg") #将做好图片发送东自己的手机上 itchat.send_image("user\" +"bigPhoto.jpg", 'filehelper') #定义执行的主函数 def main(): get_imgs() get_big_img() #运行 if __name__=="__main__": main()
性能提升---线程池并发
from numpy import * import itchat import PIL.Image as Image import os,uuid,math from concurrent.futures import ThreadPoolExecutor def get_info(friend): # 获取好友的头像 return itchat.get_head_img(userName=friend["UserName"]) def downloadImg(res): img = res.result() # 在user文件夹写入对应的图片名 fileImage = open("user\" + str(uuid.uuid4()) + ".jpg", 'wb') # 将获取到的头像文件写到创建的图片文件中 fileImage.write(img) # 关闭资源 fileImage.close() # 制作大的大头像 def get_big_img(): # 获取usr文件夹所有文件的名称 pics = os.listdir("user") numPic = len(pics) img_width = math.floor(sqrt(numPic)) img_height = math.ceil(sqrt(numPic)) # 创建图片大小 toImage = Image.new("RGB", (img_width*50, img_height*50)) # 用于图片的位置 x = 0 y = 0 # 遍历user文件夹的图片 for i in pics: try: # 依次打开图片 img = Image.open("user\{}".format(i)) except IOError: print("Error: 没有找到文件或读取文件失败", i) else: # 重新设置图片的大小 img = img.resize((50, 50), Image.ANTIALIAS) # 将图片粘贴到最后的大图片上,需要注意对应的位置 toImage.paste(img, (x * 50, y * 50)) # 设置每一行排16个图像 x += 1 if x == 16: x = 0 y += 1 # 保存图片为bigPhoto.jpg toImage.save("user\" + "bigPhoto.jpg") # 将做好图片发送东自己的手机上 itchat.send_image("user\" + "bigPhoto.jpg", 'filehelper') # 运行 if __name__ == "__main__": # 创建user文件夹 if not os.path.exists('user'): os.makedirs("user") # 使用热登录(已经登录的程序,再一次运行程序不需要扫描验证码),执行这一步就会有二维码需要扫描登录 itchat.auto_login(hotReload=True) # 获取朋友列表,返回字典类型的数据集,获取好友的索引数 friends = itchat.get_friends(update=True)[0:256] pool = ThreadPoolExecutor() # 遍历好友列表 for friend in friends: v = pool.submit(get_info, friend) v.add_done_callback(downloadImg) pool.shutdown(wait=True) get_big_img()
知识点:
1、itchat 操作微信
2、线程池实现并发
3、uuid 给图片命名
4、根据头像图片数量自动计算大图的宽高尺寸