python下载卫星云图合成gif的方法示例


Posted in Python onFebruary 18, 2020

Python下载中央气象台卫星云图后保存为gif并播放,大致步骤:

  • 获取URL
  • 下载图片
  • 合成GIF
  • 播放GIF

1.获取URL

1.1 先下载一份网页源码看看网页结构

保存为:response.txt

#http库
import requests
 
#准备http请求头
headers = {"user-agent": "firefox"}
#中央气象台卫星云图网页
url = 'http://www.nmc.cn/publish/satellite/fy2.htm'
#获取网页
r = requests.get(url, headers=headers)
#改编码方式支持中文
r.encoding='utf-8'
#保存为文本
with open('response.txt','w', encoding='utf-8') as f:
 f.write(r.text)

1.2 到网页查看图片链接

右键图片---查看元素

python下载卫星云图合成gif的方法示例

图片链接如下:可以看到图片链接的域名和网页域名不同。

src=http://image.nmc.cn/product/2020/02/16/WXCL/medium/SEVP_NSMC_WXCL_ASC_E99_ACHN_LNO_PY_20200216091500000.JPG?v=1581844610745

1.3 在网页码源response.txt中搜索图片名称

发现有一处列出了动画的12张图片:可以看到12张图片的链接都在script字段中。

python下载卫星云图合成gif的方法示例

1.4 过滤出script,找到所有url

使用html解析库解析出script,script的开头type="text/javascript"作为过滤条件,结果打印看看:

#html/xml解析库
from lxml import etree
 
#解析response
html = etree.HTML(r.text)
result = html.xpath('//script[@type="text/javascript"]/text()')[2]
print(result)

打印结果如下,可以看到是多行字符串。

python下载卫星云图合成gif的方法示例

根据图片的链接规律,可以用正则匹配出来:

#正则库
import re
 
urls = re.findall('/product.*.JPG', result)
print(urls)

成功匹配出图片url。注意这里的url只有后半部分,根据之前的图片链接可知,实际图片url还需加上:http://image.mnc.cn。

python下载卫星云图合成gif的方法示例

1.5 因此写获取图片URL函数

def getpage(page):
 try:
  r = requests.get(page, headers=headers)
  html = etree.HTML(r.text)
  result = html.xpath('//script[@type="text/javascript"]/text()')[2]
  urls = re.findall('/product.*.JPG', result)
  return urls
 except Exception as e:
  print(e)

2.下载图片

拿到图片url的列表后,就是下载图片:

#url前缀
base_url = 'http://image.nmc.cn'
def dlpic(urls):
 # 定义一个文件名称收集列表
 filenames = []
 for item in urls:
  r = requests.get(base_url + item, headers)
  #文件名就是用斜杠把字符串分隔,取走后后一个字符串
  filename = item.split('/')[-1]
  filenames.append(filename)
  #保存图片
  with open('wxyt_pic\\' + filename, 'wb') as f:
   f.write(r.content)
  print('已下载:'+item)
 #返回文件名称列表,用于合成gif
 return filenames

3.合成图片

# 图片操作库
import imageio
 
def makegif(images):
 # 创建空列表,把图片明反序
 frames = []
 images.reverse()
 # 加载12张图片
 for item in images:
  frames.append(imageio.imread('wxyt_pic\\'+item))
 # 合成1张gif
 imageio.mimsave('hecheng.gif', frames, 'GIF', duration=1)

4.播放图片

def playgif(seq=0):
 if set == 0:
  #播放12张合成好的gif
  animation = pyglet.resource.animation('hecheng.gif')
 else:
  pyglet.resource.path = ['wxyt_pic']
  la = os.listdir('wxyt_pic')
  images = []
  for n in la:
   images.append(pyglet.resource.image(n))
  #播放库存中的所有照片
  animation = pyglet.image.Animation.from_image_sequence(images, period=0.5, loop=True)
 #显示动画
 sprite = pyglet.sprite.Sprite(animation)
 windows = pyglet.window.Window(width=sprite.width, height=sprite.height)
 @windows.event
 def on_draw():
  windows.clear()
  sprite.draw()
 pyglet.app.run()

5.整体代码

import requests
from lxml import etree
import imageio
import re
import pyglet
import os
 
 
# 在脚本同目录下,新建一个文件夹,存储当天12张图
def ckdir():
 if os.path.exists('wxyt_pic') == False:
  os.mkdir('wxyt_pic')
 
 
# 获取图片url列表
def getpage(page):
 try:
  r = requests.get(page, headers=headers)
  html = etree.HTML(r.text)
  result = html.xpath('//script[@type="text/javascript"]/text()')[2]
  urls = re.findall('/product.*.JPG', result)
  return urls
 except Exception as e:
  print(e)
 
 
# 下载图片
def dlpic(urls):
 filenames = []
 for item in urls:
  r = requests.get(base_url + item, headers)
  filename = item.split('/')[-1]
  filenames.append(filename)
  with open('wxyt_pic\\' + filename, 'wb') as f:
   f.write(r.content)
  print('已下载:'+item)
 return filenames
 
 
# 制作gif
def makegif(images):
 frames = []
 images.reverse()
 for item in images:
  frames.append(imageio.imread('wxyt_pic\\'+item))
 imageio.mimsave('hecheng.gif', frames, 'GIF', duration=1)
 
 
# 播放gif
def playgif(seq=0):
 if set == 0:
  #播放12张合成好的gif
  animation = pyglet.resource.animation('hecheng.gif')
 else:
  pyglet.resource.path = ['wxyt_pic']
  la = os.listdir('wxyt_pic')
  images = []
  for n in la:
   images.append(pyglet.resource.image(n))
  #播放库存中的所有照片
  animation = pyglet.image.Animation.from_image_sequence(images, period=0.5, loop=True)
 #显示动画
 sprite = pyglet.sprite.Sprite(animation)
 windows = pyglet.window.Window(width=sprite.width, height=sprite.height)
 @windows.event
 def on_draw():
  windows.clear()
  sprite.draw()
 pyglet.app.run()
 
 
# init
if __name__ == '__main__':
 base_url = 'http://image.nmc.cn'
 page = 'http://www.nmc.cn/publish/satellite/fy2.htm'
 headers = {"user-agent": "firefox"}
 ckdir()
 urls = getpage(page)
 images = dlpic(urls)
 makegif(images)
 # 0只播放今天12张,1播放库存里所有照片
 playgif(1)

6.最终效果

python下载卫星云图合成gif的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
以一段代码为实例快速入门Python2.7
Mar 31 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
python批量修改文件编码格式的方法
May 31 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
Python使用for生成列表实现过程解析
Sep 22 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
如何使用python传入不确定个数参数
Feb 18 #Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 #Python
通过python连接Linux命令行代码实例
Feb 18 #Python
Python日志syslog使用原理详解
Feb 18 #Python
Pytorch中.new()的作用详解
Feb 18 #Python
Pytorch maxpool的ceil_mode用法
Feb 18 #Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 #Python
You might like
制作美丽的拉花
2021/03/03 冲泡冲煮
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
PHP扩展开发入门教程
2015/02/26 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
js选项卡的制作方法
2017/01/23 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Python之列表的插入&替换修改方法
2018/06/28 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
Python shutil模块用法实例分析
2019/10/02 Python
德国PC硬件网站:CASEKING
2016/10/20 全球购物
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
护理医院见习报告
2014/11/03 职场文书
商业门面租房协议书
2014/11/25 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android