用Python做一个网站,照片生成漫画头像,有这个网站就够了。

Python015

用Python做一个网站,照片生成漫画头像,有这个网站就够了。,第1张

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

对于动漫,大家一定都不陌生,我周围的不少单身码农都是动漫迷。我也是一个资深动漫迷,动漫里面有好多漂亮的小姐姐,比如斗破苍穹的美杜莎,云韵,萧薰儿,天行九歌里面紫女,焰灵姬。当然女孩也有自己的动漫情怀,部门里面还有小姐姐喜欢cosplay呢~~

于是乎我想既然Python无所不能,不如用Python做一个小程序帮小姐姐的头像转成漫画,以后也可以搭讪一下部门的小姐姐,吹嘘一把!哈哈,想想都幸福,于是熬了一夜,总于完成了这个小程序。

1

首先,我们来看一下,漫画和我们的照片的区别,如下图所示:

2

图片转漫画——减少色彩

图片转漫画——减少色彩

有了上述的两个细节的描述,我们接下来的程序,也将围绕着这两点进行展开。

其对应的程序入下图所示:

上述程序中,我们需要注意的一点就是对于输入的图片我们必须要调整图片尺寸为4的整数倍,因为在金字塔下采样的过程中,图片会默认降到原先尺寸的1/4大小,如果无法除尽的话,程序会自动向上取整,这样的话,我们上采样之后,模糊的图片和最初输入的图片在分辨率上会有些许的差别,这样会使后面的程序保存。

3

完成了上面几步之后,我们接着要进行增强轮廓了。我们的程序如下图所示:

上述的程序中,我们利用opencv的自适应阈值函数来分割轮廓,然后将我们的轮廓图片和模糊后的图片按照轮廓图片的数值进行与操作,最终得到我们的漫画图片。

以上便是程序的核心部分,接下来我们用Python里面的著名框架flask程序做一个简单额网站页面。

4

对于flask程序,想必大家或多或少都有一定的了解,我们所使用的flask程序非常简单,我简单的说一下思路和步骤:

然后,我们先打开Instagram网站,确认能打开就表明正常翻墙。由于本期主要爬取图片,所以特意选取了一个美女的Instagram为例子,尺度不高,我们打开Chrome F12的调试功能,点选中Network Tab页。

个人首页

按照惯例,首先检查index页面的HTML文件中是否存在图片链接。

缩略图

这里我们复制class = _mck9w _gvoze _f2mse的字符串去Source Tab页下查找,发现并没有结果,将之拷贝出来,发现里面的内容都是动态生成的。

Source页面下的首页HTML

这就不得不怀疑,是不是所有的数据都以其他形式放在首页HTML文件中,或者通过Ajax异步请求过来。我们从Network中随便拷贝一张图片的链接,如下,然后放到HTML文件中搜索,结果出现了。

notepad++中搜索出了3条记录

搜索记录过程中,我们发现了一个惊喜的地方,那就是被script包裹在里面的windows._shareData,图片的链接就在里面,难得可贵的就是数据格式还是json格式的,我们单独提取出来format一下。

json数据块

真正的图片URL就在nodes数据中,这可是个极大的好消息。

代码

# -*- coding: utf-8 -*-

import json

from lxml import etree

import requests

import click

headers = {

"Origin": "https://www.instagram.com/",

"Referer": "https://www.instagram.com/_8_jjini/",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0Win64x64) AppleWebKit/537.36 (KHTML, like Gecko) "

"Chrome/58.0.3029.110 Safari/537.36",

"Host": "www.instagram.com",

"accept": "text/html,application/xhtml+xml,application/xmlq=0.9,image/webp,*/*q=0.8",

"accept-encoding": "gzip, deflate, sdch, br",

"accept-language": "zh-CN,zhq=0.8",

"X-Instragram-AJAX": "1",

"X-Requested-With": "XMLHttpRequest",

"Upgrade-Insecure-Requests": "1",

}

BASE_URL = "https://www.instagram.com/_8_jjini/"

proxy = {

'http': 'http://127.0.0.1:38251',

'https': 'http://127.0.0.1:38251'

}

def crawl():

click.echo('start')

try:

res = requests.get(BASE_URL, headers=headers, proxies=proxy)

html = etree.HTML(res.content.decode())

all_a_tags = html.xpath('//script[@type="text/javascript"]/text()')

for a_tag in all_a_tags:

if a_tag.strip().startswith('window'):

data = a_tag.split('= {')[1][:-1] # 获取json数据块

js_data = json.loads('{' + data, encoding='utf-8')

edges = js_data["entry_data"]["ProfilePage"][0]["graphql"]["user"]["edge_owner_to_timeline_media"]["edges"]

for edge in edges:

if top_url and top_url == edge["node"]["display_url"]:

in_top_url_flag = True

break

click.echo(edge["node"]["display_url"])

new_imgs_url.append(edge["node"]["display_url"])

click.echo('ok')

except Exception as e:

raise e

if __name__ == '__main__':

crawl()

作者:浅浅的笑意

链接:https://www.jianshu.com/p/985c2b4e8f6c

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。