一、基本概念
动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。
特点:
- 用户交互:动态网页能够根据用户的请求而生成不同的内容。
- 内容动态生成:数据来自数据库、API或用户输入。
- 客户端动态渲染:浏览器通过JavaScript/AJAX动态加载内容(如滚动加载更多商品)
- 服务器端处理:动态网页通常需要服务器端脚本来处理用户的请求。脚本语言通常是PHP、java、Python、ruby等
二、网页判别
- 检查方法
-
右键查看网页源代码(ctrl+u),搜索关键数据(ctrl+f),如果源代码中没有目标数据,说明是动态加载.
上面的图片明显看得出来,在网页源代码中并没有找到目标数据。
2、分析网络请求(F12 → Network),观察XHR/Fetch请求,看数据是否通过API返回(通常是JSON格式)。
这里就做一下静态网页和动态网页的对比
静态网页 | 动态网页 |
![]() | ![]() |
- 动态网页特征
1、 页面内容逐步加载
2、滚动到页面底部时加载更多内容
3、数据通过异步请求获取
三、爬虫步骤
- 我使用开发工具直接调用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"]