简单的爬取中国天气网某个城市七天的天气预报数据

本文介绍了一个使用Python的BeautifulSoup库抓取中国天气网天气预报数据的实例,包括如何解析HTML结构,提取所需数据并存入SQLite数据库。代码详细展示了从构造请求头到数据持久化的全过程。

首先需要了解需要爬取的数据的网页的结构,其结构如下图所示(只截取了部分):

从图中可以看出每一天的天气数据都被一个<li></li>包含,这七天的数据又都包含在一个<ul></ul>中。

所以我们的目标就是获取ul下每个li中的数据。注意,“今天”的数据中温度只有一个数值,而其后6天的

数据温度都有两个数值,需要单独处理。

代码如下(IDE:pycharm):

from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.request
import sqlite3

class WeatherDB:
    def openDB(self):
        # 使用sqlite3建立的weathers数据库
        self.con = sqlite3.connect("weathers.db")
        self.cursor = self.con.cursor()
        try:
            self.cursor.execute("create table weathers (wCity varchar(16),wDate varchar(16),wWeather varchar(64),wTemp varchar(32),constraint pk_weather primary key(wCity,wDate))")
        except:
            self.cursor.execute("delete from weathers")
    def closeDB(self):
        self.con.commit()
        self.con.close()
    def 
中国天气(http://www.weather.com.cn/)爬取多个城市的未来30天气数据时,需要结合站的页面结构和络请求机制,使用Python的requests和BeautifulSoup等库进行数据抓取。由于中国天气的页面数据通常通过AJAX请求获取,因此直接解析HTML页面可能无法获取到完整的30天数据。以下是实现该任务的关键步骤和技术要点: ### 确定数据来源 中国天气的未来天气数据通常通过API接口返回JSON格式的数据。可以通过浏览器开发者工具(F12)查看络请求,找到返回天气数据的API地址。例如,某些城市数据可能通过如下格式的URL获取: ``` http://d1.weather.com.cn/sk2d/321084/101190501.html?_={时间戳} ``` 其中`101190501`是城市的ID,不同城市的ID可以在站中查找[^2]。 ### 获取城市ID列表 为了爬取多个城市天气数据,需要先获取这些城市的ID。可以通过访问中国天气城市列表页面或通过已知的城市ID进行整理,建立一个城市ID与城市名称的映射表。 ### 使用requests发起请求 编写Python代码,使用requests库发起GET请求,向API接口发送HTTP请求。由于某些API可能需要特定的请求头信息,建议在请求头中设置`User-Agent`等字段以模拟浏览器行为。 ```python import requests import time def fetch_weather_data(city_id): url = f"http://d1.weather.com.cn/sk2d/321084/{city_id}.html?_={int(time.time() * 1000)}" headers = { "User-Agent": "Mozilla/5.0", "Referer": "http://www.weather.com.cn/" } try: response = requests.get(url, headers=headers) if response.status_code == 200: # 返回JSON格式的天气数据 return response.json() else: print(f"Failed to fetch data for city ID {city_id}") return None except Exception as e: print(f"Error fetching data for city ID {city_id}: {e}") return None ``` ### 解析存储数据 从API返回的JSON数据中提取所需的30天气象信息。由于不同API返回的数据结构可能不同,需要根据实际的JSON格式进行解析。可以使用pandas库将数据存储为DataFrame格式,导出为CSV文件或存入数据库。 ```python import pandas as pd def parse_weather_data(json_data, city_name): # 假设JSON数据中包含一个名为"forecast"的键,其中包含未来30天的天气数据 forecasts = json_data.get("forecast", []) weather_list = [] for day in forecasts: weather_info = { "city": city_name, "date": day.get("date"), "temperature": day.get("temp"), "weather": day.get("weather"), "wind": day.get("wind") } weather_list.append(weather_info) return pd.DataFrame(weather_list) # 示例:获取解析多个城市天气数据 city_ids = { "北京": "101010100", "上海": "101020100", "广州": "101280601" } all_weather_data = pd.DataFrame() for city_name, city_id in city_ids.items(): raw_data = fetch_weather_data(city_id) if raw_data: df = parse_weather_data(raw_data, city_name) all_weather_data = pd.concat([all_weather_data, df], ignore_index=True) # 导出为CSV文件 all_weather_data.to_csv("weather_data.csv", index=False) ``` ### 数据可视化 使用matplotlib或seaborn等库对获取的天气数据进行可视化分析,例如绘制温度变化趋势图、天气情况统计图等,以便更直观地展示未来30天的天气趋势[^2]。 ```python import matplotlib.pyplot as plt # 假设df是包含"date"和"temperature"列的DataFrame plt.figure(figsize=(12, 6)) for city in city_ids.keys(): city_data = all_weather_data[all_weather_data["city"] == city] plt.plot(city_data["date"], city_data["temperature"], label=city) plt.xlabel("Date") plt.ylabel("Temperature (°C)") plt.title("30-Day Temperature Forecast for Multiple Cities") plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show() ``` ### 注意事项 - **反爬机制**:中国天气可能对频繁的请求进行限制,建议在请求之间设置适当的间隔(如使用`time.sleep()`)。 - **合法性**:确保在爬取数据时遵守站的使用条款,避免对站造成过大的负载[^2]。 通过以上步骤,可以有效地爬取中国天气多个城市的未来30天气数据进行进一步的分析和应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值