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

爬虫的第三天——爬动态网页

一、基本概念

动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。

特点

  • 用户交互:动态网页能够根据用户的请求而生成不同的内容。
  • 内容动态生成:数据来自数据库、API或用户输入。
  • 客户端动态渲染:浏览器通过JavaScript/AJAX动态加载内容(如滚动加载更多商品)
  • 服务器端处理:动态网页通常需要服务器端脚本来处理用户的请求。脚本语言通常是PHP、java、Python、ruby等

二、网页判别

  • 检查方法
  1. 右键查看网页源代码(ctrl+u),搜索关键数据(ctrl+f),如果源代码中没有目标数据,说明是动态加载.

上面的图片明显看得出来,在网页源代码中并没有找到目标数据。

      2、分析网络请求(F12 → Network),观察XHR/Fetch请求,看数据是否通过API返回(通常是JSON格式)。

这里就做一下静态网页和动态网页的对比

静态网页动态网页
  • 动态网页特征

                1、 页面内容逐步加载

                2、滚动到页面底部时加载更多内容

                3、数据通过异步请求获取

三、爬虫步骤

  1. 我使用开发工具直接调用API

点击预览可看到,网页上的一些数据

2、url太长了,我们可以查询字符型串参数来定义请求参数,url中?号后面可以不要

3、在标头中找到User-Agent,来模拟浏览器

代码:

# 导入requests库用于发送HTTP请求
import requests
# 从typing模块导入类型注解所需的类型
from typing import Dict, List

# 定义获取热点新闻的函数,返回类型注解为List[Dict]
def hot_news() -> List[Dict]:
    # List[Dict]: 返回一个字典列表,每个字典包含一条新闻的信息

    # 定义请求头,模拟浏览器访问
    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',
    }

    # 定义请求参数
    params = {
        # 来源平台标识
        'origin': 'toutiao_pc',
        # 签名参数,用于验证请求合法性(可能会过期)
        '_signature': '_02B4Z6wo00901iZ5CawAAIDCEV3N8.rNWGomXQ0AAO6JwLZsIueh1TRpco1.6.JGKOj3uc9xHlCRxuw.wFTHZgOZLg1VOHco5rVDuDUVr-4zDQ2LC1UG0Cumhra0kq6uy9bLrGYAoD97KLsk34'
    }

    # 目标API地址
    url = "https://www.toutiao.com/hot-event/hot-board/"

    # 使用try-except块捕获可能出现的异常
    try:
        # 发送GET请求,设置10秒超时
        res= requests.get(url, params=params, headers=headers, timeout=10)
        # 如果响应状态码不是200,抛出HTTPError异常
        res.raise_for_status()

        # 将响应内容解析为JSON格式
        data = res.json()

        # 验证返回的数据结构是否为字典且包含data键
        if not isinstance(data, dict) or 'data' not in data:
            print("数据格式异常")  # 打印错误信息
            return []  # 返回空列表

        # 返回data字典中的'data'键对应的值(新闻列表)
        return data['data']

    # 捕获所有requests可能抛出的异常
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")  # 打印请求失败信息
        return []  # 返回空列表

    # 捕获JSON解析异常
    except ValueError as e:
        print(f"JSON解析失败: {e}")  # 打印解析失败信息
        return []  # 返回空列表


# 定义打印新闻标题的函数,接收新闻列表参数
def hot_titles(list: List[Dict]) -> None:

    #ist: 新闻列表,每个元素是一个包含新闻信息的字典

    # 使用enumerate遍历列表,同时获取索引和元素,从1开始计数
    for id, item in enumerate(list, 1):
        # 从字典中获取'Title'键的值,如果没有则使用'无标题'作为默认值
        title = item.get('Title', '空')
        # 格式化打印序号和标题
        print(f"{id}. {title}")


# Python的主程序入口
if __name__ == '__main__':
    # 调用hot_news函数获取热点新闻数据
    top_news = hot_news()
    # 调用hot_titles函数打印新闻标题
    hot_titles(top_news)

效果:/*做敲代码的时候,我电脑没电了,再次开机的时候就重新找的一个,所以这个与我上面预览的数据不一样*/

四、拓展

from typing import Dict,List

# 标注字典类型,表示键为str,值为int的字典
age_dict: Dict[str, int] = {"Alice": 25, "Bob": 30}


# 标注列表类型,表示元素为字符串的列表
names: List[str] = ["Alice", "Bob"]

相关文章:

  • ubuntu服务器进程启动失败的原因分析
  • LabVIEW医疗设备故障智能诊断系统
  • 智能网联交通加速落地,光路科技TSN技术助推车路云一体化发展
  • 电脑连不上手机热点会出现的小bug
  • vs2022+QT6.7.3打包程序流程
  • 推荐《人工智能算法》卷1、卷2和卷3 合集3本书(附pdf电子书下载)
  • 详细介绍WideCharToMultiByte()
  • MTK 后端初探
  • 如何正确地在 Postman 中添加认证 Token?
  • 3PL EDI:SA Piper Logistics EDI需求分析
  • AWS API Gateway Canary部署实战:Lambda到ECS的平滑迁移指南
  • 上位机知识篇---Linux中pythonpipapt
  • 【SpringCloud】Eureka的使用
  • Qt下载模板到本地文件内容丢失问题
  • 软件项目管理课程之第4讲:软件需求管理
  • 重温:时间窗口与滑动步长的概念
  • 【算法】动态规划:子序列问题、回文子串问题、两个数组的dp
  • C++ 变量类型
  • Qt 信号和槽
  • 原型模式为什么可以解决构建复杂对象的资源消耗问题
  • 智能手表眼镜等存泄密隐患,国安部提醒:严禁在涉密场所使用
  • 中医的千年传承:网络科学描绘其演化之路|PNAS速递
  • 波兰关闭俄罗斯驻克拉科夫领事馆
  • 百利天恒董事长向复旦捐赠三千万元,用于支持创新药物靶点发现等师资建设需要
  • 母亲节书单|关于生育自由的未来
  • 白宫启动“返乡计划” ,鼓励非法移民自愿离开美国