python爬取中央气象台温湿度数据,每5分钟写入sqlite

import time
import sqlite3
import logging
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.common.exceptions import SessionNotCreatedException

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 定义常量
WEBSITE_URL = "http://www.nmc.cn/publish/forecast/ASD/dongying.html"
CHROME_DRIVER_PATH = r"C:/chrome_drv/chromedriver.exe"
DB_NAME = "weather_data.db"
MAX_RETRIES = 3
SCAN_INTERVAL = 300  # 5 分钟

# XPath 常量
XPATH_TEMPERATURE = '/html/body/div[2]/div/div[2]/div[1]/div[1]/div[1]/div[2]/div[4]'
XPATH_HUMIDITY = '/html/body/div[2]/div/div[2]/div[1]/div[1]/div[1]/div[3]/div/div/div[3]/div/div[3]'
XPATH_FEELS_LIKE_TEMPERATURE = '/html/body/div[2]/div/div[2]/div[1]/div[1]/div[1]/div[3]/div/div/div[4]/div/div[3]'
XPATH_WIND_DIRECTION = '/html/body/div[2]/div/div[2]/div[1]/div[1]/div[1]/div[3]/div/div/div[2]/div/div[2]'
XPATH_WIND_SPEED = '/html/body/div[2]/div/div[2]/div[1]/div[1]/div[1]/div[3]/div/div/div[2]/div/div[3]'

def create_database_table():
    """创建数据库表(如果不存在)"""
    with sqlite3.connect(DB_NAME) as conn:
        cursor = conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS weather (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                timestamp TEXT,
                temperature TEXT,
                humidity TEXT,
                feels_like_temperature TEXT,
                wind_direction TEXT,
                wind_speed TEXT
            )
        ''')
        conn.commit()

def get_weather_data():
    """获取天气数据"""
    retries = 0
    while retries < MAX_RETRIES:
        try:
            service = Service(CHROME_DRIVER_PATH)
            options = webdriver.ChromeOptions()
            options.add_argument("--headless")
            driver = webdriver.Chrome(service=service, options=options)

            driver.get(WEBSITE_URL)
            timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

            temperature = driver.find_element(By.XPATH, XPATH_TEMPERATURE).text
            humidity = driver.find_element(By.XPATH, XPATH_HUMIDITY).text
            feels_like_temperature = driver.find_element(By.XPATH, XPATH_FEELS_LIKE_TEMPERATURE).text
            wind_direction = driver.find_element(By.XPATH, XPATH_WIND_DIRECTION).text
            wind_speed = driver.find_element(By.XPATH, XPATH_WIND_SPEED).text

            return timestamp, temperature, humidity, feels_like_temperature, wind_direction, wind_speed
        except SessionNotCreatedException:
            retries += 1
            logging.warning(f"Chrome 启动失败,正在进行第 {retries} 次重试...")
            time.sleep(10)
        except Exception as e:
            logging.error(f"发生错误: {e}")
            break
        finally:
            if 'driver' in locals():
                driver.quit()
    return None

def save_weather_data(data):
    """保存天气数据到数据库"""
    if data:
        timestamp, temperature, humidity, feels_like_temperature, wind_direction, wind_speed = data
        with sqlite3.connect(DB_NAME) as conn:
            cursor = conn.cursor()
            cursor.execute('''
                INSERT INTO weather (timestamp, temperature, humidity, feels_like_temperature, wind_direction, wind_speed)
                VALUES (?, ?, ?, ?, ?, ?)
            ''', (timestamp, temperature, humidity, feels_like_temperature, wind_direction, wind_speed))
            conn.commit()
        logging.info(f"时间: {timestamp}")
        logging.info(f"温度: {temperature}")
        logging.info(f"湿度: {humidity}")
        logging.info(f"体感温度: {feels_like_temperature}")
        logging.info(f"风向: {wind_direction}")
        logging.info(f"风速: {wind_speed}")
        logging.info("-" * 50)

def main():
    """主函数"""
    create_database_table()
    try:
        while True:
            data = get_weather_data()
            save_weather_data(data)
            time.sleep(SCAN_INTERVAL)
    except KeyboardInterrupt:
        logging.info("程序已终止。")

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值