☰
不写选择器的爬虫怎么写:ScrapeGraphAI 自然语言抓取完整指南
2026/10/6 14:45:02 网站建设 项目流程

不写选择器的爬虫怎么写:ScrapeGraphAI 自然语言抓取完整指南

【免费下载链接】Scrapegraph-aiPython scraper based on AI项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapegraph-ai

写爬虫最耗时间的环节往往不是写代码,而是对着网页一层层找 CSS 选择器:页面一改版,选择器就全失效,得重新来一遍。有没有办法只说人话就要数据?

ScrapeGraphAI 就是一个基于 AI 的 Python 爬虫框架:你用一句自然语言描述要抓什么,它自己打开网页、清洗内容、再让大模型输出结构化的 JSON。你不需要再维护 XPath,也不需要手写 BeautifulSoup 的选择器逻辑。

下面按"装环境 → 跑第一个爬虫 → 换模型 → 扩展场景 → 排查问题"的顺序带你走完整个流程,每一步都能直接复制运行。

两条命令装好环境,再给模型留好位置

最快配置方法:pip 装包加浏览器内核

ScrapeGraphAI 抓取网页时依赖 Playwright 这个浏览器自动化内核(可以理解成"程序能操控的一个浏览器"),所以装库之后还要补装一次浏览器:

# 直接装 PyPI 发布版,建议在虚拟环境里操作 pip install scrapegraphai # 抓取网页内容依赖 Playwright 内核,必须补装 playwright install

