拿着爬虫数据,搞事情啊!!

背景

接上篇使用Puppeteer轻松爬取网易云音乐、QQ音乐的精品歌单,没有看的能够看看,顺便给个当心心啊!html

上一篇咱们经过Puppeteer爬取了,网易云音乐和QQ音乐播放量超过1000W的歌单,为了更好的获取和分享歌单,此次咱们经过代码合成可以分享的图片。python

本次采用语言为:Python,NodeJS版本正在开发中,后续会分享出来。git

代码地址

项目完整代码地址:图片合成github

工具

  • python2.7:python 版本 2.7,其余版本也可,不过依赖库安装要做出相应修改
  • PIL:图片处理库,详细了解请移步文档
  • pathlib:目录地址库,主要处理文件的目录关系
  • requests:请求库,主要用来请求网络资源
  • qrcode:二维码生成库,主要用来生成二维码
  • 字体文件:自行下载可用的字体文件ttf

效果

先上两张效果图,来看一下。bash

网易云音乐歌单

QQ歌单

思路

先分析一下图片的主要点:网络

  • 须要一张背景图
  • 须要一个数据源,提供生成分享图的数据
  • 计算图片和文字的地址,生成文字
  • 生成相应类别的二维码
  • 粘贴二维码到背景的相应位置

准备工做

python环境python2.7

安装 python 运行环境,能够是 2.7 或者 3.* 版本,根据本身须要安装。工具

具体安装方法参考官网post

具体的每一个系统相关的安装教程,请自行百度,这里再也不赘述。学习

安装PIL库

安装用来处理图片的库 PIL。

具体安装方法和不一样系统以及 python 版本的相应安装命令,参阅官网

安装pathlib

安装路径相关的依赖库。

pip install pathlib
复制代码

安装requests

pip install requests
复制代码

安装qrcode

pip install qrcode
复制代码

下载依赖字体文件

字体文件为可选项,能够下载本身喜好的字体,实现自定义字体,也能够使用默认字体。

开工

首先分析一下咱们要干些什么。

  • 找一张背景图
  • 在图片上添加文字
  • 在图片上添加图片
  • 生成二维码图片
  • 把二维码贴到图片上

找一张合适的背景图

Unsplash 上找一张适合作背景的图片。

背景图

调整到合适的尺寸。

添加文字

经过 PIL 的方法,想图片上绘制文字。

def add_text(img, text, size, position, color="#9400D3"):
    draw = ImageDraw.Draw(img)
    # 设置字体为自定义字体
    font = ImageFont.truetype('MFJingYue.ttf', size)
    draw.text(position, text, fill=color, font=font, align="center")
复制代码

添加文字须要给定添加的位置,因此咱们还须要一个方法来肯定文字的位置。

# 获取文字的x坐标,主要用来设置歌单名称的位置,保证每行居中并不会太长
def get_x_position(len):
    max = 14
    x = 50 + (max - len) * 25 / 2
    return x
复制代码

番外话:为了简单,我直接在这里设置的字号为50,写死了,若是想要自定义的换能够多加一个参数,而后根据需求设置具体的位置

添加图片

经过 PIL 的方法能够直接把一张图片粘贴到另外一张图片上。

# 下边为例子
img_one = Image.open(pathlib.Path('one.jpg'));
img_two = Image.open(pathlib.Path('two.jpg'));
# 设置图片替换位置
box = (100, 50, 350, 300)
# 选取图片,并设置大小
region = img_one
region = region.resize((box[2] - box[0], box[3] - box[1]))
# 粘贴图片到相应位置
img_two.paste(region, box)
复制代码

生成二维码

经过 qrcode 库,咱们可以很容易的生成二维码,而后根据咱们数据的来源打上相应的 logo。

# 生成二维码
def make_qrcode(url, type):
    qr = qrcode.QRCode(
        version=5,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=8,
        border=3
    )
    qr.add_data(url)
    # qr.make(fit = True)
    img = qr.make_image()
    img = img.convert("RGBA")
    icon = None
    if type == 'netease':
        icon = Image.open(pathlib.Path('netease.png'))
    elif type == 'qq':
        icon = Image.open(pathlib.Path('qq.png'))
    img_w, img_h = img.size
    factor = 4
    size_w = int(img_w/factor)
    size_h = int(img_h/factor)
    
    icon_w, icon_h = icon.size
    if icon_w > size_w:
        icon_w = size_w
    if icon_h > size_h:
        icon_h = size_h
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
    
    w = int((img_w-icon_w)/2)
    h = int((img_h-icon_h)/2)
    img.paste(icon, (w,h), icon)
    # 最后返回图片对象
    return img
