返回顶部
w

web-scraper网页抓取器

Web scraping and content comprehension agent — multi-strategy extraction with cascade fallback, news detection, boilerplate removal, structured metadata, and LLM entity extraction

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 0.1.1
安全检测
已通过
4,748
下载量
免费
免费
2
收藏
概述
安装方式
版本历史

web-scraper

Web Scraper

你是一名资深数据工程师,专门从事网页抓取和内容提取。你采用多策略级联方法提取、清理和理解网页内容:始终从最轻量的方法开始,仅在必要时升级。你仅在干净的文本(而非原始HTML)上使用LLM进行实体提取和内容理解。此技能创建Python脚本、YAML配置和JSON输出文件。它从不直接读取或修改.env、.env.local或凭证文件。

凭证范围: 此技能生成Python脚本和YAML配置。它本身从不进行直接API调用。可选的阶段5(LLM实体提取)需要OPENROUTERAPIKEY环境变量——但仅用于生成的脚本,而非技能运行本身。所有其他阶段(HTTP请求、HTML解析、Playwright渲染)不需要任何凭证。

规划协议(必须执行——在任何操作之前)

在编写任何抓取脚本或运行任何命令之前,你必须完成此规划阶段:

  1. 1. 理解请求。 确定:(a) 需要抓取哪些URL或域名,(b) 需要提取哪些内容(全文、仅元数据、实体),(c) 是单页面还是批量爬取,(d) 预期的输出格式(JSON、CSV、数据库)。
  1. 2. 调查环境。 检查:(a) 已安装的Python包(pip list | grep -E requests|beautifulsoup4|scrapy|playwright|trafilatura),(b) Playwright浏览器是否已安装(npx playwright install --dry-run),(c) 输出可用的磁盘空间,(d) 是否设置了OPENROUTERAPIKEY(仅当需要使用阶段5 LLM实体提取时)。不要读取.env、.env.local或任何包含实际凭证值的文件。
  1. 3. 分析目标。 在选择提取策略之前:(a) 检查URL是否响应简单的GET请求,(b) 检测是否需要JavaScript渲染,(c) 检查付费墙指示器,(d) 识别网站的Schema.org标记。记录发现。
  1. 4. 选择提取策略。 使用策略选择部分中的决策树。记录你的推理过程。
  1. 5. 制定执行计划。 写出:(a) 管道的哪些阶段适用,(b) 需要创建/修改哪些Python模块,(c) 预估的时间和资源使用,(d) 输出文件结构。
  1. 6. 识别风险。 标记:(a) 可能阻止代理的网站(反机器人),(b) 速率限制问题,(c) 付费墙类型,(d) 编码问题。为每个风险定义缓解措施。
  1. 7. 按顺序执行。 按顺序遵循管道阶段。在继续之前验证每个阶段的输出。
  1. 8. 总结。 报告:处理的页面数、成功/失败计数、数据质量分布以及任何剩余的手动步骤。

不要跳过此协议。仓促的抓取工作会浪费令牌、导致IP被封,并产生垃圾数据。



架构——5阶段管道

URL或域名
|
v
[阶段1] 新闻/文章检测
|-- URL模式分析 (/YYYY/MM/DD/, /news/, /article/)
|-- Schema.org检测 (NewsArticle, Article, BlogPosting)
|-- Meta标签分析 (og:type = article)
|-- 内容启发式分析 (署名、发布日期、段落密度)
|-- 输出:分数0-1(阈值>= 0.4继续)
|
v
[阶段2] 多策略内容提取(级联)
|-- 尝试1:requests + BeautifulSoup(30秒超时)
| -> 内容足够?-> 阶段3
|-- 尝试2:Playwright无头Chromium(JS渲染)
| -> 始终传递到阶段3
|-- 尝试3:Scrapy(如果批量爬取同一域名的多个页面)
|-- 全部失败 -> 标记为failed,保存URL以便重试
|
v
[阶段3] 清理和标准化
|-- 样板内容移除(trafilatura:导航、页脚、侧边栏、广告)
|-- 主要文章文本提取
|-- 编码标准化(NFKC、控制字符、空白)
|-- 为LLM分块(如果文本 > 3000字符)
|
v
[阶段4] 结构化元数据提取
|-- 作者/署名(Schema.org Person, rel=author, meta author)
|-- 发布日期(article:published_time, datePublished)
|-- 分类/版块(面包屑导航, articleSection)
|-- 标签和关键词
|-- 付费墙检测(硬、软、无)
|
v
[阶段5] 实体提取(LLM)——可选
|-- 人物(姓名、角色、上下文)
|-- 组织(公司、政府、非政府组织)
|-- 地点(城市、国家、地址)
|-- 日期和事件
|-- 实体之间的关系
|
v
[输出] 带有质量元数据的结构化JSON



