0.说明

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

获取URL

下载图片

合成GIF

播放GIF

代码案例在:https://github.com/suchocolate/test/blob/master/spider/cloudpics

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 到网页查看图片链接

右键图片---查看元素

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

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中搜索图片名称

搜索:20200216091500000.JPG,可能搜索到多处。

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

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)

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

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

#正则库

import re

urls = re.findall('/product.*.JPG', result)

print(urls)

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

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):

# 创建空列表,把图片名反序。因为url列表里是倒时间序。

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.播放图片

# 播放gif的库

import pyglet

def playgif(seq=0):

# 如果为0,只播放当天12张图片

if set == 0:

# 播放12张合成好的gif作为动画

animation = pyglet.resource.animation('hecheng.gif')

# 如果为其他值,播放库里所有图片

else:

# 查询库里所有jpg

pyglet.resource.path = ['wxyt_pic']

la = os.listdir('wxyt_pic')

images = []

# 遍历jpg

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)

# pyglet库默认装饰器,用来播放动画

@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气象卫星云图解析_python下载卫星云图合成gif相关推荐

  1. python气象绘图速成_Python气象绘图Day-By-Day

    登录后查看更多精彩内容~ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 edwardli 于 2017-6-13 10:02 编辑 工作繁事多,先上结果供交流,回头不断细化. 我 ...

  2. python反转列表解析_Python语法糖之:列表解析、集合解析和字典解析

    ☆ Python的列表解析 (list comprehensions)是在Python 2.0以来一直都有的功能,特别简洁.实用.而字典解析虽然曾经在Python 2.3版本中引入过,但后来因为与di ...

  3. python程序代码解析_Python源码分析3 – 词法分析器PyTokenizer

    Introduction 上次我们分析了Python中执行程序可分为5个步骤: Tokenizer进行词法分析,把源程序分解为Token Parser根据Token创建CST CST被转换为AST A ...

  4. python气象数据可视化_python grib气象数据可视化

    利用Python语言实现Grib数据可视化主要依靠三个库--pygrib.numpy和matplotlib.pygrib是欧洲中期天气预报中心(ECMWF)的GRIG API C库的Python接口, ...

  5. python导入哨兵数据_Python 下载哨兵Sentinel数据(Sentinel-1~3)

    哨兵数据目前应用广泛,空间分辨.光谱分辨率都比较高.目前数据下载部分包括官网和Python程序下载. 其中哨兵1和2数据下载网上已经有非常详细的记录,链接如下:Python中使用sentinelsat ...

  6. python题目及解析_python知识点总结以及15道题的解析

    先看知识点总结 一.序列 操作符 x in s如果x是列表s的元素,返回True,否则False s + t连接两个序列s和t s*n或者n*s将序列s复制n次 s[i]返回s中第i元素 s[i:j] ...

  7. python函数实例解析_python支持返回函数的实例解析

    这篇文章主要介绍了python支持返回函数的实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近接触python,看到了python中返回函数的概念,以前只接触过 ...

  8. python命令行解析_python命令行解析函数

    sys.argv 在终端运行python 1.py hahah importsysprint(sys.argv) #['1.py', 'hahah'] argparse Python的命令行解析模块, ...

  9. python json数组解析_Python基础系列(一)搞懂json数据解析与字典之间的关系

    是不是一直傻傻分不清楚dumps.dump.loads和load的关系,长痛不如短痛,今天索性就把它写明白,不懂得朋友,请看下面. 这里我先回答一个很常见的问题,为什么 Python 会有四个操作 J ...

  10. python下的橡皮线_python下载吴恩达deep learning编程习题

    在cousera上注册deep learning后,可下载课后习题. 1.进入编程环境后,单击左上角的file-open,进入文件管理模式 2. 点击红圈文件夹进入根目录 3. 在根目录处右上角new ...

最新文章

  1. 报名 | 第三期医工结合系列研讨会:科研领域的知识产权保护
  2. 自由主义者的周一和周五
  3. @Async的异步任务多起来了,如何配置多个线程池来隔离任务?
  4. MapReduce编写实现wordcount词频统计
  5. 4k hidpi 黑苹果_【ITX小钢炮】黑苹果安装经验分享
  6. Android极光推送,Manifest merger failed with multiple errors, see logs
  7. 抢了个票,还以为发现了12306的系统BUG
  8. 基于GNS3的ssl配置
  9. linux sed面试题,【2021最新版】Linux面试题总结(48道题含答案解析)
  10. 解决php上传文件过程中Warning move_uploaded_file, failed to open stream的解决方案
  11. 删除dedecms友情链接中li标签的方法
  12. Winform 视频流叠加透明控件. 使用DSkin皮肤框架实现
  13. Matlab 仿真——直流电机速度控制(5)通过频域分析进行控制器设计
  14. 给Win10系统添加多个桌面两种操作方法
  15. 六年级小学生做的个人网站
  16. 被b站百大up主盯上了!
  17. 基于多线程的随机数生成算法
  18. java学生成绩管理系统类图,学生成绩管理系统的分析及设计-应用UML建模
  19. 【MapReduce】使用MapReduce实现PageRank算法
  20. Android 使用 MuMu模拟器 进行程序调试

热门文章

  1. Fiddler - The system proxy was changed. Click to reenable capturing.
  2. dvi黑屏解决方法_电视维修|电视机屏幕出现条纹该怎么解决?
  3. amazon alexa simple demo code for libcurl
  4. 六大云计算厂商南山论剑,收下这封英雄帖!
  5. 峰值利用率80%+,视频云离线转码自研上云TKE实践
  6. rhel7 卡在sda assuming drive cache write through不能进入操作系统的一个解决方案
  7. Linux python + selenium 以 kiosk模式打开Chrome浏览器 并 支持下载文件时询问下载路径
  8. 【LeetCode刷题】1619. 删除某些元素后的数组均值
  9. antv/G6和antv/X6
  10. [转帖]地理上的济南,是个怎样的城市?