Python教你打军体拳

举报
技术火炬手 发表于 2019/08/02 09:40:19 2019/08/02
【摘要】 懵逼树上懵逼果,懵逼树下你和我…中午吃饭时候,看到朋友圈大家开始发建军节的内容,才猛地想起来,今天八月一啊!感觉一天活的浑浑噩噩的,都记不清日子了。由于最近在看《大王饶命》,搞得脑回路都有点奇特,突然就想起初中同学的一件趣事。他妈妈当时预产期是8月1号,由于提前检查了性别,知道是个男孩子,家里又是革命老兵出身,所以全家人都提前给他起好名字了叫张建军,结果7月31号的夜里生了他,全家人免不了一...

1.png

懵逼树上懵逼果,懵逼树下你和我…中午吃饭时候,看到朋友圈大家开始发建军节的内容,才猛地想起来,今天八月一啊!感觉一天活的浑浑噩噩的,都记不清日子了。由于最近在看《大王饶命》,搞得脑回路都有点奇特,突然就想起初中同学的一件趣事。他妈妈当时预产期是8月1号,由于提前检查了性别,知道是个男孩子,家里又是革命老兵出身,所以全家人都提前给他起好名字了叫张建军,结果7月31号的夜里生了他,全家人免不了一场尴尬…第一次听到同学说这个趣事就觉得好冷,然后一记就是十几年。更有趣的是,这个同学最后还真的上了炮兵学院,成了一名军人,哈哈。用大王饶命里面的一句对白,形容他家人当时迎接新生命的心情:”小朋友你好,很高兴见到你”。“不,你高兴的太早了” !

2.png

老张今天在朋友圈显摆自己当年参军时候的照片,得瑟的不行。看娃当年也是安分守己的好青年,现在留个大背头,看着就不像好人。想问他军校学的东西,现在还记得么,比如军体拳?想想今天不知道该写点什么,不如我们就来做一套军体拳动画,大家觉得如何!

3.png

找了半天,找到一个插图比较齐全的军体拳动作分解。一共有50多张图的分解动作,还起来还不错。

image.png

http://www.360doc.com这个网站大家都知道,和百度文库一个鸟样子,复制个文本,还得登录后才能复制,有没有一点奉献精神…文字都没得复制,更别说图片了。

image.png

那怎么办?软的不行来硬的,盘他呗!不就是几张图么,爬下来就完了啊…说到这里,顺嘴提一句,昨天爬抖音网页版,结果因为一些音乐的保存名称问题,反复下载了好几次,结果今天有些朋友想照着做一遍的时候,发现网站崩溃了,感觉有些罪过啊!

你还别说360doc这个网站还挺鸡贼的,刚开始下载图片,居然一直提示403 Forbidden!

看了下是免登录的网站啊,没有cookie啥的为啥会提示403 Forbidden呢,卡了半天发现必须要在headers中添加Referer才可以。网页分析和昨天爬抖音的链接没有太大区别在这里就不细讲了…最终下载56张军体拳分解动作图片:

image.png

4.png

图片下载下来了,光这么看有啥意思啊,要让这兄弟操练起来才对啊!那么我们该如何让这些图片动起来呢?其实很简单,使用from PIL import Image即可!但要注意一点,大家可以看到,13 14等几张图明显很窄,这样直接去合成的图片,根本没法看,所以在合成的同时,统一调整图片尺寸,代码如下:

def composite_gif(self):
   _images = []
   # 创建初始图片
   base_im = Image.open(images_list[0])
   # 获取图片尺寸
   _picture_size = base_im.size
   for file in images_list[1:]:
       im = Image.open(file)
       if im.size != _picture_size:
           # 调整尺寸
           im = im.resize(_picture_size)
       _images.append(im)
   gif = os.path.join(path, "juntiquan.gif")
   base_im.save(gif, save_all=True, loop=True, append_images=_images, duration=300)

简单说明下,我们先将第一张图片作为基础图例,并获取他的图片尺寸,之后所有的图片按照这个尺寸进行调整大小,把这些二进制的图片数据存储在一个list,当最后保存图片时,选择save_all = True, loop=True, append_images=_images几个参数,将图片全部保存,duration是图片间隔时长,单位是毫秒哦!

6.png

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/8/1 23:53
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : JunTiQuan.py

import os
import requests
from bs4 import BeautifulSoup
from PIL import Image


class JunTiQuan:
   def __init__(self):
       self.headers = {
           "Referer": url,
           'Connection': 'keep-alive',
           'user-agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
                          '(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')
       }
       self.path = self.image_path()
       self.images_list = list()

   @staticmethod
   def image_path():
       """
       获取代码执行目录,并在目录下创建Music文件夹
       :return 图片下载文件夹
       """

       base_dir = os.path.dirname(os.path.abspath(__file__))
       _path = os.path.join(base_dir, "Images")
       if not os.path.exists(_path):
           os.mkdir(_path)
       return _path

   def get_request(self, url):
       """
       封装requests.get方法
       如果为网页请求,返回网页内容
       否则,解析图片地址,并返回图片二进制内容
       :param url: 请求url(分网页、图片两类)
       :return: 网页内容 & 图片二进制文件
       """

       r = requests.get(url, headers=self.headers, timeout=5)
       if url.endswith('html'):
           return r.text
       else:
           return r.content

   def download_images(self, html):
       """
       解析军体拳图片
       :param html: 网页内容
       """

       soup = BeautifulSoup(html, 'lxml')
       # 根据关键字onclick查找每个下载地址
       for num, img in enumerate(soup.findAll('img', attrs={'fcksavedurl': True}), start=1):
           img_bytes = self.get_request(img['src'])
           image_name = '{}.png'.format(num)
           _full_name = os.path.join(self.path, image_name)
           self.images_list.append(_full_name)
           with open(_full_name, 'wb') as f:
               f.write(img_bytes)
           print("已下载 {}".format(image_name))

   def composite_gif(self):
       _images = []
       # 创建初始图片
       base_im = Image.open(self.images_list[0])
       # 获取图片尺寸
       _picture_size = base_im.size
       for file in self.images_list[1:]:
           im = Image.open(file)
           if im.size != _picture_size:
               # 调整尺寸
               im = im.resize(_picture_size)
           _images.append(im)
       gif = os.path.join(self.path, "juntiquan.gif")
       base_im.save(gif, save_all=True, loop=True, append_images=_images, duration=300)

   def run(self):
       html = self.get_request(url)
       self.download_images(html)
       self.composite_gif()


if __name__ == '__main__':
   url = 'http://www.360doc.com/content/16/0601/13/33121396_564170382.shtml'
   main = JunTiQuan()
   main.run()

7.png

来一起看看最终生成的动图效果吧:

640.gif

小伙子打得不错啊,明天我是不是要@一下老张,让他给我们录个军体拳的视频,看看是不是真材实料,哈哈。

8.png

OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。

期待你关注我的公众号清风Python,如果觉得不错,希望能动动手指转发给你身边的朋友们。

希望每周一至五清晨的7点10分,都能让清风Python的知识文章叫醒大家!谢谢……

-----------------

本文转自王翔|清风Python

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。