复制代码

粘贴二维码

生成的二维码为一个图片对象,咱们能够直接经过图片的粘贴方法,直接粘贴到相应的位置。

# 生成二维码地址
qrcode_img = make_qrcode(address, type)
# 粘贴到背景图上
box_qrcode = (300, 527, 425, 652)
print qrcode_img.size, qrcode_img.mode
# qrcode_img.save('./qrcode.png')
region_qrcode = qrcode_img
region_qrcode = region_qrcode.resize((box_qrcode[2] - box_qrcode[0], box_qrcode[3] - box_qrcode[1]))
background_img.paste(region_qrcode, box_qrcode)
复制代码

整理代码

最后把全部的功能整合成一个方法,而后经过参数,传入相对应的参数,就能生成一张可以用于分享的图片了。

# 合成分享图
def merge_img(img_src, name, count, address, author, type):
    save_name = './' + name + '.jpg'
    name = unicode(name, 'UTF-8')
    count = unicode("播放量:" + count, 'UTF-8')
    author = unicode("建立人:" + author, 'UTF-8')
    background_img = Image.open(pathlib.Path('background.jpg'))
    # 获取远程图片
    response = requests.get(img_src)
    img = Image.open(BytesIO(response.content))
    # 设置图片替换位置
    box = (100, 50, 350, 300)
    # 选取图片
    region = img
    region = region.resize((box[2] - box[0], box[3] - box[1]))
    # 粘贴到背景图上
    background_img.paste(region, box)
    # 添加名字
    name_len = len(name)
    if name_len <= 14:
        x = get_x_position(name_len)
        add_text(background_img, name, 25, (x, 330))
    else:
        name_one = name[0:14]
        print name_one
        add_text(background_img, name_one, 25, (50, 330))
        name_two = name[14:name_len]
        print name_two
        x = get_x_position(len(name_two))
        add_text(background_img, name_two, 25, (x, 370))
    # 添加建立者
    add_text(background_img, author, 20, (50, 560), color='white')
    # 添加播放数
    add_text(background_img, count, 20, (50, 600), color='white')
    # 生成二维码地址
    qrcode_img = make_qrcode(address, type)
    # 粘贴到背景图上
    box_qrcode = (300, 527, 425, 652)
    print qrcode_img.size, qrcode_img.mode
    # qrcode_img.save('./qrcode.png')
    region_qrcode = qrcode_img
    region_qrcode = region_qrcode.resize((box_qrcode[2] - box_qrcode[0], box_qrcode[3] - box_qrcode[1]))
    background_img.paste(region_qrcode, box_qrcode)
    # 保存图片
    background_img.save(save_name)
复制代码

测试

img_one = 'https://p.qpic.cn/music_cover/1Fr9IFMhWDPeUzWKVEjn3VLzce1PenAOaaImqzoibx2iaE5rhV0RwMYA/300?n=1'
img_two = 'http://p1.music.126.net/wpahk9cQCDtdzJPE52EzJQ==/109951163271025942.jpg?param=140y140'
address_one = 'https://y.qq.com/n/yqq/playsquare/2643652402.html#stat=y_new.playlist.pic_click'
address_two = 'https://music.163.com/#/playlist?id=2201879658'
name_one = '回头率最高的50首手机铃声'
name_two = '你的青春里有没有属于你的一首歌?'
merge_img(img_one, name_one, '4622.8万', address_one, author="Harry", type="qq")
merge_img(img_two, name_two, '2428万', address_two, author="mayuko然", type="netease")
复制代码

而后就生成了,开始咱们看到的两张图片了。

总结

对于图片的处理 PIL 十分强大,拥有不少方法可供使用,是一个不错的库。

经过简单的学习,可以根据思路生成不一样的分享图片,对于有强烈分享需求的接口来讲是个不错的尝试。

相关文章
相关标签/搜索