Web Scraper

基于Python的网页数据提取工具,支持分页、反反爬及JavaScript渲染页面抓取。

已扫描
适合谁
数据采集人员、自动化办公用户
不适合谁
无编程基础的普通用户、需直接登录账号操作的复杂场景
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @ericlooi504/python-web-scraper

Skill 说明

命令、参数、文件名以原文为准

Web Scraper

概述

用于数据提取、分页处理、反屏蔽技术、JavaScript 重度网站的 Selenium 支持以及结构化输出的 Python 网络爬虫工具包。涵盖合乎道德的爬取实践。当 Codex 需要从网站提取数据、处理分页、绕过简单的反机器人措施或抓取 JavaScript 渲染内容时使用。

快速入门

前置条件

pip install requests beautifulsoup4 lxml
# 对于 JavaScript 重度网站:
pip install selenium webdriver-manager

基础抓取

# 从页面中提取所有链接
python3 scripts/scrape-basic.py https://example.com \
  --selector "a[href]" --attr href --output links.json --pretty

# 提取文章中的文本
python3 scripts/scrape-basic.py https://news.ycombinator.com \
  --selector ".titleline a" --output hn.txt

分页抓取

# URL 参数分页(?page=1, ?page=2)
python3 scripts/scrape-pagination.py https://books.toscrape.com/catalogue/page-1.html \
  --selector "h3 a" --attr title --max-pages 5

# 下一页链接检测
python3 scripts/scrape-pagination.py https://quotes.toscrape.com \
  --selector "span.text" --max-pages 3

JavaScript 渲染页面(Selenium)

python3 scripts/scrape-with-selenium.py https://example.com \
  --selector ".dynamic-content" --wait 5 --output data.json

常见场景

反屏蔽技术

轮换 User-Agent 并添加延迟以避免被 429 或封禁:

import random
import time
headers = {
    "User-Agent": random.choice(USER_AGENTS),
    "Accept": "text/html,application/xhtml+xml",
    "Accept-Language": "en-US,en;q=0.9",
    "Referer": "https://www.google.com/",
}
time.sleep(random.uniform(1.0, 3.0))  # 在请求间随机延迟

对于更严格的屏蔽:可设置 Cookie、使用会话(Session)或添加代理。

无需 Selenium 处理 JavaScript 页面

首先检查:数据是否已嵌入页面源码中?

import re, json
# 在 <script> 标签中查找 JSON 数据
match = re.search(r'window\.__INITIAL_STATE__\s*=\s*({.*?});', html)
if match:
    data = json.loads(match.group(1))

许多 SPA(React/Vue)会将数据嵌入 script 标签中——此时可能无需 Selenium。

处理需登录的页面

# 方式一:从浏览器导出 Cookie
# 在浏览器控制台中:document.cookie 或使用 EditThisCookie 插件
# 方式二:使用 requests Session
python3 -c "
import requests
s = requests.Session()
s.post('https://example.com/login', data={'user': '...', 'pass': '...'})
with open('cookies.txt', 'w') as f:
    f.write(str(s.cookies.get_dict()))
"

输出格式化

脚本默认输出 JSON。转换为 CSV:

# 使用 jq 将 JSON 转为 CSV
python3 scrape-basic.py https://example.com -s "tr" -o data.json --pretty
python3 -c "
import json, csv
with open('data.json') as f:
    data = json.load(f)
with open('data.csv', 'w', newline='') as f:
    w = csv.writer(f)
    w.writerow(['item'])
    for d in data:
        w.writerow([d])
"

伦理与法律

  • 始终先检查 robots.txthttps://example.com/robots.txt
  • 尊重 Crawl-delay 指令
  • 在 User-Agent 中标识自己,并包含联系方式
  • 绝不抓取需登录保护的内容、个人数据或受版权保护的信息
  • 请求之间添加延迟(建议 1–3 秒)——不要频繁冲击服务器
  • 检查服务条款(ToS),部分网站明确禁止爬取
  • 对于公开数据(新闻、博客、目录类):在合理限速的前提下通常允许

资源

  • **scripts/scrape-basic.py** —— 使用 CSS 选择器进行单页抓取,支持 JSON/CSV/文本输出
  • **scripts/scrape-pagination.py** —— 分页抓取(URL 参数 + 下一页链接检测)
  • **scripts/scrape-with-selenium.py** —— 基于 Selenium 的抓取,适用于 JavaScript 重度网站并支持滚动
  • **references/anti-blocking.md** —— 详细的反屏蔽策略与代理使用说明
E
@ericlooi504

已收录 3 个 Skill

相关推荐