利用requests模块爬取中央气象台网站的气象数据,用PySimpleGUI制作简单的交互页面。

目录

  • 一、对网站发送请求
  • 二、获取各类气象数据
  • 三、制作查询交互页面
  • 四、实现效果展示

一、对网站发送请求

以山西省太原市为例,对应页面网址如下:
http://www.nmc.cn/publish/forecast/ASX/taiyuan.html
而北京朝阳地区,对应页面网址如下:
http://www.nmc.cn/publish/forecast/ABJ/chaoyang.html
我们可以很轻易地发现其中地规律,想查询其他地区时,只要替换加粗部分即可。
获取url之后,就可对网址发送get请求,返回响应数据

url = 'http://www.nmc.cn/publish/forecast/A'+ province + '/' + city + '.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
page_data = requests.get(url=url, headers=headers)
page_data.encoding = 'utf-8'
page_code = page_data.text

二、获取各类气象数据

通过分析,网站将近七天的气象数据分别存放在七个div标签里,因此可以先将七个div标签里的内容保存到列表中,再遍历列表,获取详细数据

在单个div标签中,存放有各种气象数据,通过xpath路径即可提取对应数据。需要注意的时,一天的数据分为上午和下午两个部分,如果在下午查询当天的数据,那么上午的气象数据将为空。

对应代码如下:

tree = etree.HTML(page_code)
div_list = tree.xpath('//*[@id="day7"]/div')    # 获取数据所在<div> </div>
date_w = []
desc_m = []
windd_m = []
winds_m = []
high_tem = []
low_tem = []
desc_e = []
windd_e = []
winds_e = []
for div in div_list:        # 将各项数据定位,保存到对应列表中date_w_w = div.xpath('./div/div[1]/text()')[0]desc_m_w = div.xpath('./div/div[3]/text()')[0]windd_m_w = div.xpath('./div/div[4]/text()')[0]winds_m_w = div.xpath('./div/div[5]/text()')[0]high_tem_w = div.xpath('./div/div[6]/text()')[0]low_tem_w = div.xpath('./div/div[7]/text()')[0]desc_e_w = div.xpath('./div/div[9]/text()')[0]windd_e_w = div.xpath('./div/div[10]/text()')[0]winds_e_w = div.xpath('./div/div[11]/text()')[0]date_w.append(date_w_w)desc_m.append(desc_m_w)windd_m.append(windd_m_w)winds_m.append(winds_m_w)high_tem.append(high_tem_w)low_tem.append(low_tem_w)desc_e.append(desc_e_w)windd_e.append(windd_e_w)winds_e.append(winds_e_w)

三、制作查询交互页面

查询设计流程如下:
1.输入省市信息;
2.选择查询日期;
3.输出查询结果

程序完整代码如下:

import requests
from lxml import etree
import PySimpleGUI as sg
import datetime
# pypinyin库可以把汉字转拼音(未安装此库)
sg.theme('SystemDefaultForReal')    # 设置主题
province = sg.popup_get_text('输入查询省份大写首字母', keep_on_top=True)
city = sg.popup_get_text('输入查询城市拼音', keep_on_top=True)
url = 'http://www.nmc.cn/publish/forecast/A'+ province + '/' + city + '.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
page_data = requests.get(url=url, headers=headers)
page_data.encoding = 'utf-8'
page_code = page_data.text
# print(page_data)
tree = etree.HTML(page_code)
div_list = tree.xpath('//*[@id="day7"]/div')    # 获取数据所在<div> </div>
date_w = []
desc_m = []
windd_m = []
winds_m = []
high_tem = []
low_tem = []
desc_e = []
windd_e = []
winds_e = []
for div in div_list:        # 将各项数据定位,保存到对应列表中date_w_w = div.xpath('./div/div[1]/text()')[0]desc_m_w = div.xpath('./div/div[3]/text()')[0]windd_m_w = div.xpath('./div/div[4]/text()')[0]winds_m_w = div.xpath('./div/div[5]/text()')[0]high_tem_w = div.xpath('./div/div[6]/text()')[0]low_tem_w = div.xpath('./div/div[7]/text()')[0]desc_e_w = div.xpath('./div/div[9]/text()')[0]windd_e_w = div.xpath('./div/div[10]/text()')[0]winds_e_w = div.xpath('./div/div[11]/text()')[0]date_w.append(date_w_w)desc_m.append(desc_m_w)windd_m.append(windd_m_w)winds_m.append(winds_m_w)high_tem.append(high_tem_w)low_tem.append(low_tem_w)desc_e.append(desc_e_w)windd_e.append(windd_e_w)winds_e.append(winds_e_w)
date_re = []
for i in date_w:        # 删除日期列表中的空格,方便根据日期显示天气date_re.append(i.replace(' ', ''))
print(date_re)
print(desc_m)
print(windd_m)
print(winds_m)
print(high_tem)
print(low_tem)
print(desc_e)
print(windd_e)
print(winds_e)inquire_date = sg.popup_get_text('选择查询日期(支持未来七天):')  # GUI选择日期ti = datetime.datetime.now()
time_now = str(ti.month) + '月' + str(ti.day) + '日 ' + str(ti.hour) + '时' + str(ti.minute) + '分'
# 日期为今天时,上午和下午的日期显示有所区别(在下午5点以后,网站就不显示当天上午的天气了)
if inquire_date == date_re[0]:if ti.hour < 17:sg.popup('城市代码:'+ province + city,'查询时间' + str(time_now),'上午 天气:'+desc_m[0],'上午 风力:'+windd_m[0],'上午 风向:'+winds_m[0],'上午 气温:'+high_tem[0],'下午 气温:'+low_tem[0],'下午 天气:'+desc_e[0],'下午 风向:'+windd_e[0],'下午 风力:'+winds_e[0],font=('黑体',15),keep_on_top=True)else:sg.popup('城市代码:'+ province + city,'查询时间:'+str(time_now),'下午 气温:'+low_tem[0],'下午 天气:'+desc_e[0],'下午 风向:'+windd_e[0],'下午 风力:'+winds_e[0],font=('黑体',15),keep_on_top=True)
# 日期为其他天时
else:date_index = date_re.index(inquire_date)sg.popup('城市代码:'+ province + city,'查询日期:' + date_re[date_index],'上午 天气:' + desc_m[date_index],'上午 风力:' + windd_m[date_index],'上午 风向:' + winds_m[date_index],'上午 气温:' + high_tem[date_index],'下午 气温:' + low_tem[date_index],'下午 天气:' + desc_e[date_index],'下午 风向:' + windd_e[date_index],'下午 风力:' + winds_e[date_index],font=('黑体', 15),keep_on_top=True)

