Python代码优化(1):天气预报获取

天气预报获取模块

基于http://www.weather.com.cn/做了代码优化,每个函数功能更加明确,更加适合单独集成。接口也进行了优化,比网络上博主抄来抄去的源码要好一些。

改进点:获取天气拆成了多个函数,多次保存csv文件不再出现标题栏重写的情况。

天气获取模块

1.1 依赖表

包名含义安装方式
系统包
os
csv
json
第三方依赖
requests爬虫模块
bs4.BeautifulSoup网页解析对象
bs4.element.Tag网页标签对象

1.2 全局变量表

变量名含义初值

1.3 函数

函数名含义是否接口
get_html_text请求网页内容,无代理无head模式
get_today_weather获取当天天气
get_1_7_weather获取当周天气
get_today_and_week获取当周和当天的天气
get_8_14_weather获取下一周天气
write_to_csv保存文件模块

1.4 接口函数

函数名含义
get_two_weak_weather获取两周天气
入参含义类型
city_code城市代码字符串
出参
None

1.5 代码

# weather.py
import os
import csv
import jsonimport requests
from bs4 import BeautifulSoup
from bs4.element import Tagdef get_html_text(url):"""请求获得网页内容"""try:r = requests.get(url, timeout=30)r.raise_for_status()r.encoding = r.apparent_encodingprint("成功访问")return r.textexcept Exception as e:print(e)print("访问错误")return " "def get_today_weather(body_tag: Tag):td_wea_list = []  # 存放当天的数据,listcount = 0def get_today_json(_tag: Tag):# 获取今日数据的scriptweather_div = _tag.find_all('div', {'class': 'left-div'})observe24h_data = weather_div[2].find('script').string# 将 script 数据改变成为 json 数据 (移除 var data=)begin_index = observe24h_data.index('=') + 1end_index = -2observe24h_data = observe24h_data[begin_index: end_index]observe24h_json = json.loads(observe24h_data)t_json = observe24h_json['od']['od2']# 补充空气质量if t_json[0]['od28'] == "":t_json[0]['od28'] = t_json[1]['od28']return t_jsontoday_json = get_today_json(body_tag)for i in today_json:od_wea_list = []if count <= 23:od_wea_list.append(i['od21'])  # 添加时间od_wea_list.append(i['od22'])  # 添加当前时刻温度od_wea_list.append(i['od24'])  # 添加当前时刻风力方向od_wea_list.append(i['od25'])  # 添加当前时刻风级od_wea_list.append(i['od26'])  # 添加当前时刻降水量od_wea_list.append(i['od27'])  # 添加当前时刻相对湿度od_wea_list.append(i['od28'])  # 添加当前时刻空气质量print(od_wea_list)td_wea_list.append(od_wea_list)count = count + 1print(td_wea_list)return td_wea_listdef get_1_7_weather(body_tag: Tag):week_wea_list = list()  # 初始化一个列表保存数据,返回值# 解析7天的数据, body -> div -> ul -> uidata = body_tag.find('div', {'id': '7d'})ul = data.find_all('ul')[0]li = ul.find_all('li')for day in li:  # 遍历找到的每一个li# 临时存放每天的数据od_wea_list = list()# 获取日期date = day.find('h1').stringdate = date[0:date.index('日')]od_wea_list.append(date)# 找出li下面的p标签,有三个p标签,分别为天气,气温,风向inf = day.find_all('p')# 提取第一个p标签的值,即天气od_wea_list.append(inf[0].string)# 提取第二个p标签的值,最高气温和最低气温if inf[1].find('i') is None:tem_low = Noneelse:tem_low = inf[1].find('i').string  # 找到最低气温if inf[1].find('span') is None:  # 天气预报可能没有最高气温tem_high = Noneelse:tem_high = inf[1].find('span').string  # 找到最高气温if tem_low[-1] == '℃':od_wea_list.append(tem_low[:-1])else:od_wea_list.append(tem_low)if tem_high[-1] == '℃':od_wea_list.append(tem_high[:-1])else:od_wea_list.append(tem_high)# 提取第三个p标签的值,初始风向和转风向,风级wind = inf[2].find_all('span')  # 找到风向for j in wind:od_wea_list.append(j['title'])wind_scale = inf[2].find('i').string  # 找到风级index1 = wind_scale.index('级')od_wea_list.append(int(wind_scale[index1 - 1:index1]))# 添加日志week_wea_list.append(od_wea_list)# print(week_wea_list)return week_wea_listdef get_today_and_week(html: str):"""处理得到有用信息保存数据文件"""bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象body = bs.body# 获取当天数据td_wea_list = get_today_weather(body)# 获取七天内的数据week_wea_list = get_1_7_weather(body)return td_wea_list, week_wea_listdef get_8_14_weather(html):week_wea_list = []i = 0  # 控制爬取的天数bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象body = bs.bodydata = body.find('div', {'id': '15d'})  # 找到div标签且id = 15dul = data.find('ul')  # 找到所有的ul标签li = ul.find_all('li')  # 找到左右的li标签for day in li:  # 遍历找到的每一个liif i < 7:od_wea_list = list()# 获取日期date = day.find('span', {'class': 'time'}).string  # 得到日期date = date[date.index('(') + 1:-2]  # 取出日期号od_wea_list.append(date)# 获取天气weather = day.find('span', {'class': 'wea'}).string  # 找到天气print(day.find('span', {'class': 'wea'}).string)print(day.find('span', {'class': 'wea'}).text)od_wea_list.append(weather)# 获取温度tem = day.find('span', {'class': 'tem'}).text  # 找到温度print(tem)od_wea_list.append(tem[tem.index('/') + 1:-1])  # 找到最低气温od_wea_list.append(tem[:tem.index('/') - 1])  # 找到最高气温# 获取风向和风级wind = day.find('span', {'class': 'wind'}).string  # 找到风向if '转' in wind:  # 如果有风向变化od_wea_list.append(wind[:wind.index('转')])od_wea_list.append(wind[wind.index('转') + 1:])else:  # 如果没有风向变化,前后风向一致od_wea_list.append(wind)od_wea_list.append(wind)wind_scale = day.find('span', {'class': 'wind1'}).string  # 找到风级index1 = wind_scale.index('级')od_wea_list.append(int(wind_scale[index1 - 1:index1]))week_wea_list.append(od_wea_list)return week_wea_listdef write_to_csv(file_name, data, day=14):"""保存为csv文件"""if not os.path.exists(file_name):with open(file_name, 'w', errors='ignore', newline='') as f:if day == 14:header = ['日期', '天气', '最低气温', '最高气温', '风向1', '风向2', '风级']else:header = ['小时', '温度', '风力方向', '风级', '降水量', '相对湿度', '空气质量']f_csv = csv.writer(f)f_csv.writerow(header)f_csv.writerows(data)else:with open(file_name, 'a', errors='ignore', newline='') as f:f_csv = csv.writer(f)f_csv.writerows(data)def get_two_weak_weather(city_code: str):url_head = "http://www.weather.com.cn/weather"url_1_7 = "".join([url_head, "/", city_code, ".shtml"])url_8_14 = "".join([url_head, "15d", "/", city_code, ".shtml"])html_1_7 = get_html_text(url_1_7)data1, data1_7 = get_today_and_week(html_1_7)html8_14 = get_html_text(url_8_14)data8_14 = get_8_14_weather(html8_14)data14 = data1_7 + data8_14write_to_csv('weather14.csv', data14, 14)  # 保存为csv文件write_to_csv('weather1.csv', data1, 1)if __name__ == '__main__':get_two_weak_weather("101280701")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

