当爬虫学会思考——AI 驱动的爬虫技术系列(一)

0 阅读6分钟

引言

最近和朋友聊天,被问到一个很有意思的问题:"AI 会不会把我们爬虫工程师替代掉?"

说实话,我也好奇答案。所以接下来我会花点时间,把市面上几个比较火的 AI 爬虫项目好好研究一遍,整理成一系列文章,和大家一起看看:AI 在爬虫领域的真实能力边界在哪里。

一、AI 爬虫的两种进化路径

目前市面上比较火的 AI 爬虫项目,大致可以分为两个方向:

方向一:完整的 AI 爬虫框架
以 Crawl4AI、Firecrawl 为代表。 这类项目试图从头构建一个"为 AI 而生的爬虫"。有点类似最初的通用爬虫, 给出 url、deepth 等信息, 就可以直接获取数据, 开箱即用。

方向二:AI 辅助的逆向调试工具
以 MCP 生态为代表。 这类项目不直接提供爬取能力, 而是通过连接浏览器、自动分析网络请求、识别 API 接口等等方式来帮助我们进行分析, 更多的是作为一种工具的形式存在。

Crawl4AI

顺着之前的思路,我们先从方向一的代表项目 Crawl4AI 开始,看看这类 AI 框架到底好不好用,它在爬虫领域中的定位究竟是什么。

项目地址: github.com/unclecode/c…

文档地址: docs.crawl4ai.com/

安装

没什么好说的, 参考官网就行, 简单过一遍。

# Install the package
pip install -U crawl4ai

# For pre release versions
pip install crawl4ai --pre

# Run post-installation setup
crawl4ai-setup

# Verify your installation
crawl4ai-doctor

如果浏览器安装失败, 可以手动安装。

python -m playwright install --with-deps chromium

调用

项目上给了一个最简单的调用示例如下。

import asyncio
from crawl4ai import *

async def main():
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(
            url="https://www.baidu.com",
        )
        print(result.markdown)

if __name__ == "__main__":
    asyncio.run(main())

运行结果如下, 可以看到已经将网页内容整理为 markdown 格式, 很方便后续使用。

image.png mrakdown 结果示例

也提供命令行调用的方式如下。

# 命令行调用
crwl https://www.baidu.com -o markdown

甚至可以基于页面内容做问答。

# Use LLM extraction with a specific question
crwl https://www.baidu.com -q "该页面的标题是什么?"

image.png 问答效果展示

原理

看起来效果还是相当可以的, 很简单就实现了需求, 接下来我们聊聊它是怎么做到的。

相信有细心的朋友会发现安装是依赖于 playwright 的, 这个东西做爬虫的朋友应该是很熟悉的, 它是一个自动化浏览器工具, 和 selenium 类似, 介绍我放在这里, playwright.bootcss.com/docs/intro。

image.png craw4AI 处理流程图

可以看到它其实是基于浏览器自动化技术, 拉起一个无头浏览器来获取数据的, 后续结合大模型最终得到结果。不过也有一些有意思的创新点, 比如它通过算法实现了广告的过滤、以及通过纯算法实现了 markdown 的转换, 这些我们后边可以简单介绍一下。

优缺点

知道了原理, 其实优缺点也就很明显了。

相比于传统的爬虫技术, 它不需要你来考虑页面结构、也不需要去分析接口, 开箱即用, 其实是相当方便的。

但是同样的, 基于浏览器自动化来做, 也会有额外消耗浏览器资源, 存在效率低、可操作性差、有额外的大模型费用等等问题。

拓展

一起看看文档, 找找有意思的功能, 方便我们在项目中用到。

Adaptive Crawling

首先是这个 Adaptive Crawling, 相较于传统的通用爬虫, 这里引入了 embedding 模型, 可以通过一些语意比对, 来实现传统爬虫无法做到的过滤, 增加数据的精准度, 文档参考这里, docs.crawl4ai.com/core/adapti…

config = AdaptiveConfig(
    strategy="embedding",

    # Model configuration
    embedding_model="sentence-transformers/all-MiniLM-L6-v2",
    embedding_llm_config=None,  # Use for API-based embeddings

    # Query expansion
    n_query_variations=10,  # Number of query variations to generate

    # Coverage parameters
    embedding_coverage_radius=0.2,  # Distance threshold for coverage
    embedding_k_exp=3.0,  # Exponential decay factor (higher = stricter)

    # Stopping criteria
    embedding_min_relative_improvement=0.1,  # Min improvement to continue
    embedding_validation_min_score=0.3,  # Min validation score
    embedding_min_confidence_threshold=0.1,  # Below this = irrelevant

    # Link selection
    embedding_overlap_threshold=0.85,  # Similarity for deduplication

    # Display confidence mapping
    embedding_quality_min_confidence=0.7,  # Min displayed confidence
    embedding_quality_max_confidence=0.95  # Max displayed confidence
)
C4A-Script

为了覆盖各种情况(比如登录), 它做了一套自己的语言, 用来完成页面点击、输入等各种操作, 文档放在这里,docs.crawl4ai.com/core/c4a-sc…

# My first C4A-Script
GO https://duckduckgo.com

# Wait for the search box to appear
WAIT `input[name="q"]` 10

# Type our search query
TYPE "Crawl4AI"

# Press Enter to search
PRESS Enter

# Wait for results
WAIT `.results` 5
Fit Markdown

它提供了一些过滤器, 例如 PruningContentFilter、BM25ContentFilter, 可以实现一些垃圾信息(页面广告、标题栏等等)的过滤, 我看来这个功能其实相当实用的, 可以再次提高数据的精准度, 文档如下, docs.crawl4ai.com/core/fit-ma…

# PruningContentFilter
prune_filter = PruningContentFilter( threshold=0.5, threshold_type="fixed", min_word_threshold=10 ) md_generator = DefaultMarkdownGenerator(content_filter=prune_filter) config = CrawlerRunConfig(markdown_generator=md_generator)

# BM25ContentFilter
bm25_filter = BM25ContentFilter(
    user_query="health benefits fruit",
    bm25_threshold=1.2
)
md_generator = DefaultMarkdownGenerator(content_filter=bm25_filter)
config = CrawlerRunConfig(markdown_generator=md_generator)
markdown 生成

最后聊一下 markdown 的生成方式吧, 开始以为是用的大模型, 研究后发现也是通过算法来实现的, 这里也简单的聊一下。

他在 fit markdown 过滤的基础上, 使用了 html2text 来完成对 markdown 格式的转换, html2text 项目地址放下边, 感兴趣的可以学习下, github.com/Alir3z4/htm…

其他的一些做浏览器自动化中存在的特性, 例如代理、文件、钩子等等, 还有业务方面的容错、持久化等等问题, 项目都有完善的处理, 这里就不细说了, 有兴趣可以自行翻阅文档。

总结

了解下来其实可以看到, 它的优缺点也很明显。 如果需要大量数据的话, 它并不合适。应该说它在某些方面替代了自动化爬虫任务, 在知识库、一次性数据需求方面应该会有不错的表现, 但是还做不到对传统爬虫的完全替代。

下一期计划是先聊聊 mcp 方向, 对于爬虫逆向分析来说, 还是有些作用的。

这部分的东西我也是边学习边记录下来和大家分享, 如果哪里有问题, 还希望大家能积极指出, 一起进步。

有意思的项目也可以留言一起学习。

请洒潘江,各倾陆海云尔。