Scrapling:可靠网页抓取的免费 AI 替代方案¶
网页抓取长期用于提取数据、建立索引和准备数据集等任务。但有经验的用户仍会遇到一些反复出现的问题,影响工作效率。最近,越来越多人开始使用 AI 抓取网页,因为它有望解决其中一些难题。
本文会介绍这些常见问题、企业转向 AI 的原因、这种方案的不足,以及 Scrapling 如何在无需承担 AI 成本的情况下提供帮助。
常见问题和更难的目标¶
如果做过一段时间网页抓取,应该遇到过这些问题:
- 网站结构经常变化:网站会更新 DOM,导致固定的 XPath 或 CSS 选择器失效。
- 选择器不稳定:类名和 ID 经常变化,或使用随机值,导致抓取代码失效或更难编写。
- 反爬措施越来越复杂:CAPTCHA、浏览器指纹和行为分析让传统抓取方式更难奏效。
还有其他问题。即便只针对已知网站抓取、可以为每个网站编写专用代码,也会遇到这些情况。
如果目标更大,要从许多不同的网站抓取数据,也就是常说的 Broad Scraping 或 Generic Web Scraping,上述问题会更严重,还会出现新的难题:
- 网站差异很大:通用抓取程序要处理各种 HTML 结构、CSS 用法、JavaScript 框架和后端技术。
- 识别有用数据:面对从未见过的页面,抓取程序怎么知道哪些数据重要?
- 分页方式不同:无限滚动、传统分页和“加载更多”按钮,都需要不同的处理方法。
问题还不止这些。如何手动解决?这里说的是没有共同技术基础的不同网站。
AI 能帮忙,但成本很高¶
AI 能理解页面源码,找出需要的字段,或者为它们生成选择器,因此可以解决很多问题。当然,这要建立在已经使用其他工具处理好反爬保护的前提下 :)
我很喜欢这种方案,也觉得 AI,尤其是生成式 AI,很有意思。可能需要花很多时间编写和调整提示词。如果可以接受这一点,很快就会遇到这个场景中使用 AI 的真正问题。
很多页面包含大量内容,需要以某种方式传给 AI。这样会快速消耗 token,费用也会不断增加。
除非完全不在意预算,否则就会开始寻找更便宜的方案。这正是 Scrapling 能帮忙的地方
Scrapling 可以帮忙¶
Scrapling 可以处理网页抓取中几乎所有常见问题,接下来的更新还会逐步覆盖其余情况。
解决 T1:网站结构经常变化¶
这就是 adaptive 功能存在的原因。没错,还是要讲到它 :)
启用 adaptive 后,可以保存元素的特有属性。即使网站结构改变,也能在之后重新找到它。困难在于,元素的任何部分都可能变化,不一定有稳定属性可依赖。
这项功能会保存元素的全部特征。网站结构变化后,它返回与原元素相似度最高的元素。
我已经通过多个示例详细介绍过它,可以在这里继续阅读。
解决 T2:选择器不稳定¶
如果做过较长时间网页抓取,可能遇到过这样的页面:只有原始 HTML,没有 ID 或类名;类名随机生成;或者没有其他稳定特征可以用来选择元素。
此时,传统的 CSS 或 XPath 选择器不一定是最佳方案。因此,Scrapling 提供了另外三种选择方式:
- 按元素内容选择:用
find_by_text查找文本,或用find_by_regex通过正则表达式匹配文本。 - 选择与另一元素相似的元素:先找到一个元素,其余交给 Scrapling。
- 按条件筛选元素:指定元素需要满足的条件或过滤规则,让 Scrapling 来查找。
打开这些链接,就能了解各个场景的处理方式。
解决 T3:反爬措施越来越复杂¶
面对受保护的网站,仅靠代理和模拟人的操作可能不够。StealthyFetcher 将浏览器自动化、指纹调整和反爬处理选项结合起来。启用 solve_cloudflare=True,即可处理 Cloudflare Turnstile 和 Interstitial 验证。
解决 B1 和 B2:网站差异与有用数据识别¶
这个问题很难,但 Scrapling 的灵活性让它有了解法。
我曾和一位用户交流,他用 AI 从不同网站提取价格。他只关心价格和标题,所以让 AI 帮他定位价格。
我告诉他,这里不一定需要 AI,并给出了这个示例:
price_element = page.find_by_regex(r'£[\d\.,]+', first_match=True) # Get the first element that contains a text that matches price regex eg. £10.50
# If you want the container/element that contains the price element
price_element_container = price_element.parent or price_element.find_ancestor(lambda ancestor: ancestor.has_class('product')) # or other methods...
target_element_selector = price_element_container.generate_css_selector or price_element_container.generate_full_css_selector # or xpath
price_element_container = page.find_by_regex(r'[\d,]+', first_match=True).parent # Adjusted the regex for this example
full_price_data = price_element_container.get_all_text(separator="", strip=True) # Returns '$45,000' in this case
这个例子想说明的是:不是所有问题都需要 AI。有时换一种思路,就能节省很多费用。
解决 B3:分页方式不同¶
Scrapling 目前没有直接自动识别分页链接的方法。它的 Spider 使用 response.follow() 跟随分页链接。
不过,只要查找常见模式,就能覆盖很多网站。例如 page.find_by_text('Next')['href']、page.find_by_text('load more')['href'],或 'a[href*="?page="]'、'a[href*="/page/"]' 这样的选择器。思路就是如此。
成本对比与节省¶
下面是一个简单对比:
| 方面 | Scrapling | AI 工具,例如 Browse AI、Oxylabs |
|---|---|---|
| 成本 | 免费,使用库不按次数收费 | 付费套餐,价格取决于服务商和用量 |
| 设置 | 需要少量技术知识和手动设置 | 通常无需代码,对非技术用户更简单 |
| 使用方式 | 代码、终端或 MCP 服务器 | 通常是图形界面或 API,取决于服务商提供的方案 |
| 扩展到大规模 | 取决于用户的实现 | 托管服务内置大规模处理支持 |
| 适应变化 | 依靠 adaptive 和无需 CSS/XPath 选择器的方法,适应性强 |
AI 自动处理,适应性强,但频繁变化时费用较高 |
最新价格请参阅 Browse AI 和 Oxylabs Web Scraper API。
总结¶
AI 功能强大,但费用可能超出许多网页抓取任务的预算。Scrapling 提供可靠、灵活且低成本的工具,既能针对已知网站抓取,也能应对多种不同网站,往往可以避免使用昂贵的 AI 方案。借助 adaptive、多种选择方法和高级 Fetcher,可以更高效地编写能应对变化的抓取程序。
继续阅读文档,看看 Scrapling 如何简化接下来的网页抓取项目!