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查询Mysql时返回字典结构的代码
Jun 18 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 Python
pandas 选择某几列的方法
Jul 03 Python
Python双向循环链表实现方法分析
Jul 30 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
python2和python3在处理字符串上的区别详解
May 29 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
详解Python多线程下的list
Jul 03 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 Python
python解决12306登录验证码的实现
Apr 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初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
ES6中class类用法实例浅析
2017/04/06 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
客户服务经理岗位职责
2014/01/29 职场文书
运动会通讯稿100字
2014/01/31 职场文书
《海底世界》教学反思
2014/04/16 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
Go遍历struct,map,slice的实现
2021/06/13 Golang
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS