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()
python爬取中央气象台温湿度数据,每5分钟写入sqlite
于 2025-02-18 18:10:59 首次发布