当前位置: 首页 > article >正文

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类这种方式,爬虫程序结构清晰,有效规避常见的反爬虫机制。


http://www.kler.cn/a/420918.html

相关文章:

  • MySQL需掌握到何种程度?才能胜任工作
  • HTML5系列(9)-- Web Components
  • 新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议
  • Neo4j APOC-01-图数据库 apoc 插件介绍
  • 【前端】理解 JavaScript 中 typeof 操作符的独特行为
  • Python 深度学习框架之Keras库详解
  • ArcGIS求取多个点距离线要素的最近距离以及距离倒数
  • 数据结构基础之《(10)—快速排序》
  • RoBERTa- 稳健优化的 BERT 预训练模型详解
  • AI - 谈谈RAG中的查询分析(2)
  • 《封装、继承与多态》问题一:封装只有类能做吗?结构体如何封装?名空间、文件能实现封装吗?还有没有其他方式?
  • Vue.js 中集成 Socket.IO 实现实时聊天功能
  • Microi 吾码:后端开发的创新引擎与代码艺术
  • Android Studio安装ADB Wi-Fi插件使用WIFI连接终端设备调试程序
  • Java11使用JVM同一日志框架启用日志记录
  • Shire 1.1 发布:更强大的交互支持,升级 AI 智能体与 IDE 的整合体验
  • 【Unity】WebGL全屏问题
  • 在Scala中栈的认识
  • A30 PHP+MYSQL+LW+工厂库存仓储订单销售后台管理系统的设计与实现 源代码 配置 文档
  • ROS2创建 base 包用于其他模块的参数配置和头文件依赖
  • 【计算机网络】实验1:访问WEB服务器
  • DBA面试题-1
  • 【大模型微调】pdf转markdown
  • QT-thread2种方式选择的优劣对比
  • uniapp 生成二维码
  • 量化交易系统开发-实时行情自动化交易-8.9.通达信平台