前言
网络爬虫(Web Crawler)是自动化获取网页数据的核心技术,主要依靠编写代码解析网页结构并模拟浏览器行为。随着人工智能技术的发展,尤其是大型语言模型(LLM)的兴起,为爬虫技术带来了新的范式。与传统的硬编码模式不同,结合 AI 大模型与提示词工程(Prompt Engineering),可以显著提高开发效率,实现更智能的数据解析和提取。
前置知识
在深入讲解之前,我们需要明确爬虫的基本流程。以爬取豆瓣电影 Top250 数据为例,目标是从 HTML 结构中定位并提取电影名称、评分、简介等信息。
传统爬虫实现
核心思路
传统编程方式通常遵循以下步骤:
- 发起请求:使用 HTTP 库(如 Python 的
requests 或 JavaScript 的 axios)向目标 URL 发送请求。
- 接收响应:获取服务器返回的 HTML 内容(字符串或字节流)。
- 解析 HTML:利用解析器(如 BeautifulSoup, Cheerio, lxml)构建 DOM 树。
- 选择元素:通过 CSS 选择器或 XPath 定位包含数据的节点。
- 提取数据:从节点中获取文本、属性值等。
- 数据处理:清洗脏数据、格式化、去重。
- 存储数据:写入文件、数据库或 API。
- 循环处理:处理分页或列表页。
代码示例(JavaScript)
以下是一个基于 Node.js 环境爬取豆瓣电影 Top250 的完整示例,使用了 request-promise 和 cheerio。
const request = require('request-promise');
const cheerio = require('cheerio');
const fs = require('fs').promises;
let movies = [];
const basicUrl = 'https://movie.douban.com/top250';
function getMovieInfo(node) {
const $ = cheerio.load(node);
const titles = $('.info .hd span').map((i, el) => $(el).text()).get();
const bd = $('.info .bd');
const info = bd.find('p').text().trim();
const score = bd.find('.star .rating_num').text().trim();
return { titles: titles[0] || '', info, score };
}
async function getPage(url, num) {
try {
const html = await request({ url });
console.log(`正在爬取第${num + 1}页数据`);
const $ = cheerio.load(html);
const movieNodes = $('#content .article .grid_view .item');
const movieList = [];
movieNodes.each((i, node) => {
movieList.push(getMovieInfo(node));
});
return movieList;
} catch (error) {
console.error(`Page ${num} failed:`, error.message);
return [];
}
}
async function main() {
const count = 25;
let list = [];
for (let i = 0; i < count; i++) {
const url = `${basicUrl}?start=${25 * i}`;
const pageData = await getPage(url, i);
list.push(...pageData);
await new Promise(resolve => setTimeout(resolve, 1000));
}
console.log(`共获取 ${list.length} 条数据`);
await fs.writeFile('./output.json', JSON.stringify(list, null, 2), 'utf-8');
console.log('生成 json 文件成功!');
}
main().catch(console.error);
运用 AI 大模型辅助爬虫
利用大模型 API,可以将部分复杂的解析逻辑转化为自然语言指令,降低对 DOM 结构的依赖,提高灵活性。
核心思路
- 基础爬取:先获取原始 HTML 片段。
- Prompt 设计:构造清晰的指令,要求模型提取特定字段并输出结构化数据(如 JSON)。
- API 调用:将 HTML 片段发送给大模型。
- 结果处理:解析模型返回的 JSON 数据。
代码示例(Python + 通义千问)
此示例演示了如何结合 Python 爬虫与大模型 API 进行数据提取。
import requests
from bs4 import BeautifulSoup
import dashscope
import json
dashscope.api_key = 'YOUR_API_KEY'
def fetch_movie_list(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
movies = soup.select('#wrapper #content .article .item')[:2]
all_movies_text = ''.join([movie.prettify() for movie in movies])
return all_movies_text
else:
print("Failed to retrieve content")
return ""
url = 'https://movie.douban.com/chart'
movies_html = fetch_movie_list(url)
prompt = f"""
这是一个电影列表的 HTML 片段:
{movies_html}
任务:从中提取电影名(name)、封面链接(picture)、简介(info)、评分(score)、评论人数(commentsNumber)。
要求:只返回一个标准的 JSON 数组,不要包含 Markdown 格式或其他解释性文字。
"""
def call_qwen_with_prompt():
messages = [
{'role': 'user', 'content': prompt}
]
try:
response = dashscope.Generation.call(
model=dashscope.Generation.Models.qwen_turbo,
messages=messages
)
if response.status_code == 200:
result = response.output.choices[].message.content
data = json.loads(result)
(data)
:
()
Exception e:
()
call_qwen_with_prompt()
运用 OpenAI 分析用户评论情感
除了数据提取,大模型还可以用于非结构化数据的分析,例如情感判断。
步骤说明
- 引入依赖:使用
openai SDK 和 dotenv 管理密钥。
- 实例化客户端:配置 API Key 和 Base URL。
- Few-Shot Prompting:提供示例让模型理解任务模式。
- 调用 Chat Completions:发送包含新评论的 Prompt。
代码示例(Node.js)
const OpenAI = require('openai');
require('dotenv').config();
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: 'https://api.chatanywhere.tech/v1'
});
async function analyzeSentiment() {
const prompt = `
判断一下的用户情感是正面还是负面的
评论:买的银色版真的好看,一天就到了,晚上就开始拿起来玩,系统很丝滑流畅,做工扎实,手感细腻,很精致哦,华为一如既往好品质
情感:正面
评论:随意降价,不予保价,服务态度差
情感:负面
评论:小狗很可爱,但是动物毛发过敏
情感:
`;
const chatCompletions = await client.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [{ role: 'user', content: prompt }],
n: 1,
});
console.log(chatCompletions.choices[0].message.content);
}
analyzeSentiment();
Python 与 JavaScript 对比
在实际开发中,选择哪种语言取决于项目需求。以下是两者的主要区别:
| 特性 | Python | JavaScript |
|---|
| 语言类型 | 通用编程语言,语法简洁,适合脚本和数据分析 | Web 开发主导,全栈能力,前端交互必备 |
| 编程范式 | 支持多范式(面向过程、面向对象、函数式) | 面向对象为主,支持函数式编程 |
| 异步编程 | 使用 asyncio,模型相对复杂 | 原生支持 Promise 和 async/await,生态成熟 |
| 类型系统 | 动态强类型 | 动态弱类型,推断能力强 |
| 爬虫生态 | requests, scrapy, selenium 极其丰富 | axios, cheerio, puppeteer 表现优秀 |
对于 AI 集成场景,Python 拥有更丰富的 LLM 库(如 LangChain, HuggingFace),而 JavaScript 在 Web 端直接调用 API 更为便捷。
最佳实践与注意事项
1. 提示词工程优化
在使用大模型进行爬虫时,Prompt 的质量直接影响结果稳定性。
- 明确约束:指定输出格式(如 JSON Schema)。
- 减少干扰:要求模型忽略无关标签。
- Few-Shot:提供少量正确示例可显著提升准确率。
2. 安全与合规
- 遵守 Robots.txt:尊重网站的爬取协议。
- 频率控制:添加随机延时,避免 IP 被封禁。
- 隐私保护:不爬取个人隐私数据,符合相关法律法规。
3. 错误处理
- 重试机制:网络波动时需自动重试。
- 异常捕获:解析失败时应记录日志而非直接崩溃。
- Token 限制:注意大模型的输入长度限制,必要时分片处理。
总结
本文对比了传统爬虫编程与基于 AI 大模型的爬虫实现方式。通过豆瓣电影数据爬取示例,展示了使用 Cheerio 和 BeautifulSoup 的传统流程,以及利用 Prompt 工程让大模型解析 HTML 并提取结构化数据的方案。文章还分析了 Python 与 JavaScript 在异步处理、类型系统及生态上的差异,探讨了 AI 辅助编程如何提升开发效率及扩展情感分析等智能功能的可能性。未来,随着模型能力的增强,AI 将在数据清洗、反爬对抗等领域发挥更大作用。