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中的文件和目录操作实现代码
Mar 13 Python
python中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
浅谈Python基础之I/O模型
May 11 Python
基于python生成器封装的协程类
Mar 20 Python
利用python开发app实战的方法
Jul 09 Python
python中安装django模块的方法
Mar 12 Python
Python无损压缩图片的示例代码
Aug 06 Python
Python利用命名空间解析XML文档
Aug 10 Python
Python request post上传文件常见要点
Nov 20 Python
python中PyQuery库用法分享
Jan 15 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
初识Laravel
2014/10/30 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
JavaScript的漂亮的代码片段
2013/06/05 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
Python实现二维数组输出为图片
2018/04/03 Python
django反向解析和正向解析的方式
2018/06/05 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
python中rc1什么意思
2020/06/19 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
物业电工岗位职责
2013/11/20 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
应届生求职信范文
2014/05/26 职场文书
保安辞职信范文
2015/02/28 职场文书
酒店员工管理制度
2015/08/05 职场文书
bat批处理之字符串操作的实现
2022/03/16 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS