不写选择器的爬虫怎么写: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 模块),常见几个的输入输出如下,选图前先对号入座:
| 图(类名) | 输入 | 典型场景 |
|---|---|---|
| SmartScraperGraph | URL 或本地文件 + prompt | 单页结构化抽取 |
| SmartScraperMultiGraph | 多个 URL + 一句 prompt | 批量抓同一结构的多个页面 |
| SearchGraph | 只有 prompt | 先搜互联网,再抓排名前 n 条结果 |
| SpeechGraph | URL + prompt | 抽取信息并生成音频文件 |
| ScriptCreatorGraph | URL + prompt | 产出一段可复用的 Python 抓取脚本 |
| DocumentScraperGraph | PDF / 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),仅供参考