【Web-Crawler-Steamdt】以项目文件steamdt_crawler.py学习python爬虫

https://github.com/stefanokratzdisteln-hash/Web-Crawler-Steamdt

以下是 steamdt_crawler.py 中的主要知识点整理,适合有 Python 基础的学习者学习爬虫:


一、爬虫基础与工具选择

1. 动态 vs 静态网页爬取

  • Playwright:用于处理 JavaScript 动态渲染的网页(现代 SPA 应用)
  • Requests + BeautifulSoup:用于静态 HTML 页面(传统网页)
  • 代码中通过 PLAYWRIGHT_AVAILABLE 判断并自动降级

2. 环境与编码处理

python 复制代码
# Windows 控制台编码修复
if sys.platform == 'win32':
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
  • 解决 Windows 下中文乱码问题
  • 使用 io.TextIOWrapper 重定向标准输出编码

二、Playwright 爬虫框架

1. 基本使用流程

python 复制代码
with sync_playwright().start() as playwright:
    browser = playwright.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto(url)
  • 无头浏览器headless=True
  • 模拟用户代理 :设置 user_agent
  • 页面等待策略wait_for_load_state('networkidle')

2. 元素定位与交互

  • page.inner_text('body'):获取页面文本
  • page.query_selector_all('tr, div'):CSS 选择器查找元素
  • page.evaluate():执行 JavaScript 代码

三、数据提取与解析

1. 正则表达式(re 模块)

  • 提取数字模式:r'([\d,]+\.\d+)'
  • 提取百分比:r'([+-]?\d+\.?\d*%)'
  • 提取带单位的值:r'([\d,]+\.\d+[万亿])'

2. 数据清洗与验证

python 复制代码
def _extract_numeric_candidates(self, text: str) -> List[str]:
    # 过滤干扰项(如百分比)
    if '%' in before or '%' in after:
        continue
  • 避免提取到环比数据等干扰项
  • 通过位置判断数据类型

3. 多级板块数据解析

  • 板块结构:热门板块 → 一级板块 → 二级板块 → 三级板块
  • 数据格式:排名 + 名称 + 涨跌幅
  • 去重机制 :使用 set() 避免重复数据

四、错误处理与调试

1. 异常捕获

python 复制代码
try:
    # 可能出错的操作
except PlaywrightTimeoutError:
    print("[WARNING] 页面加载超时")
except Exception as e:
    print(f"[ERROR] 其他错误: {e}")
    traceback.print_exc()
  • 区分不同类型的异常
  • 使用 traceback.print_exc() 打印完整堆栈

2. 调试信息输出

python 复制代码
debug_filename = f"debug_page_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
with open(debug_filename, 'w', encoding='utf-8') as f:
    f.write(page_text)
  • 将页面内容保存到文件,便于分析网页结构
  • 使用时间戳命名,避免覆盖

五、数据存储与管理

1. JSON 格式存储

python 复制代码
with open(filename, 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
  • ensure_ascii=False:保留中文字符
  • indent=2:格式化输出,便于阅读

2. 文件管理

python 复制代码
old_files = glob.glob("steamdt_data_*.json")
old_files.sort(key=os.path.getmtime, reverse=True)
  • 使用 glob 查找匹配的文件
  • 按修改时间排序,保留最新文件
  • 自动清理旧数据文件

六、代码结构与设计模式

1. 面向对象编程

  • 类封装SteamDTCrawler 类封装所有爬虫功能
  • 上下文管理器__enter____exit__ 管理资源
  • 类型注解:提高代码可读性和 IDE 提示

2. 模块化设计

  • 分离关注点
    • extract_market_stats():提取大盘数据
    • extract_sections():提取板块数据
    • save_to_json():保存数据
  • 辅助方法_extract_numeric_candidates() 等私有方法

七、高级技巧与最佳实践

1. 多策略数据提取

python 复制代码
# 方法1:正则表达式匹配
# 方法2:DOM 元素查找
# 方法3:JavaScript 执行
# 方法4:文本行分析
  • 多种方法互补,提高爬虫健壮性
  • 逐步降级策略

2. 等待与加载策略

  • wait_for_load_state('networkidle'):等待网络空闲
  • time.sleep(3):显式等待 JS 执行
  • window.scrollTo():滚动页面触发懒加载

3. 防反爬虫策略

python 复制代码
args=['--disable-blink-features=AutomationControlled']
  • 禁用自动化控制特征
  • 模拟真实浏览器行为

学习建议

  1. 先掌握基础:Requests + BeautifulSoup 处理静态页面
  2. 再学动态爬虫:Playwright/Selenium 处理 JS 渲染页面
  3. 重视正则表达式:数据清洗的关键工具
  4. 学会调试:保存页面内容,分析网页结构
  5. 注意反爬虫:合理设置请求间隔,尊重 robots.txt

代码亮点总结

知识点 应用场景 学习价值
Playwright 动态网页爬取 现代爬虫必备技能
正则表达式 数据提取与清洗 文本处理核心能力
错误处理 爬虫稳定性 生产级代码要求
数据存储 结果持久化 数据处理完整流程
模块化设计 代码可维护性 工程化思维培养

这份代码是一个完整的生产级爬虫示例,涵盖了从爬取、解析、清洗到存储的全流程,非常适合作为学习爬虫的进阶案例。

相关推荐
盐水冰1 分钟前
【烘焙坊项目】后端搭建(14) - 工作台&导出数据报表
java·后端·学习
曲辕RPA5 分钟前
深度解析GEO技术及背后的机器人曲辕RPA
python·ai·自动化·rpa
2301_7644413311 分钟前
使用python构建的STAR实验ΛΛ̄自旋关联完整仿真
开发语言·python·算法
Dfreedom.14 分钟前
机器学习经典算法全景解析与演进脉络(无监督学习篇)
人工智能·学习·算法·机器学习·无监督学习
xifangge202516 分钟前
Python 爬虫实战:爬取豆瓣电影 Top250 数据并进行可视化分析
开发语言·爬虫·python
Yan-英杰18 分钟前
TypeScript+React 全栈生态实战:从架构选型到工程落地,告别开发踩坑
javascript·学习·typescript
421!20 分钟前
ESP32学习笔记之GPIO
开发语言·笔记·单片机·嵌入式硬件·学习·算法·fpga开发
Flittly21 分钟前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(10)Team Protocols (团队协议)
笔记·python·ai·ai编程
阿_旭21 分钟前
基于YOLO26深度学习的蓝莓成熟度检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】图像分割、人工智能
人工智能·python·深度学习·毕业设计·蓝莓成熟度检测
lxmyzzs24 分钟前
使用Python分析COCO数据集标注信息:一个简单脚本实现统计与可视化
python·深度学习·目标检测·计算机视觉