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实现linux服务器批量修改密码并生成execl
Apr 22 Python
详细解读Python中的__init__()方法
May 02 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
python最长回文串算法
Jun 04 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
对python产生随机的二维数组实例详解
Dec 13 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
python英语单词测试小程序代码实例
Sep 09 Python
浅析python中while循环和for循环
Nov 19 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 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
php基础知识:类与对象(1)
2006/12/13 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jQuery each()小议
2010/03/18 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
构建Python包的五个简单准则简介
2015/06/15 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
详解python logging日志传输
2020/07/01 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
前台文员个人求职信范文
2014/01/05 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
端午节活动总结
2014/08/26 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
Python各协议下socket黏包问题原理
2022/04/12 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python