Python爬取城市天气信息,并存储到csv文件中

1.爬取的网址为:天气网 (weather.com.cn)

2.需要建立Weather.txt文件,并在里面加入如下形式的字段:

101120701=济宁
101010100=北京

3.代码运行后,在命令行输入Weather.txt文件中添加过的城市,如:济宁。

4.生成的内容存储到csv文件中,形式如下所示:

5.具体代码如下:

# -*- coding:utf-8 -*-
"""
作者:青鸟飞啊555
日期:2024年12月26日
"""
import requests
import csv
import random
import time
import socket
import http.client
from bs4 import BeautifulSoup
import os# 获取桌面路径
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")# 创建一个保存天气信息的文件夹
save_folder = os.path.join(desktop_path, "Weather")
os.makedirs(save_folder, exist_ok=True)  # 如果文件夹不存在则创建#  获取每个城市对应天气的url
def get_url(city_name):url = 'https://www.weather.com.cn/weather/'with open(save_folder+'\\'+'Weather.txt', 'r', encoding='UTF-8') as fs:lines = fs.readlines()for line in lines:if (city_name in line):code = line.split('=')[0].strip()# print(code)return url + code + '.shtml'raise ValueError('invalid city name')#  对网页获取get请求,得到的是response对象
def get_content(url, data=None):#  模拟浏览器访问header = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language': 'zh-CN,zh;q=0.8','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'}#  超时,取随机数是因为防止被网站认定为网络爬虫timeout = random.choice(range(80, 180))while True:try:#  获取请求数据rep = requests.get(url, headers=header, timeout=timeout)rep.encoding = 'utf-8'breakexcept socket.timeout as e:print('3:', e)time.sleep(random.choice(range(8, 15)))except socket.error as e:print('4:', e)time.sleep(random.choice(range(20, 60)))except http.client.BadStatusLine as e:print('5:', e)time.sleep(random.choice(range(30, 80)))except http.client.BadStatusLine as e:print('6:', e)time.sleep(random.choice(range(5, 15)))return rep.text# 获取html中我们所需要的字段:
def get_data(html_text, city_name):#  final元组存放七天的数据final = []t = []t.append(city_name)final.append(t)bs = BeautifulSoup(html_text, "html.parser")  # 创建BeautifulSoup对象,解析器为:html.parserbody1 = bs.body  # 获取body部分#  print(body1)data = body1.find('div', {'id': '7d'})  # 找到id为7d的divprint(data)ul = data.find('ul')  # 获取ul部分li = ul.find_all('li')  # 获取所有的lifor day in li:  # 对每个li标签中的内容进行遍历# temp代存每日的数据temp = []#  添加日期data = day.find('h1').string  # 找到日期temp.append(data)  # 添加到temp中inf = day.find_all('p')  # 找到li中的所有p标签#  添加天气状况temp.append(inf[0].string)  # 第一个p标签中的内容(天气状况)加到temp中#  添加最高气温if inf[1].find('span') is None:temperature_highest = None  # 天气当中可能没有最高气温(傍晚)else:temperature_highest = inf[1].find('span').string  # 找到最高气温temperature_highest = temperature_highest.replace('℃', '')temp.append(temperature_highest)  # 将最高温添加进去# 添加最低气温temperature_lowest = inf[1].find('i').string  # 找到最低温temperature_lowest = temperature_lowest.replace('℃', '')  # 最低温度后面有个℃,去掉这个符号temp.append(temperature_lowest)  # 将最低温添加上去final.append(temp)  # 将temp 加到final中return final# 将抓取出来的数据写入文件
def write_data(city_name, data, file_name):with open(file_name, 'a', errors='ignore', newline='') as f:f_csv = csv.writer(f)f_csv.writerows(data)print('%s 天气已添加成功' % city_name)if __name__ == '__main__':cities = input('请输入城市名称(一个或多个,以空格隔开): ').split(' ')for city in cities:url = get_url(city)  # 获取城市天气的urlhtml = get_content(url)  # 获取网页htmlresult = get_data(html, city)  # 爬去城市的信息write_data(city, result, save_folder + '\\' + 'weather.csv')  # 将爬取得信息填入表格文件

注:参考python3 爬虫—爬取天气预报多个城市七天信息(三)_抓取七天数据所在的li标签-CSDN博客

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

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

相关文章

MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据

前言 在一次 MySQL 的线上查询操作中,因为 ! 的特性导致未能正确查询到为 NULL 的数据,险些引发严重后果。本文将详细解析 NULL 在 SQL 中的行为,如何避免类似问题,并提供实际操作建议。 1. 为什么NULL会查询不到? 在…

JVM和异常

Java 虚拟机(Java Virtual Machine,简称 JVM) 概述 JVM 是运行 Java 字节码的虚拟计算机,它是 Java 程序能够实现 “一次编写,到处运行(Write Once, Run Anywhere)” 特性的关键所在。Java 程序…

Mybatis 为什么不需要给Mapper接口写实现类,为什么要使用代理而不是硬编码?

文章目录 核心机制概述源码分析1. 获取 Mapper 实例2. 创建 Mapper 代理对象3. 拦截方法调用 MapperProxy4. 关联 SQL 并执行 为什么 MyBatis 采用了代理机制,而不是简单地面向流程化的方式?1. 解耦和灵活性2. 方法拦截和事务管理3. 动态代理支持方法级别的 SQL 定…

