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 时间操作例子和时间格式化参数小结
Apr 24 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
selenium+python环境配置教程详解
May 28 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
简单介绍python封装的基本知识
Aug 10 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
Python下载的11种姿势(小结)
Nov 18 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
php中全局变量global的使用演示代码
2011/05/18 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
JQuery AJAX 中文乱码问题解决
2013/06/05 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
Python网络编程 Python套接字编程
2017/09/13 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
Python通过socketserver处理多个链接
2020/03/18 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
2014年向国旗敬礼活动方案
2014/09/27 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
治庸问责工作总结
2015/08/11 职场文书