包要求 Python 3.10 及以上(见 pyproject.toml 的 requires-python)。如果你还想改源码做二次开发,可以 clone 仓库(gitcode 地址:https://gitcode.com/GitHub_Trending/sc/Scrapegraph-ai)后执行pip install -e .。

免 API key 的本地模型路线

不想配 API key 的话,本地跑一个 Ollama 模型最省事。仓库里自带了一份 docker-compose 配置,一条命令就能把 Ollama 容器拉起来:

# 用仓库自带配置启动本地 Ollama,再拉聊天模型和向量模型 docker-compose up -d ollama pull llama3 ollama pull nomic-embed-text

聊天模型负责"理解页面并回答问题",向量模型(embedding)负责把文本切成可检索的片段,两者各拉一个即可。

SmartScraperGraph 全流程:一句 prompt 到一份 JSON

四个节点各自干了什么

最常用的管道类是 SmartScraperGraph,它把抓取拆成四个串联的节点,输入是"URL 或本地文件 + 一句 prompt",输出是 JSON 字典:

  • Fetch:用 Playwright 打开页面,拿到完整 HTML
  • Parse:把 HTML 清洗成纯文本,去掉标签噪音
  • RAG:长页面会切成带重叠的块并做向量检索,只把相关片段喂给模型,规避上下文长度限制
  • Generate Answer:大模型按你的 prompt 作答,输出 JSON;多块的多个答案在最后一步自动合并

四步跑通第一个爬虫

第 1 步:完成上面环境的两条安装命令。

第 2 步:确认ollama list里能看到 llama3(或你已配好某个云端 API)。

第 3 步:新建一个scraper.py,写入最小脚本:

from scrapegraphai.graphs import SmartScraperGraph graph_config = { "llm": {"model": "ollama/llama3.2", "format": "json"}, "verbose": True, # 打印各节点日志,方便排查 "headless": False, # 调试期让浏览器窗口可见 } scraper = SmartScraperGraph( prompt="提取公司简介、创始人和社交媒体链接", source="https://example.com/", # 也可以指向本地 HTML 文件 config=graph_config, ) print(scraper.run())

第 4 步:运行python scraper.py,控制台先刷出各节点日志,最后打印一个 JSON 字典,键名对应你 prompt 里要的信息。

模型怎么配:本地与云端只改一个配置段

本地模型:model 前缀加 base_url

本地模型的写法是把模型名加上ollama/前缀。如果 Ollama 不在本机(比如跑在 Docker 或另一台机器上),加一个base_url指过去,默认值是http://localhost:11434:

graph_config = { "llm": { "model": "ollama/llama3", "temperature": 0.0, "base_url": "http://localhost:11434", # 非本机 Ollama 时改这里 }, "embeddings": {"model": "nomic-embed-text"}, # 向量模型可单独指定 }

云端 API:其余代码一行不用动

换云端模型只需替换llm段,参考仓库里 OpenAI 示例 的写法:

# 换成云端模型只改 llm 段,其余代码不动 graph_config = { "llm": { "api_key": os.getenv("OPENAI_APIKEY"), # 从环境变量读,别硬编码 "model": "openai/gpt-4o-mini", }, "verbose": True, }

除 OpenAI 外,Gemini、Groq、Azure、Anthropic、Hugging Face 等都有现成写法,完整示例见 LLM 配置文档;任何 LangChain 兼容的模型还可以直接传model_instance。

单页不够用:多页、搜索与文件类图怎么选

内置图的输入输出速查表

ScrapeGraphAI 内置了二十多个管道类(完整列表见 graphs 模块),常见几个的输入输出如下,选图前先对号入座:

图(类名)输入典型场景
SmartScraperGraphURL 或本地文件 + prompt单页结构化抽取
SmartScraperMultiGraph多个 URL + 一句 prompt批量抓同一结构的多个页面
SearchGraph只有 prompt先搜互联网,再抓排名前 n 条结果
SpeechGraphURL + prompt抽取信息并生成音频文件
ScriptCreatorGraphURL + prompt产出一段可复用的 Python 抓取脚本
DocumentScraperGraphPDF / HTML 等文档解析本地文档
CSVScraperGraph / XMLScraperGraph / JSONScraperGraph对应格式文件表格与结构化文件抽取
DepthSearchGraph起始页 + prompt顺着页面内部链接深入抓取

多 URL 批量抓与搜索式抓取

批量抓多个页面时,source直接传一个列表,prompt 只写一次(参考 多 URL 示例):

from scrapegraphai.graphs import SmartScraperMultiGraph multi = SmartScraperMultiGraph( prompt="Who is ?", source=["https://perinim.github.io/", "https://perinim.github.io/cv/"], # 多 URL 传列表 schema=None, config=graph_config, ) print(multi.run())

如果你连要抓哪个网址都还不知道,用 SearchGraph:它先按你的 prompt 搜一遍互联网,再对搜索结果并行跑多个 SmartScraperGraph,最后把答案合并成一份 JSON,max_results可以控制抓前 n 条结果:

输出为空或不对:按顺序做这几个排查动作

日志、浏览器窗口与代理轮换

官方 FAQ 给出的排查顺序基本可以照搬:先开verbose看哪个节点卡住,再把headless设为False(JS 重度渲染的页面常需要可见浏览器才能拿到内容),还不行就配代理轮换 IP。仓库内置了基于 free-proxy 的免费代理池,"server": "broker"即可启用:

graph_config = { "llm": {...}, "verbose": True, # 输出每个节点的日志 "headless": False, # JS 动态页面关掉无头模式 "loader_kwargs": { "proxy": {"server": "broker"}, # 免费代理池自动轮换 }, "cache_path": "cache/", # 结果缓存,避免重复请求 }

再进一步的话,可以装pip install scrapegraphai[burr]后运行burr命令,把整条管道的执行状态用图形界面画出来,具体参数见 图配置文档。另外注意:框架会收集匿名使用统计,介意的话设置环境变量SCRAPEGRAPHAI_TELEMETRY_ENABLED=false即可关闭。

换个模型再试一次

同一个页面不同模型的效果可能差很多,换模型是最便宜的变量。本地 llama 不行就试云端 gpt-4o 系列,或在llm里加"model_tokens"声明更大的上下文长度,让 RAG 节点一次塞入更多内容。

从 BeautifulSoup 和 Selenium 迁过来要改什么

选择器逻辑换成 prompt

传统写法里soup.select('div.news > h2')这类选择器,直接替换成一句 prompt,例如prompt="提取 class 为 news 的 div 下所有 h2 标题文本"。页面改版后你不需要再改代码——模型是按语义找内容,而不是按固定的标签路径。

浏览器等待和反爬交给内核

Selenium 时代手动写的time.sleep、显式等待、driver 管理都不需要了:Fetch 节点由 Playwright 托管整页加载,反爬层面则交给上一节的代理轮换配置。迁移成本主要集中在 prompt 的措辞上——描述越具体,输出的键名越稳定。

继续深入的三个文档入口

  • LLM 配置参考:各模型 provider 的配置写法与 base_url、model_instance 用法
  • 图配置参数说明:verbose、headless、代理、Burr 可视化等全部可调参数
  • 官方示例库:smart_scraper、search_graph、csv/xml/json 等各类图的完整可运行示例

装好环境、跑通第一个 SmartScraperGraph 之后,你可以直接从示例库里挑一个最接近自己业务的图开始改,这是上手最快的路径。

【免费下载链接】Scrapegraph-aiPython scraper based on AI项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapegraph-ai

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询