proxy_pool开源项目攻克学习

开源项目攻克学习之proxy_pool 1. 学习背景 爬虫线程池&#xff0c;但是网络上付费的又很麻烦&#xff0c;于是在开源网站上找到一个版本进行学习。 https://github.com/jhao104/proxy_pool 本人操作系统deepin&#xff0c;有遇到一些问题&#xff0c;希望可以跟大家分享一…

pip 指定镜像源 指定版本 批量安装

要用 pip 安装指定版本的 Python 包&#xff0c;只需通过 操作符 指定 例如&#xff1a;pip install pycrypto2.6.1 将安装pycrypto2.6.1 版本。 要使用pip 批量安装&#xff0c;需要写requirements.txt文件&#xff0c;一行一个包 numpy matplotlib wxpypip install -r r…

Linux命令行下统计当前文件夹下的文件个数

统计某文件夹下文件的个数 ls -l |grep “^-”|wc -l 统计某文件夹下目录的个数 ls -l |grep “^&#xff44;”|wc -l 统计文件夹下文件的个数&#xff0c;包括子文件夹里的。 ls -lR|grep “^-”|wc -l 统计文件夹下目录的个数&#xff0c;包括子文件夹里的。 ls -lR|…

proxy_pool开源项目攻克学习2:服务器架设