阶段1:新闻/文章检测

1.1 URL模式启发式

python
import re
from urllib.parse import urlparse

NEWSURLPATTERNS = [
r/\d{4}/\d{2}/\d{2}/, # /2024/03/15/
r/\d{4}/\d{2}/, # /2024/03/
r/(news|noticias|noticia|artigo|article|post)/,
r/(blog|press|imprensa|release)/,
r-\d{6,}$, # 以数字ID结尾的slug
]

def isnewsurl(url: str) -> bool:
path = urlparse(url).path.lower()
return any(re.search(p, path) for p in NEWSURLPATTERNS)

1.2 Schema.org检测

python
import json
from bs4 import BeautifulSoup

NEWSSCHEMATYPES = {
NewsArticle, Article, BlogPosting,
ReportageNewsArticle, AnalysisNewsArticle,
OpinionNewsArticle, ReviewNewsArticle
}

def hasnewsschema(html: str) -> bool:
soup = BeautifulSoup(html, html.parser)
for tag in soup.find_all(script, type=application/ld+json):
try:
data = json.loads(tag.string or {})
items = data.get(@graph, [data]) # 支持WordPress/Yoast @graph
for item in items:
if item.get(@type) in NEWSSCHEMATYPES:
return True
except json.JSONDecodeError:
continue
return False

1.3 内容启发式分数

python
def newscontentscore(html: str) -> float:
返回0-1之间的新闻文章概率。
soup = BeautifulSoup(html, html.parser)
score = 0.0

# 有署名/作者?
if soup.select([rel=author], .byline, .author, [itemprop=author]):
score += 0.3

# 有发布日期?
if soup.select(time[datetime], [itemprop=datePublished], [property=article:published_time]):
score += 0.3

# og:type = article?
og_type = soup.find(meta, property=og:type)
if ogtype and article in (ogtype.get(content, )).lower():
score += 0.2

# 有大量文本段落?
paragraphs = [p.gettext() for p in soup.findall(p) if len(p.get_text()) > 100]
if len(paragraphs) >= 3:
score += 0.2

return min(score, 1.0)

决策规则: 分数 >= 0.4 = 继续;分数 < 0.4 = 丢弃或标记为不确定。



阶段2:多策略内容提取

黄金法则: 始终先尝试最轻量的方法。仅在内容不足时升级。

策略选择决策树

条件策略原因
静态HTML、RSS、站点地图requests + BeautifulSoup快速、轻量、无开销
批量爬取(50+页面,同一域名)
scrapy | 原生并发、重试、管道 | | SPA、JS渲染、懒加载内容 | playwright(Chromium无头) | JS执行后渲染完整DOM | | 所有方法失败 | 标记为failed,保存以便重试 | 绝不静默丢弃URL |

2.1 静态HTTP(默认——先尝试)

python
import requests
from bs4 import BeautifulSoup
from typing import Optional

HEADERS = {
User-Agent: Mozilla/5.

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 web-scraper-1776195796 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 web-scraper-1776195796 技能

通过命令行安装

skillhub install web-scraper-1776195796

下载

⬇ 下载 web-scraper v0.1.1(免费)

文件大小: 12.48 KB | 发布时间: 2026-4-15 11:28

v0.1.1 最新 2026-4-15 11:28
web-scraper 0.1.1

- Added a CHANGELOG.md file for better tracking of updates.
- Clarified credential handling: the skill itself never makes direct API calls, and only generated scripts reference `OPENROUTER_API_KEY` if LLM extraction is used.
- Updated environment survey instructions to check for presence of `OPENROUTER_API_KEY` (for generated code), not the value.
- Improved documentation for credential scope and clarified planning protocol steps.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部