一、️爱心墙️

通过爬虫搜集到粉丝的头像,然后利用PIL库拼接出爱心墙的形状:

二、代码分析

1.头像爬取

在个人中心点击我的粉丝便可以看到自己的粉丝,通过抓包可知对应的接口为:

url = 'https://me.csdn.net/api/relation/index?pageno=1&pagesize=20&relation_type=fans' # 接口地址
1
复制代码

那么,可以定义一个函数来获取粉丝的信息:

def get_fansInfo():
'''
获取粉丝相关信息
'''
url = 'https://me.csdn.net/api/relation/index?pageno=%d&pagesize=%d&relation_type=fans' # 接口地址
cookies = {} # 用户登陆cookies
headers = { # 请求头
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Referer': 'https://i.csdn.net/',
'Origin': 'https://i.csdn.net',
'Connection': 'keep-alive',
'TE': 'Trailers',
}
# 获取粉丝总数
res = requests.get(url%(1,10),headers=headers,cookies=cookies)
res_json = res.json()
N_fans = res_json['data']['data_all']
print('一共有%d个粉丝'%N_fans)
# 获取全部粉丝数据
res = requests.get(url%(1,N_fans),headers=headers,cookies=cookies)
res_json = res.json()
return res_json
123456789101112131415161718192021222324
复制代码

在返回的数据中,包括一个avatar字段,这个就是用户的头像地址,拿到头像地址之后便可以定义个函数来下载相应的头像:

def download_avatar(username,url):
'''
下载用户头像
'''
savePath = './avatars' # 头像存储目录
res = requests.get(url)
with open('%s/%s.jpg'%(savePath,username),'wb') as f:
f.write(res.content)
12345678
复制代码

定义主函数,运行代码:

if __name__ == '__main__':
fans = get_fansInfo()
for f in fans['data']['list']:
username = f['fans'] # 用户名
url = f['avatar'] # 头像地址
download_avatar(username,url)
print('用户"%s"头像下载完成!'%username)
1234567
复制代码

最后我成功将所有头像下载到本地文件夹中:

2.头像去重

聪明的你应该已经发现,在爬取到的头像中有两个头像重复出现(想必这应该是官方默认头像):

