Utilice Python para hacer un muro de confesión artefacto-amor

Prefacio

El texto y las imágenes de este artículo son de Internet y son únicamente con fines de aprendizaje y comunicación. No tienen ningún uso comercial. Si tiene alguna pregunta, comuníquese con nosotros para su procesamiento.

PD: Si necesita materiales de aprendizaje de Python, puede hacer clic en el enlace de abajo para obtenerlo usted mismo.

Materiales de aprendizaje gratuitos de Python y respuestas de comunicación grupal Haga clic para unirse


1. Muro de amor ❤️

Recoge los avatares de los fanáticos a través del rastreador y luego usa la biblioteca PIL para empalmar la forma del muro del amor:

 

Dos, análisis de código

1. Avatar arrastrándose

Haga clic en mis fans en el centro personal para ver sus fans. Al capturar el paquete, puede ver que la interfaz correspondiente es:

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

Luego, puede definir una función para obtener información de los fanáticos:

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

Los datos devueltos incluyen un campo de avatar, que es la dirección del avatar del usuario. Después de obtener la dirección del avatar, puede definir una función para descargar el avatar correspondiente:

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)

Defina la función principal y ejecute el código:

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)

Finalmente, descargué con éxito todos los avatares a la carpeta local:

 

2. Deduplicación de avatares

Inteligente, debería haber descubierto que hay dos avatares repetidos en los avatares rastreados (presumiblemente este debería ser el avatar predeterminado oficial):

 

 

Por lo tanto, para una mejor visualización, tenemos que eliminar los duplicados del avatar. Aquí usamos el valor MD5 de cada avatar para realizar la deduplicación. Primero, defina una función para calcular el valor MD5 del avatar:

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

Nota: El resumen se calcula para cada archivo a través de MD5. En teoría, el valor de MD5 será el mismo solo si los archivos son completamente consistentes. Por lo tanto, se puede utilizar para la deduplicación de imágenes.
Desduplica el avatar y guarda el avatar desduplicado en otro directorio:

# 照片去重
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)

3. Dibuja un muro de amor

Este paso utiliza principalmente la biblioteca PIL en Python para unir el avatar en una imagen más grande de acuerdo con el marco establecido. Primero importe la biblioteca relevante:

import os
import random
import numpy as np
import PIL.Image as Image

Defina el marco para dibujar gráficos (representado por una matriz bidimensional):

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]]

Aquí todos pueden usar su imaginación y dibujar lo que piensan

Entre ellos, 0 significa no completar, 1 significa completar con avatar.

Defina los parámetros relevantes, incluido el tamaño de cada avatar utilizado para el llenado, la cantidad de veces que se llena cada punto, etc .:

# 定义相关参数
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]

Recorre FRAME y llena la imagen de fondo con el avatar:

# 绘制爱心墙
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')

Supongo que te gusta

Origin blog.csdn.net/pythonxuexi123/article/details/112819554
Recomendado
Clasificación