proxy_pool开源项目攻克学习2&#xff1a;服务器架设 在这个文章proxy_pool开源项目攻克学习中&#xff0c;我们完成了本地的proxy_pool架设。现在我们将他转移到服务器上。 硬件环境准备 腾讯centos服务器。 软件环境准备 redispython3.7proxy_pool开源项目 安装过程 总…

python opencv安装

opencv安装 pip install opencv-python依赖安装 # libglvnd-1:1.3.2-1.tl3.x86_64 # libglvnd-glx-1:1.3.2-1.tl3.x86_64 # libxshmfence-1.3-2.tl3.x86_64 # mesa-libGL-20.3.3-2.tl3.x86_64 # mesa-libglapi-20.3.3-2.tl3.x86_64yum install libGL

nodejs轻量服务器后端

nodejs轻量服务器后端 搭建思路 server.js主函数 mine.js配置文件 index.html 测试网页 目录结构 __./|__ test1|__ index.html|__ mine.js|__ server.jsserver.js文件 var PORT 8080; //端口 var DIR test1; //用于存放html的目录var http require(http);…

[Leetcode713]乘积小于 K 的子数组

公司里偷偷刷题记录 做一下笔记 求解子数组方式&#xff1a; 两种方案&#xff1a; 通用方案就是前缀和查找 另一种是递增序列可用的滑动窗口 有些题目如果给出来的数字有正&#xff0c;负。那么一定就要转化成前缀和。 如果是全正数组&#xff0c;可以采用前缀和二分查找的…

[Leetcode15]三数之和

重刷一遍相向双指针 题目 leetcode15 https://leetcode.cn/problems/3sum/ 类似的题目还有leetcode16 leetcode16 解答思路 关键点 快排 双指针 1&#xff1a; 快速排序&#xff0c;之后使用双指针遍历对应的位置&#xff0c;求解 2&#xff1a; 主要是在确定了第一个值…

光学元件生产工艺流程

光学元件生产工艺流程 选胚料 – 开料(初步切割)- 清洗 - 上盘(批处理) – 切割 – 粗磨整平 – 粗检 – 细磨上盘 – 细磨 – 高速抛光 – 低速抛光 – 光胶 – 成片 – 上盘 – 成品切割 – 清洗 – 包装 粗磨阶段 选胚料: 选择光学元件的原材料,如K9,BK7玻璃等 开…

[leetcode933]最近的请求次数

每日偷偷刷题933和队列有关 思路 每来一次ping就记录时间&#xff0c;并返回3000s内ping的次数&#xff0c;本题数据量很大&#xff0c;正向暴力肯定是不行的。 初步思路&#xff1a;反向暴力&#xff0c;不删列表数据。从ping的下标往前推&#xff0c;并统计3000s的数据。 …

[leetcode]5. 最长回文子串 647. 回文子串

