ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

如何用 Scrapling 自适应抓取替代 AI 内容提取服务并对比成本

2026/9/9 19:27:42 拓冰建站 浏览量
如何用 Scrapling 自适应抓取替代 AI 内容提取服务并对比成本 如何用 Scrapling 自适应抓取替代 AI 内容提取服务并对比成本【免费下载链接】Scrapling️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling如果你目前用 AI 方案做内容提取——无论是按用量付费的 AI 抓取服务如 Browse AI、Oxylabs还是自己写“LLM 页面源码”的提取流程——成本会随页面量增长页面内容通常很大每次都要把源码传给 AI 模型来识别字段或生成选择器token 消耗很快。Scrapling 的adaptive特性配合一组非选择器选择方法就是为了解决“站点结构一变、选择器就失效”的提取问题而不需要把页面源码交给 AI 模型。下面按“安装启用 → 基线保存 → 改版后找回元素 → 成本对比”的顺序给出把现有提取任务迁移到 Scrapling 的完整路径。适用前提Python 3.10 或更高README 中的安装要求目标页面是 HTML。Scrapling 目前只解析 HTML 页面不支持 XML feed原因是adaptive特性对 XML 不生效见 元素选择文档。安装并启用 adaptive 功能先安装解析引擎pip install scrapling注意该安装只包含解析引擎单独安装后from scrapling.fetchers import ...会抛ModuleNotFoundError。如果任务要请求在线站点而不是解析已下载的 HTML还要安装 fetcher 依赖pip install scrapling[fetchers] scrapling install # normal install scrapling install --force # force reinstallscrapling install会下载浏览器及其系统依赖只在你确实要用 fetcher 时执行。adaptive特性默认关闭必须显式启用。两个入口from scrapling import Selector # 解析本地 HTML 时传入目标站点 URLScrapling 按域隔离保存的元素属性 page Selector(html_doc, adaptiveTrue, urlhttps://example.com)from scrapling.fetchers import Fetcher # 通过 fetcher 抓取时全局配置解析器 Fetcher.configure(adaptiveTrue) page Fetcher.get(https://example.com)两点说明来自 adaptive 文档 和 fetcher 基础文档用Selector类时不传url保存的属性会记在default域下同一identifier复用到别的站点且未传url时才会出问题且保存会覆盖旧数据adaptive只用最近一次保存的属性。数据默认存在 SQLite 数据库里storage和storage_args两个参数只在你要写自定义存储系统时才有意义见自定义存储文档。也可以用fetcher_class.display_config()随时查看当前配置。第一步在现有页面上提取并保存字段有两条路径取决于目标站点有没有稳定可用的 class/id。路径 ACSS 选择器 auto_save元素有可用选择器如 id时第一次选中就用auto_saveTrue保存其唯一属性identifier会自动设为你传入的选择器字符串element page.css(#p1, auto_saveTrue)路径 B非选择器选择替代“让 AI 在页面里找字段”页面是裸 HTML、没有 id/class或 class 名随机时文档推荐按内容选择。以“从不同网站提取价格”为例文档给出的代码# 取第一个文本匹配价格正则如 £10.50的元素 price_element page.find_by_regex(r£[\d\.,], first_matchTrue) # 如果想要包含价格元素的容器 price_element_container price_element.parent or price_element.find_ancestor(lambda ancestor: ancestor.has_class(product)) target_element_selector price_element_container.generate_css_selector or price_element_container.generate_full_css_selector # or xpath货币符号和数字被拆到不同节点时文档示例结构span classcurrency $ /span span classa-price 45,000 /span换成price_element_container page.find_by_regex(r[\d,], first_matchTrue).parent full_price_data price_element_container.get_all_text(stripTrue) # 文档示例此结构下返回 $45,000文档的建议是先覆盖最常见的价格模式再逐步补更冷门的正则能省掉 AI 费用。find_by_text/find_by_regex的公共参数有first_match默认True、case_sensitive、clean_matchfind/find_all过滤器和find_similar找出与已知元素相似的其它元素的完整用法见 元素选择文档。第二步站点改版后用 adaptive 找回同一元素结构变化后用同一选择器加adaptiveTrueScrapling 会取出之前保存的唯一属性与页面所有元素做相似度匹配返回得分最高的元素element page.css(#p1, adaptiveTrue)如果元素是用非 CSS 选择方式路径 B找到的改用手动保存 重定位# 用自命名 identifier 保存文档建议像变量名一样起有意义的名字 page.save(element, my_special_element) # 之后取回并在改版后的页面中重定位 element_dict page.retrieve(my_special_element) page.relocate(element_dict, selector_typeTrue)selector_typeTrue时返回 Scrapling 的Selector对象不传则是lxml.etree对象。验证改版前后找到的是不是同一元素文档用 Wayback Machine 上 Stack Overflow 的 2010 版与当前版做“结构变化”验证选择器直接复用一条 Chrome 生成的路径选择器来选 Questions 按钮from scrapling.fetchers import Fetcher selector #hmenus div:nth-child(1) ul li:nth-child(1) a old_url https://web.archive.org/web/20100102003420/http://stackoverflow.com/ new_url https://stackoverflow.com/ Fetcher.configure(adaptiveTrue, adaptive_domainstackoverflow.com) page Fetcher.get(old_url, timeout30) element1 page.css(selector, auto_saveTrue)[0] page Fetcher.get(new_url) element2 page.css(selector, adaptiveTrue)[0] if element1.text element2.text: print(Scrapling found the same element in the old and new designs!) # 文档示例两次抓取文本一致这里用adaptive_domainstackoverflow.com是因为存档页在archive.org域下Scrapling 按域隔离adaptive数据必须显式告诉它两个 URL 属于同一站点真实场景中两次请求访问同一域不需要该参数。adaptive_domain还适用于站点改版同时换了 URL 的情况——不传的话 Scrapling 会把新 URL 当作新站点并丢弃旧数据。成本对比文档给出的对比表AI 服务价格基于文档引用的 Browse AI Pricing 与 Oxylabs Web Scraper API PricingAspectScraplingAI 类服务如 Browse AI、Oxylabs成本结构免费或低成本无按次收费从 $19/月Browse AI到 $49/月Oxylabs起步随用量增长配置成本需要的技术背景较少手动配置常为无代码对非技术用户更友好使用方式代码、终端或 MCP server多为 GUI 或 API取决于厂商提供的形式扩展性取决于使用者自己的实现内置大规模托管支持适应性高靠adaptive和非选择器选择方法高AI 自动完成但频繁变化时费用高AI 方案的开销在于每次提取都要传递页面源码token 消耗或服务按用量计费Scrapling 一侧没有按页计费代价是前期搭建和维护时间。文档的取舍口径是价格、标题这类结构化字段先用正则/内容选择加adaptive保存模式实在无法覆盖时再考虑 AI。排查与限制No Matches Found没找到元素先确认数据是否保存过your-identifier替换为你自己的 identifier 字符串element_data page.retrieve(your-identifier) if not element_data: print(No data saved for this identifier)然后尝试旧 identifier或用新 identifier 重新保存products page.css(.product, adaptiveTrue, identifierold_selector) products page.css(.new-product, auto_saveTrue, identifiernew_identifier)Wrong Elements Matched匹配到错误元素改用更具体的选择器或用更多上下文保存文档示例选择器和文本需替换为你的目标页面products page.css(.product-list .product, auto_saveTrue) product page.find_by_text(Product Name).parent page.save(product, specific_product)文档明确给出的限制同一选择器命中多个元素时adaptive保存过程只保存第一个元素的唯一属性之后重定位也只返回第一个用逗号组合的选择器除外——它们会被拆开、各自独立执行不支持 XML feedadaptive只作用于 HTML域隔离url/adaptive_domain决定数据归属换域或换 URL 不声明时旧数据会被视为新站点而丢弃分页没有自动方法。文档说明当前没有直接提取分页 URL 的功能需要自己匹配常见模式如page.find_by_text(Next)[href]、page.find_by_text(load more)[href]或选择器a[href*?page]、a[href*/page/]。如果目标站点还带反爬验证码、指纹检测等文档给出的路线是DynamicFetcher基础隐身改进或StealthyFetcher可自动处理 Cloudflare Turnstile/Interstitial二者都基于 Chromium见 fetcher 选择与 StealthyFetcher 文档adaptive配置同样可以通过Fetcher.configure应用到这些 fetcher 上。【免费下载链接】Scrapling️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考