![](https://img-blog.csdnimg.cn/20201017155621207.jpg) ![](https://img-blog.csdnimg.cn/20201017155652315.jpg)

于是乎,为了更好地展示,我们得对头像进行去重。这里我们利用每个头像的MD5值来进行去重,首先定义函数来计算头像的MD5值:

def get_md5(filename):
'''
获取文件的md5值cls
'''
m = hashlib.md5()
with open(filename,'rb') as f:
for line in f:
m.update(line)
md5 = m.hexdigest()
return md5
12345678910
复制代码
说明:
每个文件通过MD5计算出摘要,理论来说只有文件完全一致MD5值才会相同。因此,可以利用它来进行图像的去重。

对头像进行去重,并把去重后的头像保存到另外的目录中:

# 照片去重
md5_already = [] # 用于存储已经记录过的图片,便于去重
for filename in os.listdir('./avatars'):
md5 = get_md5('./avatars/'+filename)
if md5 not in md5_already:
md5_already.append(md5)
shutil.copyfile('./avatars/'+filename,'./avatars(dr)/'+filename)
1234567
复制代码

3.绘制爱心墙

这一步,主要是利用python中的PIL库来把头像按照设定的框架拼接成一个更大的图片。

首先导入相关库:

import os
import random
import numpy as np
import PIL.Image as Image
1234
复制代码

定义绘制图形的框架(用二维数组表示):

FRAME = [[0,1,1,0,0,0,0,1,1,0],
[1,1,1,1,0,0,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[0,1,1,1,1,1,1,1,1,0],
[0,0,1,1,1,1,1,1,0,0],
[0,0,0,1,1,1,1,0,0,0],
[0,0,0,0,1,1,0,0,0,0]]
12345678
复制代码

这里大家完全可以发挥自己的想象,画你心中所想

其中,0表示不进行填充,1表示用头像进行填充。

定义相关参数,包括每张用于填充的头像的大小、每个点位填充的次数等:

# 定义相关参数
SIZE = 50 # 每张图片的尺寸为50*50
N = 2 # 每个点位上放置2*2张图片 # 计算相关参数
width = np.shape(FRAME)[1]*N*SIZE # 照片墙宽度
height = np.shape(FRAME)[0]*N*SIZE # 照片墙高度
n_img = np.sum(FRAME)*(N**2) # 照片墙需要的照片数
filenames = random.sample(os.listdir('./avatars(dr)'),n_img) # 随机选取n_img张照片
filenames = ['./avatars(dr)/'+f for f in filenames]
12345678910
复制代码

遍历FRAME,用头像对背景图片进行填充:

# 绘制爱心墙
img_bg = Image.new('RGB',(width,height)) # 设置照片墙背景
i = 0
for y in range(np.shape(FRAME)[0]):
for x in range(np.shape(FRAME)[1]):
if FRAME[y][x] == 1: # 如果需要填充
pos_x = x*N*SIZE # 填充起始X坐标位置
pos_y = y*N*SIZE # 填充起始Y坐标位置
for yy in range(N):
for xx in range(N):
img = Image.open(filenames[i])
img = img.resize((SIZE,SIZE),Image.ANTIALIAS)
img_bg.paste(img,(pos_x+xx*SIZE,pos_y+yy*SIZE))
i += 1 # 保存图片
img_bg.save('love.jpg')
1234567891011121314151617
复制代码

写在最后

天气逐渐寒冷,愿这次小小的表白可以给你们带来些许暖意;愿风雨兼程,不忘归途;愿身能似月亭亭,千里伴君行。

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!

前方高能!看Python程序员是表白的的更多相关文章

  1. 月薪3万的python程序员都看了这本书

    想必大家都看过吧 Python编程从入门到实践 全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 —— 游戏.数据可视化和 Web 应用程序,同时掌 ...

  2. Python程序员去上海工作有多难?

    我只能说,也要看你掌握的技术可以打多少分.技术熟练度跟找工作的难易程度是成正比的:你掌握得越好,找工作就越容易(难度系数越低):反之越高. Python程序员这种技术类的工作岗位,当然还是要有扎实的技 ...

  3. 做为一个Python程序员的基本素养

    今天在学习的过程中,明白了一些不是Python标准所必须要做的事情,二是做为一个合格的Python程序员应该所遵从的一些规范 分享给大家,有不足的地方请大家指正,此下是我学习的一点心得: 1.在给变量 ...

  4. 5款Python程序员高频使用开发工具推荐

    很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...

  5. Python程序员鲜为人知但你应该知道的16个问题(转)

    add by zhj: 没找到原文出处,只能找到转载的,文中说有17个坑,其实是16个 全文如下 这篇文章主要介绍了Python程序员代码编写时应该避免的16个“坑”,也可以说成Python程序员代码 ...

  6. Python程序员的10个常见错误(转)

    add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/682 ...

  7. Python程序员的10个常见错误

    关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Applicatio ...

  8. 所有 Python 程序员必须要学会的「日志」记录。

    本文字数:3840 字 阅读本文大概需要:10 分钟 写在之前 在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题, ...

  9. Python程序员的进化史

    各种程序员所写的阶乘算法代码 # -*- coding: utf-8 -*- #新手程序员(递归) def factorial(x): if x == 0: return 1 else: return ...

随机推荐

  1. MySQL开发篇(未完待续)

    一.索引 什么是索引? 索引是帮助Mysql提高获取数据的数据结构,换一句话讲就是"排好序的快速查找的数据结构". 1.索引的分类 MySQL主要的几种索引类型:1.普通索引.2. ...

  2. jmeter脚本的编写

    前几天讲到了性能测试的入门,今日继续来讲解jmeter的使用,本文讲的都是比较细,希望各位耐心的看完. 一.jmeter的安装与打开 前提条件:给大家一个jmeter的安装包  百度网盘的路径如下:链 ...

  3. C语言基础知识:几种特殊的函数宏封装方式

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...

  4. java类private/this的使用

    package 类的练习; public class Person { private String name; private int age; private String sex; privat ...

  5. 【mq读书笔记】mq事务消息

    关于mq食物以什么样的方式解决了什么样的问题可以参考这里: https://www.jianshu.com/p/cc5c10221aa1 上文中示例基于mq版本较低较新的版本中TransactionL ...

  6. python之切片操作,实现一个trim()函数,去除字符串首尾的空格.

    # -*- coding: utf-8 -*- def trim(s): if len(s)==0: return '' if s[:1]==' ': return trim(s[1:]) elif ...

  7. 转:python提取浏览器Cookie

    在用浏览器进行网页访问时,会向网页所在的服务器发送http协议的GET或者POST等请求,在请求中除了指定所请求的方法以及URI之外,后面还跟随着一段Request Header.Request He ...

  8. 第 4篇 Scrum 冲刺博客

    一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 登录信息的匹配 3.今天计划完成的工作 ①售货员页面功能 ②销售排行 4.工作中遇到的困难 ①页面按钮太过复杂,逻辑错乱 ②有的同学数据库驱动 ...

  9. 软工个人项目 ——wc.exe

    1.GitHub项目地址 https://github.com/k8kiw/WordCount 2.PSP预计时间 PSP2.1 Personal Software Process Stages 预估 ...

  10. 人社部新职业,Panda Global发现区块链新职业榜上有名!

    近日,为了助力新冠肺炎疫情的防控,扎实做好"六稳"工作,全面落实"六保"任务,促就业拓岗位,人力资源社会保障部联合市场监管总局.国家统计局近日正式向社会发布一批 ...