昨日刷题&#xff0c;今日补发 解题思路 中间扩展&#xff0c;遍历数组&#xff0c;以每一项为中心&#xff0c;或以每两项为中心&#xff0c;向外拓展。 学习一下pair概念&#xff0c;还有string的substr的用法 以下是leetcode第五题 C做法 class Solution { public:pair…

牛客网选择题刷题记录之C++

数据结构 顺序表 在一个长度为n的顺序表的任意位置插入一个新元素的渐进时间复杂度为&#xff08;&#xff09; A. O&#xff08;n&#xff09; B. O&#xff08;n/2&#xff09; C. O&#xff08;1&#xff09; D. O&#xff08;n的平方&#xff09; 答案&#xff1a; A 解析…

[剑指offer 24] 反转链表

题目复习反转链表 字节面试的一道面试考题。属于简单题&#xff0c;毕竟复杂的面试也不好判题对吧&#xff08;狗头&#xff09; 思路 思路不难&#xff0c;首先我们观察链表&#xff0c;一般链表指的都是单向链表 struct ListNode {int val;struct ListNode *next; };那么…

[剑指offer 27][LeetCode234] 回文链表

偷偷刷题记录 回文链表 思路 思路1. 处理链表最粗暴的方式就是拷贝到数组中。考试时候也是&#xff0c;只要不会超内存&#xff0c;完全这么办 思路2. 快慢指针。因为我们判断是不是回文链表&#xff0c;回文的特性就是以中为界&#xff0c;两头对称。由于我们不能像使用数组…

牛客网选择题刷题记录之Linux系统

linux运维 linux指令 下面有关linux查看系统负载的命令&#xff0c;说法错误的是&#xff1f; A. uptime命令主要用于获取主机运行时间和查询linux系统负载等信息 B. vmstat命令可以查看查看cpu负载 C. sar -n命令可以查看网络接口信息 D. free命令可以查看磁盘负载情况 答案&…

Keil_uvision_4基本使用教程

前言&#xff1a; keil uvision 5 和 4 使用方式差不多 Keil_uvision_4基本使用教程 Keil C51 V9.00 即09年发布的最新版本uVision 4&#xff0c;版本外观改变比较大 可以使用以前的注册文件如果全新安装&#xff0c;在VISTA或者WIN 7系统下…

MySQL语法看这一篇就够啦

MySQL语法看这一篇就够啦1. MySQL介绍与登录1.1 MySQL介绍1.2 Mariadb安装与启动1.2.1 在centos7环境下安装启动登录数据库操作部分增删改查&#xff1a;增 CREATE DATABASE增删改查&#xff1a;删 DROP增删改查&#xff1a;查找数据库 SHOW DATABASE使用数据库&#xff1a;use…

Python数据库:嵌入式MySQL

Python数据库&#xff1a;嵌入式MySQLPython访问MySQL的库函数PyMySQL安装PyMySQL快速上手以及代码上下文PyMySQL常见语法1. 导包2.连接数据库 connect3. 创建访问对象 cursor4. 下达命令 cursor.execute5. 接收结果 cursor.fetch*6.事务的用法7. 关闭mysql链接 closePython访问…

部门名称部门结构叠用_金属结构分公司三部门联合开展工会小组活动

为丰富职工的业余生活&#xff0c;营造轻松欢乐的氛围&#xff0c;增强部门间交流沟通&#xff0c;舒缓职工工作压力&#xff0c;在金属结构分公司工会的支持下&#xff0c;9月12日&#xff0c;分公司工程管理部、安全监管部和综合办公室联合开展工会小组活动&#xff0c;分公司…

linux环境下安装Java运行Java

Linux环境下安装与运行Java一. Linux环境下安装Java环境——最最最简单粗暴的教程二. Linux下编译Java代码---javac和java命令的使用2.1 编译单个java文件2.2 编译多个Java文件&#xff0c;每个类都在一个包中2.3 不同包编译一. Linux环境下安装Java环境——最最最简单粗暴的教…