结合大模型与爬虫的数据提取实践
本文探讨了将大模型能力应用于网页爬虫数据提取的新玩法。通过测试大模型对豆瓣电影页面 HTML 的解析能力,验证了其提取结构化数据的可行性。文章展示了基于 requests 和 OpenAI SDK 的手动实现方案,并介绍了更高效的 ScrapeGraphAI 框架,实现了仅需 URL 和提示词即可完成请求与提取。同时指出了 Token 限制、成本及速度等潜在问题,为开发者提供了一种利用 AI 简化非结构化数据获取的思路。

本文探讨了将大模型能力应用于网页爬虫数据提取的新玩法。通过测试大模型对豆瓣电影页面 HTML 的解析能力,验证了其提取结构化数据的可行性。文章展示了基于 requests 和 OpenAI SDK 的手动实现方案,并介绍了更高效的 ScrapeGraphAI 框架,实现了仅需 URL 和提示词即可完成请求与提取。同时指出了 Token 限制、成本及速度等潜在问题,为开发者提供了一种利用 AI 简化非结构化数据获取的思路。

最近在学习大模型的过程中,我突发奇想能否将大模型的能力结合爬虫,搞个 AI 爬虫玩一玩。本文将测试大模型的数据提取能力,并展示两种实现方案。
首先,我们将一段豆瓣电影列表的 HTML 交给大模型,让大模型帮我们提取其中的数据。
<table width="100%" class="">
<tbody><tr class="item">
<td width="100" valign="top">
<a class="nbg" href="https://movie.douban.com/subject/34453198/" title="梦境">
<img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2910694617.webp" width="75" alt="梦境" class="">
</a>
</td>
<td valign="top">
<div class="pl2">
<a href="https://movie.douban.com/subject/34453198/" class="">
梦境
/ <span style="font-size:13px;">仙境 / Wonderland</span>
</a>
<p class="pl">2024-06-05(韩国) / 汤唯 / 裴秀智 / 朴宝剑 / 郑有美 / 崔宇植 / 孔刘 / 鲍起静 / 崔武成 / 全秀芝 / 韩国 / 金泰勇 / 113 分钟 / 梦境 / 剧情 / 爱情 / 科幻 / 金泰勇 Tae-Yong Kim / 韩语 / 英语 / 汉语普通话</p>
<div class="star clearfix">
<span class="allstar30"></span>
<span class="rating_nums">6.4</span>
<span class="pl">(6899 人评价)</span>
</div>
</div>
</td>
</tr>
</tbody></table>
提示词如下:
这是一段电影列表,去获取电影名(name),封面链接(picture),简介(info),评分(score), 评论人数(commetsNumber),请使用括号的单词作为属性名,以 JSON 数组的格式返回
大模型的返回结果如下:
[
{
"name": "梦境",
"picture": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2910694617.webp",
"info": "2024-06-05(韩国) / 汤唯 / 裴秀智 / 朴宝剑 / 郑有美 / 崔宇植 / 孔刘 / 鲍起静 / 崔武成 / 全秀芝 / 韩国 / 金泰勇 / 113 分钟 / 梦境 / 剧情 / 爱情 / 科幻 / 金泰勇 Tae-Yong Kim / 韩语 / 英语 / 汉语普通话",
"score": "6.4",
"commentsNumber": "6899 人评价"
},
{
"name": "犯罪都市 4",
"picture": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2903301473.webp",
"info": "2024-02-23(柏林电影节) / 2024-04-24(韩国) / 马东锡 / 金武烈 / 李东辉 / 朴智焕 / 李主傧 / 金敏载 / 金英熊 / 韩国 / 许明行 / 110 分钟 / 犯罪都市 4 / 动作 / 犯罪 / 惊悚 / 吴相浩 Sang-ho Oh / 韩语 / 英语 / 菲律宾语 / 汉语普通话",
"score": "6.6",
"commentsNumber": "23916 人评价"
}
]
发现可以提取到数据,接下来我们编写代码实现。
这段代码用于获取页面 HTML,然后交给大模型去提取数据。注意,如果将所有获取到的页面 HTML 都交给大模型,Token 数量可能会超限,建议缩小 HTML 范围进行测试。
import requests
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
# 需要配置自己的 api_key
client = OpenAI()
url = "https://movie.douban.com/chart"
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=header)
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
return response.choices[0].message.content
# 将获取到的页面 HTML 片段交给大模型
prompt = "{} 这是一部电影的 html 片段。获取需要电影名(name),封面链接(picture),简介 (info), 评分(score),评论人数(commentsNumber)。请使用括号的单词作为属性名,以 JSON 数组的格式返回".format(response.text)
print(get_completion(prompt))
如果觉得上述代码比较粗糙,可以使用专门的框架 ScrapeGraphAI。该框架发送请求、数据提取全都交给了大模型去处理,整体代码非常简洁,只需要 URL 地址和提示词(Prompt)即可。
根据文档编写的案例如下:
import os
from dotenv import load_dotenv
from scrapegraphai.graphs import SmartScraperGraph
from scrapegraphai.utils import prettify_exec_info
import json
# 从.env 加载环境变量
load_dotenv()
# 从环境变量加载 openai key
openai_key = os.getenv("OPENAI_APIKEY")
# 配置 SmartScraperGraph
graph_config = {
"llm": {
"api_key": openai_key,
"model": "gpt-3.5-turbo",
},
}
# 创建 SmartScraperGraph 并运行
smart_scraper_graph = SmartScraperGraph(
prompt="获取需要电影名(name),封面链接(picture),简介 (info), 评分(score),评论人数(commentsNumber)。请使用括号的单词作为属性名,以 JSON 数组的格式返回",
# 接收一个 html 网页页面
source="https://movie.douban.com/chart",
config=graph_config
)
# 执行爬虫并保存结果
result = smart_scraper_graph.run()
with open("results.json", 'w', encoding='utf-8') as f:
json.dump(result, f, indent=4)
这种结合大模型与爬虫的方式提供了一种新的数据获取思路,特别适合处理非结构化或半结构化的网页内容,无需编写复杂的 CSS 选择器或正则表达式。
优点:
局限性:
开发者在测试时建议先缩小 HTML 范围,避免 Token 超限。目前尚未针对强反爬虫网站进行深度测试,实际应用中需注意合规性与反爬策略。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online