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'
            break
        except 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.parser
    body1 = bs.body  # 获取body部分

    #  print(body1)
    data = body1.find('div', {'id': '7d'})  # 找到id为7d的div
    print(data)
    ul = data.find('ul')  # 获取ul部分
    li = ul.find_all('li')  # 获取所有的li

    for 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)  # 获取城市天气的url
        html = get_content(url)  # 获取网页html
        result = get_data(html, city)  # 爬去城市的信息
        write_data(city, result, save_folder + '\\' + 'weather.csv')  # 将爬取得信息填入表格文件

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工厂+策略模式之最佳实践(疾病报卡维护模块API设计)

目录 💻业务场景 🔧应用技术 ⚙概要流程 ❗开发注意 服务类上标注了 自定义注解 却无法直接利用getDeclaredAnnotation 获取 *Spring代理机制 代理机制的工作原理 代理的工作机制 代理的使用场景 已获取EmrXXXServiceImpl 的Class,…

【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案

随著车载技术的快速进步,驾驶安全越来越受到重视,而疲劳驾驶是造成交通事故的重要原因之一。传统的驾驶监控技术因精度不足或反应迟缓,无法满足实时监测需求。因此,结合人工智能技术的疲劳驾驶检测系统成为行业新方向,…

Go-知识 注释

Go-知识 注释 行注释块注释包注释结构体&接口注释函数&方法注释废弃注释文档 在 go 语言中注释有两种,行注释和块注释 行注释 使用双斜线 // 开始,一般后面紧跟一个空格。行注释是Go语言中最常见的注释形式,在标准包中,…

2025年阿里云认证改版新消息!2025年阿里云认证考试内容有变!

阿里云认证已经确定在2025年要进行大改,这次改动幅度会比2023年改动更大,2023年主要改变是在考试题型上的变化,这次则主要是考试内容的变化了! 2023年阿里云ACP认证考试的改版变化主要有: (一&#xff09…

ArrayList 和LinkedList的区别比较

前言 ‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析,他们一个是Array(动态数组)的数据结构,一个是Linked(链表)的数据结构&#x…

STM32-笔记22-sg90舵机

一、接线 二、实验实现 动手让 SG90 每秒转动一下,0 -> 20 -> 40 -> 100 -> 180 如此循环。 舵机接A6 复制18-呼吸灯,重命名24-sg90舵机 把PWM重命名sg90 打开项目文件 在魔术棒和品上把PWM都去掉,加载sg90文件夹 加载之后…

QT集成intel RealSense 双目摄像头

最近一个小项目,用到了双目相机,选用了Intel的RealSense双目相机。功能很简单,就是识别某一个物体,然后对对这个物体进行操作。具体功能随后再说,这里只介绍QT如何集成IntelRealSense相机,就是下面这个。 首…

前端小案例——520表白信封

前言:我们在学习完了HTML和CSS之后,就会想着使用这两个东西去做一些小案例,不过又没有什么好的案例让我们去练手,本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

Golang的发展历程

Golang的发展历程可以分为以下几个阶段: 设计阶段:2007年,Google开始研究开发一种新的编程语言,主要出于对C和Java等编程语言的不足之处的反思。经过一年多的研究和讨论,Golang的设计方案得到确定,主要包括…

硬件设计-硬件 EMC 设计规范

目录 引言: 常见原因 总体概念及考虑 布局 屏蔽 滤波 引言: 本规范只简绍 EMC 的主要原则与结论,为硬件工程师们在开发设计中抛砖引玉。 电磁干扰的三要素是干扰源、干扰传输途径、干扰接收器。EMC 就围绕这些 问题进行研究。最基本的…

后端开发-Maven

环境说明: windows系统:11版本 idea版本:2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型(POM),通过一组构建规则和约定来管理项目的构建&#xf…

C++ 编译过程全解析:从源码到可执行文件的蜕变之旅

引言 C 作为一种广泛应用于系统开发、游戏编程、嵌入式系统等领域的高级编程语言,其代码需要经过编译才能转换为计算机可执行的机器语言。编译过程涵盖多个复杂阶段,每个阶段对最终生成的可执行文件的性能、稳定性及兼容性都有着深远影响。深入理解 C 编…

数据库的概念和操作

目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

期权懂|个股期权的流动性如何?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权的流动性如何? 个股期权作为场外交易工具,具有较高的灵活性。场外交易意味着交易双方可以直接协商交易条款,这有助于满足不同投资者的…

关于在M系列的Mac中使用SoftEtherClient软件

1. 前言 本文说明的是在M系列的苹果的MacBook中如何使用SoftetherClient这款软件,是直接在MacOS操作系统中安装连接使用,不是在PD环境或者非ARM架构的Mac中安装使用。 PS:别费劲百度了,很少有相关解决方案的,在国内会…

linux自动化批量分发SSH密钥同时批量测试SSH连接教程(包含自动化脚本代码)

1、检查端口 检查分发对象22端口是否打开 nmap -p22 ip地址如果要批量检查端口可以参考我写的这篇文章:linux自动化一键批量检查主机端口 2、命令行分发密钥原理 Linux分发密钥原理主要涉及SSH(Secure Shell)协议,该协议用于…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态(数据)管理库,redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref,则打印c时,无需.value 他自动拆包,如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

Oracle 11G还有新BUG?ORACLE 表空间迷案!

前段时间遇到一个奇葩的问题,在开了SR和oracle support追踪两周以后才算是有了不算完美的结果,在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线,系统卡死不可用,通知到我排查,查看alert log看到是…

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行? 数据并行(Data Parallelism, DP)的核心思想是将大规模的数据集分割成若干个较小的数据子集,并将这些子集分配到不同的 NPU 计算节点上,每个节点运行相同的模型副本,但处理不同的数据子集。…