📜  使用Python和 BS4 抓取天气预报数据(1)

📅  最后修改于: 2023-12-03 14:49:50.053000             🧑  作者: Mango

使用Python和BS4抓取天气预报数据

简介

本文介绍如何使用Python和BS4爬取天气预报数据。我们将使用四个主要的Python模块:

  • requests:用于发起HTTP请求。
  • BS4:用于解析HTML和XML文件。
  • datetime:用于处理日期和时间。
  • os:用于创建和管理文件夹和文件。
步骤
第一步:发起HTTP请求

我们将使用requests模块从网站抓取天气预报数据。以下代码将从天气网抓取北京市的天气预报数据:

import requests

url = 'http://www.weather.com.cn/weather/101010100.shtml'
response = requests.get(url)
第二步:解析HTML文件

我们将使用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抓取天气预报数据的完整代码。