一、爬取中国天气网所有地区当天的天气数据(PyCharm):
网址:https://www.weather.com.cn/
下面爬取数据:
因为现在已经到了夜间,所以白天的数据已经不见了,但原理是一样的。
二、代码以及详情解释:
具体的代码的url以及headers是要从检查里面找的:
以及这些元素代码的寻找:
这个代码是一个用于从中国天气网(weather.com.cn
)抓取天气信息的Python脚本。它使用了 requests
库发送HTTP请求,并使用 BeautifulSoup
库解析HTML内容。以下是代码的主要功能和相关知识点的罗列:
代码功能概述
-
遍历多个地区:代码通过遍历一个地区列表(
area
),构造不同的URL来获取不同地区的天气信息。 -
发送HTTP请求:使用
requests.get()
发送HTTP请求,获取网页的HTML内容。 -
解析HTML:使用
BeautifulSoup
解析HTML内容,提取所需的天气信息。 -
提取天气信息:从HTML中提取城市名称、上午天气、上午风力风向、上午最高温度、晚上天气、晚上风力风向、晚上最低温度等信息。
-
去重处理:使用集合
processed_cities
来避免重复处理同一个城市的天气信息。 -
打印结果:将提取的天气信息格式化输出到控制台。
涉及的知识点
1. Python基础
-
列表与循环:
-
使用列表
area
存储地区代码。 -
使用
for
循环遍历列表中的每个地区。
-
-
字符串格式化:
-
使用
f-string
(如f"https://www.weather.com.cn/textFC/{page}.shtml"
)动态构造URL。
-
-
集合(Set):
-
使用集合
processed_cities
来存储已经处理过的城市名称,确保每个城市只被处理一次。
-
2. HTTP请求
-
requests
库:-
使用
requests.get()
发送HTTP GET请求,获取网页内容。 -
设置请求头
headers
,模拟浏览器访问,避免被网站反爬虫机制拦截。 -
使用
res.encoding = 'utf-8'
设置响应内容的编码为UTF-8,确保中文内容正确显示。
-
3. HTML解析
-
BeautifulSoup
库:-
使用
BeautifulSoup(res.text, 'lxml')
解析HTML内容,lxml
是解析器。 -
使用
soup.select()
方法通过CSS选择器查找HTML元素。 -
使用
find()
和find_all()
方法查找特定的HTML标签和属性。
-
4. HTML结构与CSS选择器
-
HTML表格结构:
-
网页中的天气信息以表格形式展示,代码通过查找
<div class="conMidtab2">
和<tr>
、<td>
标签来提取数据。
-
-
CSS选择器:
-
使用
div.conMidtab2
选择所有class
为conMidtab2
的<div>
元素。 -
使用
tr
选择表格行,td
选择表格单元格。
-
-
HTML属性:
-
通过
width
属性(如width='83'
)定位特定的表格单元格。
-
5. 数据提取与处理
-
提取文本内容:
-
使用
.string
提取HTML标签内的文本内容(如tr.find('td', width='83').a.string
)。
-
-
条件判断:
-
使用
if
语句检查是否存在某个HTML元素或属性,避免因元素不存在而报错。
-
-
数据格式化与输出:
-
使用
print()
函数将提取的天气信息格式化输出。
-
6. 去重与集合
-
集合(Set):
-
使用集合
processed_cities
存储已经处理过的城市名称,利用集合的唯一性特性避免重复处理。
-
7. 异常处理(未显式实现)
-
代码中没有显式的异常处理(如
try-except
),但在实际应用中,建议添加异常处理机制,以应对网络请求失败或HTML解析错误等情况。
代码执行流程
-
遍历地区列表:
-
对每个地区代码(如
hb
、db
等),构造对应的URL。
-
-
发送HTTP请求:
-
使用
requests.get()
获取网页内容。
-
-
解析HTML:
-
使用
BeautifulSoup
解析HTML,查找包含天气信息的表格。
-
-
提取天气信息:
-
遍历表格行,提取城市名称、天气、风力风向、温度等信息。
-
-
去重处理:
-
使用集合
processed_cities
避免重复处理同一城市。
-
-
输出结果:
-
将提取的天气信息格式化输出到控制台。
-
总结
这段代码展示了如何使用Python进行网页抓取和HTML解析,涉及的知识点包括:
-
Python基础(列表、循环、字符串格式化、集合)
-
HTTP请求(
requests
库) -
HTML解析(
BeautifulSoup
库) -
HTML结构与CSS选择器
-
数据提取与处理
-
去重与集合
通过这段代码,可以学习如何从网页中提取结构化数据,并将其用于进一步的分析或存储。
import requests
from bs4 import BeautifulSoup# 定义地区列表
area = ["hb", "db", "hd", "hz", "hn", "xb", "xn", "gat"]for page in area:# 构造 URLurl = f"https://www.weather.com.cn/textFC/{page}.shtml"headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0"}# 发送 HTTP 请求获取网页内容res = requests.get(url=url, headers=headers)res.encoding = 'utf-8' # 设置编码为 UTF-8# 使用 BeautifulSoup 解析网页内容soup = BeautifulSoup(res.text, 'lxml')# 用于存储已经处理过的城市名称processed_cities = set()# 遍历所有 class 为 conMidtab2 的 div 元素for div in soup.select('div.conMidtab2'):# 遍历 div 中的所有 tr 元素(表格行)for tr in div.select('tr'):# 检查当前行是否包含宽度为 83 的 td 元素,该元素可能包含城市信息if tr.find('td', width='83'):# 检查宽度为 83 的 td 元素中是否有 a 标签,a 标签内通常是城市名if tr.find('td', width='83').a:# 提取城市名city = tr.find('td', width='83').a.string# 如果城市已经处理过,则跳过if city in processed_cities:continue# 否则,将城市添加到已处理集合中processed_cities.add(city)# 打印城市名print(f"城市:{city}")# 提取上午天气信息morning_weather_td = tr.find('td', width='89')if morning_weather_td:morning_weather = morning_weather_td.stringprint(f"上午天气:{morning_weather}")# 提取上午风力风向信息morning_wind_td = tr.find('td', width='162')if morning_wind_td:spans = morning_wind_td.find_all('span')if len(spans) >= 2:morning_wind_1 = spans[0].stringmorning_wind_2 = spans[1].stringprint(f"上午风力风向:{morning_wind_1} {morning_wind_2}")# 提取上午最高温度morning_max_temp_td = tr.find('td', width='92')if morning_max_temp_td:morning_max_temp = morning_max_temp_td.stringprint(f"上午最高温度:{morning_max_temp}")# 提取晚上天气信息night_weather_td = tr.find('td', width='98')if night_weather_td:night_weather = night_weather_td.stringprint(f"晚上天气:{night_weather}")# 提取晚上风力风向信息night_wind_td = tr.find('td', width='177')if night_wind_td:spans = night_wind_td.find_all('span')if len(spans) >= 2:night_wind_1 = spans[0].stringnight_wind_2 = spans[1].stringprint(f"晚上风力风向:{night_wind_1} {night_wind_2}")# 提取晚上最低温度night_min_temp_td = tr.find('td', width='86')if night_min_temp_td:night_min_temp = night_min_temp_td.stringprint(f"晚上最低温度:{night_min_temp}")# 打印分隔线,用于区分不同城市的天气信息print('-----------------')else:# 如果当前行不包含宽度为 83 的 td 元素,跳过该行continue
三、代码运行结果展示: