从传统编程到 AI 大模型与 Prompt 驱动的爬虫技术
对比了传统爬虫与基于 AI 大模型的爬虫实现方式。通过 JavaScript 和 Python 示例,展示了使用 Cheerio 等传统库解析 HTML 的步骤,以及利用通义千问和 OpenAI API 结合 Prompt 进行数据提取和情感分析的方法。文章还分析了 Python 与 JavaScript 在异步编程、类型系统等方面的区别,探讨了大模型如何提升爬虫效率及灵活性,为开发者提供了智能化数据获取的新思路。

对比了传统爬虫与基于 AI 大模型的爬虫实现方式。通过 JavaScript 和 Python 示例,展示了使用 Cheerio 等传统库解析 HTML 的步骤,以及利用通义千问和 OpenAI API 结合 Prompt 进行数据提取和情感分析的方法。文章还分析了 Python 与 JavaScript 在异步编程、类型系统等方面的区别,探讨了大模型如何提升爬虫效率及灵活性,为开发者提供了智能化数据获取的新思路。

爬虫主要依靠编写代码实现对网页结构的解析,通过模拟浏览器行为获取目标数据。随着人工智能技术的发展,LLM 大模型的出现为爬虫技术带来了新的思路。与传统的编程模式不同,使用 AI 大模型结合 Prompt 可以显著提高程序员的编程效率。通过结合人工智能和自然语言处理技术,开发者可以更加高效地编写爬虫代码,并实现对网页内容的智能解析和提取。
本文以爬取豆瓣电影 Top250 数据为例进行讲解。
HTML 结构示意: [图片:HTML 结构示意]
传统编程爬取一个网页并获取数据的步骤如下:
// 引入所需模块
let request = require('request-promise') // 用于发起 HTTP 请求
let cheerio = require('cheerio') // 用于解析 HTML
let fs = require('fs') // 用于文件操作
const util = require('util')
// 存储电影信息的数组
let movies = []
// 豆瓣电影 Top250 的基础 URL
let basicUrl = 'https://movie.douban.com/top250'
// 用于确保回调函数只执行一次的函数
let once = function (cb) {
let active = false
if (!active) {
cb()
active = true
}
}
// 打印信息到控制台
function log(item) {
once(() => {
console.log(item)
})
}
// 解析电影信息的函数
function getMovieInfo(node) {
let $ = cheerio.load(node) // 使用 Cheerio 解析 HTML
let titles = $('.info .hd span') // 选择标题元素
titles = ([]).map.call(titles, t => {
return $(t).text() // 提取标题文本
})
let bd = $('.info .bd') // 选择信息所在的父元素
let info = bd.find('p').text() // 提取电影信息
let score = bd.find('.star .rating_num').text() // 提取评分
return { titles, info, score } // 返回电影信息对象
}
// 获取页面数据的异步函数
async function getPage(url, num) {
let html = await request({
url
}) // 发起 HTTP 请求获取页面 HTML
console.log('连接成功!', `正在爬取第${num + 1}页数据`)
let $ = cheerio.load(html) // 使用 Cheerio 加载 HTML
let movieNodes = $('#content .article .grid_view').find('.item') // 选择电影节点
let movieList = ([]).map.call(movieNodes, node => {
return getMovieInfo(node) // 解析电影信息
})
return movieList // 返回电影信息列表
}
// 主函数
async function main() {
let count = 25 // 要爬取的页数
let list = []
// 循环爬取每一页的数据
for (let i = 0; i < count; i++) {
let url = basicUrl + `?start=${25 * i}` // 构造每一页的 URL
list.push(... await getPage(url, i)) // 将每一页的数据添加到列表中
}
console.log(list.length)
// 将结果写入到 JSON 文件
fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {
console.log('生成 json 文件成功!')
})
}
main() // 调用主函数开始执行
这里爬取的页面是豆瓣电影电影评分页面,但是整体 HTML 结构思路是一样的。
通过上述传统编程的爬虫步骤,我们可以思考哪些步骤是可以从程序员手中释放,交给大模型的呢?
下面代码运用了通义千问 API,需要先在控制台的 API_KEY 管理中获得密钥。
import requests
from bs4 import BeautifulSoup
import dashscope
def fetch_movie_list(url):
# 设置 HTTP 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
# 发送 HTTP GET 请求获取页面内容
response = requests.get(url, headers=headers)
# 检查响应状态码
if response.status_code == 200:
# 使用 BeautifulSoup 解析 HTML 响应
soup = BeautifulSoup(response.text, 'html.parser')
movie_list = []
# 使用 CSS 选择器提取电影信息
movies = soup.select('#wrapper #content .article .item')
# 提取前两部电影的 HTML 内容并拼接成字符串
all_movies_text = ''.join([movie.prettify() for movie in movies[:2]])
return all_movies_text
else:
print("Failed to retrieve content")
# 调用 fetch_movie_list 函数获取电影信息
url = 'https://movie.douban.com/chart'
movies = fetch_movie_list(url)
print(movies)
# 构建提示信息
prompt = f"""
{movies}这是一段电影列表,去获取电影名(name),封面链接(picture),简介(info),评分(score),
评论人数(commentsNumber),请使用括号的单词作为属性名,以 JSON 数组的格式返回
"""
print(prompt)
dashscope.api_key = '自己的密钥'
def call_qwen_with_prompt():
messages = [
{
'role': 'user',
'content': prompt
}
]
response = dashscope.Generation.call(
dashscope.Generation.Models.qwen_turbo,
messages=messages,
result_messages=
)
(response)
call_qwen_with_prompt()
通过上述对比,可以看出使用 API+Prompt 的爬虫方式相比传统爬虫方式更加方便、高效,并且具有更多的灵活性和扩展性。传统爬虫需要编写复杂的代码来处理 HTTP 请求、解析网页内容和存储数据,而使用 API+Prompt 的方式,只需调用相应的 API 接口,提供简洁明确的提示信息,即可获得生成的回复或结果,省去了繁琐的编码工作。
此外,API+Prompt 的方式还可以借助强大的 AI 模型来进一步分析和处理数据,实现更深层次的理解和生成相关内容。通过输入不同的提示信息,可以根据需求定制化地获取所需的数据或生成特定的回复,极大地丰富了爬虫应用的可能性。
这段代码是一个使用 OpenAI GPT-3.5 Turbo 模型进行情感判断的示例。
const OpenAI = require('openai')
require('dotenv').config();
openai 库被引入,用于与 OpenAI API 进行通信。同时,dotenv 库也被引入,用于从环境变量中获取 API 密钥。
将密钥存储在
.env文件中有几个好处:
- 安全性: 将敏感信息如 API 密钥放在环境变量中,而不是直接硬编码在代码中,可以提高安全性。
- 易管理: 使用
.env文件可以更轻松地管理多个环境的配置。- 简洁性: 通过使用环境变量,代码可以更简洁,不需要在代码中硬编码密钥,提高了可读性和维护性。
- 避免提交到版本控制:
.env文件通常会被添加到.gitignore中,这样就可以避免将敏感信息提交到版本控制系统中。
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: 'https://api.chatanywhere.tech/v1'
})
通过 OpenAI 构造函数创建一个 OpenAI 客户端实例,传入 API 密钥和 API 的基础 URL。
let prompt = `判断一下的用户情感是正面还是负面的
评论:买的银色版真的好看,一天就到了,晚上就开始拿起来玩,系统很丝滑流畅,
做工扎实,手感细腻,很精致哦,华为一如既往好品质
情感:正面
评论:随意降价,不予保价,服务态度差
情感负面
`
let myPrompt = `
${prompt}
评论:小狗很可爱,但是动物毛发过敏
情感:
`
这个操作的目的在于利用 OpenAI 的模型(在这里是 GPT-3.5-turbo)来填补这些留白的情感标签。通过将用户新增的评论和空白情感标签组合起来,我们可以让 AI 模型理解新增评论的情感,并给出相应的情感标签。这样做的好处是实现情感分类,即确定新增评论是正面的还是负面的,从而更好地理解用户的情感倾向。
const chatCompletions = await client.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [
{ role: 'user', content: myPrompt }
],
n: 1,
})
通过调用 client.chat.completions.create() 方法,使用 GPT-3.5 Turbo 模型进行聊天式的文本生成。
// 引入所需的依赖
const OpenAI = require('openai'); // 引入 OpenAI Node.js SDK
require('dotenv').config(); // 引入 dotenv 库,用于加载环境变量
// 实例化 OpenAI 客户端
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY, // 从环境变量中获取 OpenAI API 密钥
baseURL: 'https://api.chatanywhere.tech/v1' // 设置 OpenAI API 的基本 URL
});
// 异步函数,用于执行主要逻辑
async function main() {
// 设置要输入给模型的提示文本
let prompt = `判断一下的用户情感是正面还是负面的
评论:买的银色版真的好看,一天就到了,晚上就开始拿起来玩,系统很丝滑流畅,
做工扎实,手感细腻,很精致哦,华为一如既往好品质
情感:正面
评论:随意降价,不予保价,服务态度差
情感负面
`;
let myPrompt = `
${prompt}
评论:小狗很可爱,但是动物毛发过敏
情感:
`;
// 发送请求给 OpenAI API,获取聊天的回复
const chatCompletions = await client.chat.completions.create({
model: 'gpt-3.5-turbo', // 使用的模型版本
messages: [{ role: 'user', content: myPrompt }], // 用户的消息
n: 1 // 生成一条回复
});
// 打印返回的聊天回复
.(chatCompletions.[]);
}
();
文章交叉使用了两种语言,旨在介绍这两种语言如何通过大模型来实现人工智能,并强调大模型的出现让前端开发更为便利,不再必须依赖 Python 等后端技术。以下是它们的一些区别:
语言类型:
编程范式:
异步编程:
类型系统:
语法:
本文详细介绍了从传统编程爬虫到 AI 大模型驱动爬虫的技术演进。通过对比 JavaScript 和 Python 的实现,展示了如何利用 Cheerio 等传统库以及通义千问、OpenAI 等大模型 API 来提升数据获取的效率与智能化水平。大模型不仅简化了代码编写,还赋予了爬虫情感分析等深度处理能力。开发者可根据项目需求选择合适的语言与技术栈,充分利用 AI 能力优化数据处理流程。

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