Scrapling
使用 Scrapling 进行网络爬取 - HTTP 抓取、隐形浏览器自动化、Cloudflare 绕过,以及通过 CLI 和 Python 进行蜘蛛爬行。
技能元数据
| 来源 | 可选 — 使用 hermes skills install official/research/scrapling 安装 |
| 路径 | optional-skills/research/scrapling |
| 版本 | 1.0.0 |
| 作者 | FEUAZUR |
| 许可证 | MIT |
| 平台 | linux, macos, windows |
| 标签 | Web Scraping, Browser, Cloudflare, Stealth, Crawling, Spider |
| 相关技能 | duckduckgo-search, domain-intel |
参考:完整的 SKILL.md
信息
以下是当此技能被触发时 Hermes 加载的完整技能定义。这是技能激活时智能体看到的指令。
Scrapling
Scrapling 是一个具有反机器人绕过、隐形浏览器自动化和蜘蛛框架的网络爬虫框架。它提供三种抓取策略(HTTP、动态 JS、隐形/Cloudflare)和完整的 CLI。
此技能仅供教育和研究目的。 用户必须遵守当地/国际的数据抓取法律,并尊重网站的服务条款。
何时使用
- 抓取静态 HTML 页面(比浏览器工具更快)
- 抓取需要真实浏览器的 JS 渲染页面
- 绕过 Cloudflare Turnstile 或机器人检测
- 使用蜘蛛爬行多个页面
- 当内置的
web_extract工具未返回您需要的数据时
安装
pip install "scrapling[all]"
scrapling install
最小安装(仅 HTTP,无浏览器):
pip install scrapling
仅浏览器自动化:
pip install "scrapling[fetchers]"
scrapling install
快速参考
| 方式 | 类 | 何时使用 |
|---|---|---|
| HTTP | Fetcher / FetcherSession | 静态页面、API、快速批量请求 |
| 动态 | DynamicFetcher / DynamicSession | JS 渲染内容、SPA |
| 隐形 | StealthyFetcher / StealthySession | Cloudflare、反机器人保护的网站 |
| 蜘蛛 | Spider | 跟随链接的多页面爬行 |
CLI 用法
提取静态页面
scrapling extract get 'https://example.com' output.md
使用 CSS 选择器和浏览器模拟:
scrapling extract get 'https://example.com' output.md \
--css-selector '.content' \
--impersonate 'chrome'
提取 JS 渲染页面
scrapling extract fetch 'https://example.com' output.md \
--css-selector '.dynamic-content' \
--disable-resources \
--network-idle
提取 Cloudflare 保护的页面
scrapling extract stealthy-fetch 'https://protected-site.com' output.html \
--solve-cloudflare \
--block-webrtc \
--hide-canvas
POST 请求
scrapling extract post 'https://example.com/api' output.json \
--json '{"query": "search term"}'
输出格式
输出格式由文件扩展名决定:
.html-- 原始 HTML.md-- 转换为 Markdown.txt-- 纯文本.json/.jsonl-- JSON
Python: HTTP 抓取
单个请求
from scrapling.fetchers import Fetcher
page = Fetcher.get('https://quotes.toscrape.com/')
quotes = page.css('.quote .text::text').getall()
for q in quotes:
print(q)
会话(持久 Cookie)
from scrapling.fetchers import FetcherSession
with FetcherSession(impersonate='chrome') as session:
page = session.get('https://example.com/', stealthy_headers=True)
links = page.css('a::attr(href)').getall()
for link in links[:5]:
sub = session.get(link)
print(sub.css('h1::text').get())
POST / PUT / DELETE
page = Fetcher.post('https://api.example.com/data', json={"key": "value"})
page = Fetcher.put('https://api.example.com/item/1', data={"name": "updated"})
page = Fetcher.delete('https://api.example.com/item/1')
使用代理
page = Fetcher.get('https://example.com', proxy='http://user:pass@proxy:8080')
Python: 动态页面(JS 渲染)
对于需要 JavaScript 执行的页面(SPA、延迟加载内容):
from scrapling.fetchers import DynamicFetcher
page = DynamicFetcher.fetch('https://example.com', headless=True)
data = page.css('.js-loaded-content::text').getall()
等待特定元素
page = DynamicFetcher.fetch(
'https://example.com',
wait_selector=('.results', 'visible'),
network_idle=True,
)
禁用资源以提高速度
阻止字体、图像、媒体、样式表(速度提升约 25%):
from scrapling.fetchers import DynamicSession
with DynamicSession(headless=True, disable_resources=True, network_idle=True) as session:
page = session.fetch('https://example.com')
items = page.css('.item::text').getall()
自定义页面自动化
from playwright.sync_api import Page
from scrapling.fetchers import DynamicFetcher
def scroll_and_click(page: Page):
page.mouse.wheel(0, 3000)
page.wait_for_timeout(1000)
page.click('button.load-more')
page.wait_for_selector('.extra-results')
page = DynamicFetcher.fetch('https://example.com', page_action=scroll_and_click)
results = page.css('.extra-results .item::text').getall()
Python: 隐形模式(反机器人绕过)
适用于 Cloudflare 保护或强指纹识别的网站:
from scrapling.fetchers import StealthyFetcher
page = StealthyFetcher.fetch(
'https://protected-site.com',
headless=True,
solve_cloudflare=True,
block_webrtc=True,
hide_canvas=True,
)
content = page.css('.protected-content::text').getall()
隐形会话
from scrapling.fetchers import StealthySession
with StealthySession(headless=True, solve_cloudflare=True) as session:
page1 = session.fetch('https://protected-site.com/page1')
page2 = session.fetch('https://protected-site.com/page2')
元素选择
所有抓取器返回一个具有以下方法的 Selector 对象:
CSS 选择器
page.css('h1::text').get() # 第一个 h1 文本
page.css('a::attr(href)').getall() # 所有链接 href
page.css('.quote .text::text').getall() # 嵌套选择
XPath
page.xpath('//div[@class="content"]/text()').getall()
page.xpath('//a/@href').getall()
查找方法
page.find_all('div', class_='quote') # 按标签 + 属性
page.find_by_text('Read more', tag='a') # 按文本内容
page.find_by_regex(r'\$\d+\.\d{2}') # 按正则表达式模式
相似元素
查找具有相似结构的元素(适用于产品列表等):
first_product = page.css('.product')[0]
all_similar = first_product.find_similar()
导航
el = page.css('.target')[0]
el.parent # 父元素
el.children # 子元素
el.next_sibling # 下一个兄弟元素
el.prev_sibling # 上一个兄弟元素
Python: 蜘蛛框架
用于跟随链接的多页面爬行:
from scrapling.spiders import Spider, Request, Response
class QuotesSpider(Spider):
name = "quotes"
start_urls = ["https://quotes.toscrape.com/"]
concurrent_requests = 10
download_delay = 1
async def parse(self, response: Response):
for quote in response.css('.quote'):
yield {
"text": quote.css('.text::text').get(),
"author": quote.css('.author::text').get(),
"tags": quote.css('.tag::text').getall(),
}
next_page = response.css('.next a::attr(href)').get()
if next_page:
yield response.follow(next_page)
result = QuotesSpider().start()
print(f"抓取了 {len(result.items)} 条引言")
result.items.to_json("quotes.json")
多会话蜘蛛
将请求路由到不同的抓取器类型:
from scrapling.fetchers import FetcherSession, AsyncStealthySession
class SmartSpider(Spider):
name = "smart"
start_urls = ["https://example.com/"]
def configure_sessions(self, manager):
manager.add("fast", FetcherSession(impersonate="chrome"))
manager.add("stealth", AsyncStealthySession(headless=True), lazy=True)
async def parse(self, response: Response):
for link in response.css('a::attr(href)').getall():
if "protected" in link:
yield Request(link, sid="stealth")
else:
yield Request(link, sid="fast", callback=self.parse)
暂停/恢复爬行
spider = QuotesSpider(crawldir="./crawl_checkpoint")
spider.start() # Ctrl+C 暂停,重新运行从检查点恢复
注意事项
- 需要安装浏览器:pip 安装后运行
scrapling install— 没有它,DynamicFetcher和StealthyFetcher将失败 - 超时时间:DynamicFetcher/StealthyFetcher 超时时间单位为毫秒(默认 30000),Fetcher 超时时间单位为秒
- Cloudflare 绕过:
solve_cloudflare=True会使抓取时间增加 5-15 秒 — 仅在需要时启用 - 资源使用:StealthyFetcher 运行真实浏览器 — 限制并发使用量
- 法律:在抓取前始终检查 robots.txt 和网站服务条款。此库仅供教育和研究目的
- Python 版本:需要 Python 3.10+