python下载卫星云图合成gif的方法示例
Python下载中央气象台卫星云图后保存为gif并播放,大致步骤:
- 获取URL
- 下载图片
- 合成GIF
- 播放GIF
1.获取URL
1.1先下载一份网页源码看看网页结构
保存为:response.txt
#http库 importrequests #准备http请求头 headers={"user-agent":"firefox"} #中央气象台卫星云图网页 url='http://www.nmc.cn/publish/satellite/fy2.htm' #获取网页 r=requests.get(url,headers=headers) #改编码方式支持中文 r.encoding='utf-8' #保存为文本 withopen('response.txt','w',encoding='utf-8')asf: 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中搜索图片名称
发现有一处列出了动画的12张图片:可以看到12张图片的链接都在script字段中。
1.4过滤出script,找到所有url
使用html解析库解析出script,script的开头type="text/javascript"作为过滤条件,结果打印看看:
#html/xml解析库 fromlxmlimportetree #解析response html=etree.HTML(r.text) result=html.xpath('//script[@type="text/javascript"]/text()')[2] print(result)
打印结果如下,可以看到是多行字符串。
根据图片的链接规律,可以用正则匹配出来:
#正则库 importre urls=re.findall('/product.*.JPG',result) print(urls)
成功匹配出图片url。注意这里的url只有后半部分,根据之前的图片链接可知,实际图片url还需加上:http://image.mnc.cn。
1.5因此写获取图片URL函数
defgetpage(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) returnurls exceptExceptionase: print(e)
2.下载图片
拿到图片url的列表后,就是下载图片:
#url前缀 base_url='http://image.nmc.cn' defdlpic(urls): #定义一个文件名称收集列表 filenames=[] foriteminurls: r=requests.get(base_url+item,headers) #文件名就是用斜杠把字符串分隔,取走后后一个字符串 filename=item.split('/')[-1] filenames.append(filename) #保存图片 withopen('wxyt_pic\\'+filename,'wb')asf: f.write(r.content) print('已下载:'+item) #返回文件名称列表,用于合成gif returnfilenames
3.合成图片
#图片操作库 importimageio defmakegif(images): #创建空列表,把图片明反序 frames=[] images.reverse() #加载12张图片 foriteminimages: frames.append(imageio.imread('wxyt_pic\\'+item)) #合成1张gif imageio.mimsave('hecheng.gif',frames,'GIF',duration=1)
4.播放图片
defplaygif(seq=0): ifset==0: #播放12张合成好的gif animation=pyglet.resource.animation('hecheng.gif') else: pyglet.resource.path=['wxyt_pic'] la=os.listdir('wxyt_pic') images=[] forninla: 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 defon_draw(): windows.clear() sprite.draw() pyglet.app.run()
5.整体代码
importrequests fromlxmlimportetree importimageio importre importpyglet importos #在脚本同目录下,新建一个文件夹,存储当天12张图 defckdir(): ifos.path.exists('wxyt_pic')==False: os.mkdir('wxyt_pic') #获取图片url列表 defgetpage(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) returnurls exceptExceptionase: print(e) #下载图片 defdlpic(urls): filenames=[] foriteminurls: r=requests.get(base_url+item,headers) filename=item.split('/')[-1] filenames.append(filename) withopen('wxyt_pic\\'+filename,'wb')asf: f.write(r.content) print('已下载:'+item) returnfilenames #制作gif defmakegif(images): frames=[] images.reverse() foriteminimages: frames.append(imageio.imread('wxyt_pic\\'+item)) imageio.mimsave('hecheng.gif',frames,'GIF',duration=1) #播放gif defplaygif(seq=0): ifset==0: #播放12张合成好的gif animation=pyglet.resource.animation('hecheng.gif') else: pyglet.resource.path=['wxyt_pic'] la=os.listdir('wxyt_pic') images=[] forninla: 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 defon_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.最终效果
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。