Python 爬虫实战基于 Class 的天气查询与反爬虫练习
需求:
要实现一个简单的天气查询爬虫,使用 requests 库来获取网页内容,使用 BeautifulSoup 来解析网页并提取天气信息。以下是一个基本示例,展示了如何抓取天气信息并输出当天的温度和天气状况。
以下是使用 class 类方式实现带有反爬虫机制的天气查询爬虫代码:
import requests
from bs4 import BeautifulSoup
import random
import time
class WeatherSpider:
def __init__(self):
# 初始化 User-Agent 列表
self.user_agents = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
def get_headers(self):
"""随机生成请求头"""
return {
"User-Agent": self.user_agents,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "keep-alive",
"Connection": "keep-alive",
}
def fetch_weather(self, city_code):
"""
根据城市代码抓取天气信息
:param city_code: 城市代码(如 101010100 表示北京)
"""
url = f"http://www.weather.com.cn/weather1d/{city_code}.shtml"
try:
# 随机选择请求头
headers = self.get_headers()
# 发送 HTTP 请求
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查响应状态码是否为 200
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取天气信息
temperature = soup.find('p', class_='tem').find('span').text
weather = soup.find('p', class_='wea').text
# 输出结果
print(f"城市代码: {city_code}")
print(f"温度: {temperature}°C")
print(f"天气: {weather}")
except requests.exceptions.RequestException as e:
print(f"请求错误: {e}")
except Exception as e:
print(f"解析错误: {e}")
# 随机暂停(控制请求频率,避免被封禁)
time.sleep(random.uniform(1, 3))
def run(self):
"""运行爬虫程序"""
while True:
city_code = input("请输入城市代码(例如北京101010100),输入 'q' 退出:")
if city_code.lower() == 'q':
print("退出程序")
break
self.fetch_weather(city_code)
# 主程序入口
if __name__ == "__main__":
spider = WeatherSpider()
spider.run()
代码说明:
类属性与初始化:
在 init 方法中初始化 User-Agent 列表和代理池。
提供灵活的请求头和代理支持,避免被反爬虫机制检测。
get_headers 方法:
随机返回一个 User-Agent,模拟真实用户请求。
get_proxy 方法:
随机返回一个代理地址,避免 IP 被封禁。
fetch_weather 方法:
参数:接收一个城市代码(如北京的代码是 101010100)。
使用 requests 发送 GET 请求,设置随机的请求头和代理。
使用 BeautifulSoup 解析 HTML,提取天气信息。
捕获可能的异常(请求错误或解析错误)。
run 方法:
提供用户交互界面,允许用户输入城市代码。
支持连续查询,输入 q 退出程序。
主程序:
实例化 WeatherSpider 类并调用 run() 方法启动爬虫程序。
运行效果:
请输入城市代码(例如北京101010100),输入 'q' 退出:101010100
城市代码: 101010100
温度: 20°C
天气: 晴
请输入城市代码(例如北京101010100),输入 'q' 退出:q
退出程序
点评:
通过class类这种方式,爬虫程序结构清晰,有效规避常见的反爬虫机制。