📅  最后修改于: 2023-12-03 14:49:50.053000             🧑  作者: Mango
本文介绍如何使用Python和BS4爬取天气预报数据。我们将使用四个主要的Python模块:
我们将使用requests模块从网站抓取天气预报数据。以下代码将从天气网抓取北京市的天气预报数据:
import requests
url = 'http://www.weather.com.cn/weather/101010100.shtml'
response = requests.get(url)
我们将使用BS4模块解析网页。
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')
我们可以通过检查HTML源码来确定使用哪种解析器。在这种情况下,使用'html.parser'即可。
要找到天气数据,我们需要检查页面并找到包含天气数据的HTML元素。在这个例子中,我们可以通过检查源代码和使用浏览器开发工具来找到包含天气数据的CSS选择器。
# 找到包含当前天气的HTML元素
now_node = soup.select_one('#today .wea')
now_weather = now_node.get_text()
print('当前天气:', now_weather)
# 找到包含每日天气的HTML元素
nodes = soup.select('#7d .sky')
# 创建一个列表来存储每日天气
weather_list = []
for node in nodes:
# 在每个HTML元素中找到日期和天气数据
date_node = node.parent.select_one('.date')
date = date_node.get_text()
weather = node.get_text().strip()
# 将日期和天气数据添加到weather_list中
weather_list.append((date, weather))
# 打印列表中的每个元素
for weather in weather_list:
print(weather[0], ':', weather[1])
在这个例子中,我们将回传当前天气和每日天气。我们使用CSS选择器'#today .wea'找到包含当前天气的HTML元素,使用CSS选择器'#7d .sky'找到包含每日天气的HTML元素。
我们将使用datetime模块处理日期和时间。以下代码将处理和格式化日期:
import datetime
now = datetime.datetime.now()
date = now.strftime('%Y-%m-%d')
print('当前日期:', date)
在这个例子中,我们使用strftime()方法将日期格式化为'年-月-日'的字符串。
我们将使用os模块创建和管理文件夹和文件。以下代码将在当前目录下创建一个名为'weather_data'的文件夹,并将天气数据保存到名为'beijing_weather_{date}.txt'的文件中:
import os
# 创建一个名为'weather_data'的文件夹
if not os.path.exists('weather_data'):
os.makedirs('weather_data')
# 将天气数据保存到名为'beijing_weather_{date}.txt'的文件中
filename = f'weather_data/beijing_weather_{date}.txt'
with open(filename, 'w', encoding='utf-8') as f:
f.write(f'当前天气:{now_weather}\n')
f.write('\n')
for weather in weather_list:
f.write(f'{weather[0]}: {weather[1]}\n')
在这个例子中,我们将使用f-string创建一个带有日期的文件名,并将天气数据写入文件中。
import requests
from bs4 import BeautifulSoup
import datetime
import os
# 发起HTTP请求
url = 'http://www.weather.com.cn/weather/101010100.shtml'
response = requests.get(url)
# 解析HTML文件
soup = BeautifulSoup(response.content, 'html.parser')
# 抓取天气数据
now_node = soup.select_one('#today .wea')
now_weather = now_node.get_text()
print('当前天气:', now_weather)
nodes = soup.select('#7d .sky')
weather_list = []
for node in nodes:
date_node = node.parent.select_one('.date')
date = date_node.get_text()
weather = node.get_text().strip()
weather_list.append((date, weather))
for weather in weather_list:
print(weather[0], ':', weather[1])
# 处理日期和时间
now = datetime.datetime.now()
date = now.strftime('%Y-%m-%d')
print('当前日期:', date)
# 保存数据
if not os.path.exists('weather_data'):
os.makedirs('weather_data')
filename = f'weather_data/beijing_weather_{date}.txt'
with open(filename, 'w', encoding='utf-8') as f:
f.write(f'当前天气:{now_weather}\n')
f.write('\n')
for weather in weather_list:
f.write(f'{weather[0]}: {weather[1]}\n')
以上就是使用Python和BS4抓取天气预报数据的完整代码。