四、实现效果展示




【爬虫练习】天气预报查询相关推荐

  1. python小爬虫之天气查询

    python小爬虫之天气查询 刚开始研究爬虫,这个小程序通过抓取网页源代码,使用json解析实现了天气的查询. 1.需求分析 该博客实现了简单的天气查询功能,输入城市名称后可以查询出该城市的天气情况. ...

  2. 全国历史天气查询/历史天气预报查询——全国各月份数据爬取

    全国历史天气查询/历史天气预报查询--全国各月份数据爬取 效果 图1 目标爬取数据 图2 最终实验效果 实验效果:最终可将官网已有的数据进行爬取整理,共363个城市,从2011年1月--至今 数据已上 ...

  3. axis WebServices 完美调用天气预报,查询、显示 代码!

    axis WebServices 完美调用天气预报,查询.显示 代码! 效果: jsp页面: <%@ page language="java" import="ja ...

  4. Python天气预报查询

    功能: 实现城市天气预报查询,并提供未来四天查询 两个网站接口,直接返回数据,之后对数据进行读取和处理,很简单的小程序 效果图: 代码实现: import urllib.request import ...

  5. Delphi天气预报查询

    Delphi天气预报查询 现在的很多软件中都内置了天气查看这个功能!其实呢,这个功能的实现并不麻烦!会上网的人,都会查天气情况!其实那些内置天气预报功能的软件的天气预报功能也都是来源于网上!因为也没有 ...

  6. b站爬虫,用于查询主播舰队用户等级构成

    b站爬虫,用于查询主播舰队用户等级构成: 话不多说直接上代码 import urllib.request import re import os import timeclass marine:tot ...

  7. 免费天气预报查询 API、历史天气查询 API 接口使用示例【源码可用】

    天气预报查询 API.历史天气查询 API 接口使用示例[源码可用] 福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全 一.免费天气预报查询 API 通过城市 ...

  8. 【附源码】计算机毕业设计SSM天气预报查询管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. 天气预报查询数据接口、实时天气、24小时天气、未来24小时、7天/15天预报

    小编在此向大家介绍拥有105亿+调用量的产品,该接口文档清晰,对接方便,服务超好. 一.接口介绍 通过坐标区域.IP.地名.景点名称.电话区号或邮编等有效信息可查询天气情况(天气状况.湿度.天气图标. ...

  10. 新闻网站爬虫及结果查询

    新闻网站爬虫及结果查询 (一)nodejs+express搭建服务器 1.安装node.js Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/ 2 ...

最新文章

  1. Configure,Makefile.am, Makefile.in, Makefile文件之间关系
  2. 总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?
  3. JetBrains 2018 中国开发者生态报告:Java 最流行
  4. EXCEL实现时间戳格式和日期格互转
  5. python实现八皇后问题(百练OJ:2754:八皇后)
  6. 什么是 DDos 攻击
  7. f-GAN简介:GAN模型的生产车间
  8. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF
  9. java poi教程_Java完成POI的功能
  10. python如何把二进制转文本_在python3中如何把文本转换为二进制
  11. 震惊:selenium竟然不是自动化测试工具
  12. Linux 2.6 和安卓一样吗,Linux2.4和Linux2.6设备驱动的一些区别
  13. http之content-type
  14. Java测试Redis连通性
  15. 聊一聊数学中的基本定理(四)——微积分基本定理
  16. smartsvn.license
  17. 利用信息差赚美金?对!你没看错!
  18. 网站域名备案密码的获取方法
  19. FlashFXP,怎么使用flashfxp
  20. navicat 快捷键使用

热门文章

  1. 涉密计算机能用固态硬盘,质量不行数量来凑?RAID1能保护固态硬盘数据安全吗...
  2. Javacript中父节点、子节点、兄节点的简单用法[0306]
  3. 实验内容:实验六 数组冒泡排序
  4. css制作等腰三角形
  5. 中国矿业大学(北京)决策科学与大数据研究院揭牌
  6. 房企新的“生死线”:“两集中”会杀死谁?
  7. 优质嵌入式C程序总结
  8. 4.图形图像素材编辑
  9. 《马伯庸笑翻中国简史》
  10. 计算2的100万次幂