DevOps流程CICD之Jenkins使用操作

一、jenkins的docker-compose安装部署 请参考 jenkins的docker安装部署配置全网最详细教程-CSDN博客 二、创建repository 三、创建ssh 四、创建视图 五、创建任务 六、配置gitlab钩子 七、自动构建部署CI/CD验证

Solidworks打开无法获得许可,提示(-15,10,10061)错误解决办法

参考文章: https://blog.csdn.net/2301_81263647/article/details/140904773

四、AI知识(其他算法)

四、AI知识(其他算法) 1.其他算法 终身学习 元学习 2.建模预处理与评估 数据清洗 数据规约 空缺值 噪声数据 数据变换 数据规范化(如正则化、归一化) 数据压缩 数据规约 数值数据离散化/分类数据概念分层 模型评估 …

【云原生】Docker Compose 从入门到实战使用详解

目录 一、前言 二、Docker Compose 介绍 2.1 Docker Compose概述 2.2 Docker Compose特点 2.3 Docker Compose使用场景 三、Docker Compose 安装 3.1 安装docker环境 3.2 Docker Compose安装方式一 3.2.1 下载最新版 3.2.2 设置权限 3.2.3 设置软链接 3.2.4 查看版本…

wangEditor/editor自定义粘贴后续

背景 按照上一篇文章处理自定义粘贴之后,发现复制表格之后,会出现表格样式失效问题,原因是自定义粘贴没有处理表格数据,导致按照文本格式粘贴了 处理方式 自定义表格(如果业务有需求需要更新表格样式的,…

【OTA】论文笔记--《智能网联汽车整车OTA功能设计研究》智能网联汽车OTA系统设计分析报告

智能网联汽车OTA系统设计分析报告 引言 随着汽车智能化、网联化水平不断提升,现代汽车中电子控制单元(ECU)的数量和复杂度持续增加。据统计,高级轿车上电子电气元件的成本已占整车开发成本的60%~70%。为了实现对这些电控单元的软件开发调试、数据标定、文件更新和故障修复,…

【电路理论四】正弦电流电路

正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式: 称为正弦电流的三要素。 分别为振幅/幅值,角频率,初相。 幅值为正弦电流的最大值,恒为正。 为正弦电…

解决Windows无法同时使用有线网和无线网WIFI的问题

参考资料 电脑无线网wifi和有线网同时使用(内网外网同时使用)用route命令解决Wifi和网卡不能同时上内外网问题 解决方法 对于Windows系统同时连接有线网和无线网Wifi时,只会有一个网关生效,因此我们需要手动通过route命令设置网…

FOC控制原理-ADC采样时机

0、文章推荐 SimpleFOC移植STM32(五)—— 电流采样及其变换_极对数对电流采样的影响-CSDN博客 FOC 电流采样方案对比(单电阻/双电阻/三电阻) - 知乎 (zhihu.com) FOC中的三种电流采样方式,你真的会选择吗?…

uniapp:编译微信、h5都正常的,编译钉钉小程序无法找到页面

我们在做uniapp的开发的时候遇到很多莫名其妙的问题,其中就有个很奇葩的问题,我们开发的过程中使用微信小程序/h5调试都是正常编译正常跳转,然后在要上架的时候,编译钉钉小程序成功,但是访问页面无法访问, …

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz(https://www.zentao.net/downloads.html) https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

REDIS2.0

string list hash set 无序集合 声明一个key,键里面的值是元素,元素的类型是string 元素的值是唯一的,不能重复 多个集合类型之间可以进行并集,交集,集查的运算 sadd test1 a b c c d :添加5个元素&am…

【论文阅读】DebSDF:深入研究神经室内场景重建的细节和偏差

【论文阅读】DebSDF:深入研究神经室内场景重建的细节和偏差 Abstract3.METHOD3.1 Preliminaries3.2 Uncertainty Guided Prior Filtering3.3 Uncertainty-Guided Ray Sampling3.4 Uncertainty-Guided Smooth Regularization3.5 Bias-aware SDF to Density Transform…

golang,多个proxy拉包的处理逻辑

在Go语言中,当你设置了多个代理(GOPROXY)时,Go工具链会按照你设置的顺序尝试每个代理。如果第一个代理失败,它会尝试下一个代理,直到成功获取到模块或者所有代理都尝试失败。最后,如果所有代理都…

微服务SpringCloud分布式事务之Seata

视频教程:https://www.bilibili.com/video/BV16P63Y3ESq 效果演示 准备的微服务项目调用的链路如下: 文字描述: gateway模块接收到请求,并发送到order订单模块order订单模块接收到请求,新增一个订单数据后发送一个…

Pyhton知识分享-利用KNN算法实现手写数字识别

利用KNN算法实现手写数字识别 MNIST手写数字识别 是计算机视觉领域中 "hello world"级别的数据集 1999年发布,成为分类算法基准测试的基础随着新的机器学习技术的出现,MNIST仍然是研究人员和学习者的可靠资源。 本次案例中,我们的…

多点通信、流式域套接字

一、广播 1.1广播的发送端模型&#xff1a; #include<myhead.h>#define BEN_IP "192.168.191.129" #define BEN_PORT 8888#define PORT 6666int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_DGRAM,0);if(oldfd -1){perror("soc…