前言
在数据获取的领域,传统爬虫技术已经能够解决许多问题。然而,随着人工智能(AI)的发展,AI驱动的爬虫开始崭露头角,为数据采集带来了新的可能性和效率提升。下面使用AI爬虫进行演示AI爬取豆瓣电影首页内容。对比传统爬虫
一、环境准备
为了构建一个基于AI的爬虫应用,您需要完成以下环境准备工作:
- 需要拥有node.js环境
- 创建一个文件夹,使用
npm init -y初始化项目 - 我们需要用到两个库:
dotenv和x-crawl
- 引入必要的库:
dotenv:这是一个广泛应用于 Node.js 项目的库,它允许开发者通过
.env文件来定义和加载环境变量,从而简化不同部署环境下的配置管理。使用环境变量可以帮助保护敏感信息,例如 API 密钥或数据库连接字符串,避免直接暴露在代码中。
x-crawl:这是一款功能强大且灵活的 Node.js 爬虫框架,旨在帮助用户高效、安全地抓取网页内容、API 接口以及文件资源。它的设计考虑到了现代网络爬虫的需求,提供了丰富的特性和简便的接口,非常适合快速原型开发和大规模生产部署。如果您希望深入了解
x-crawl的更多特性,请访问其官方文档以获取更多信息。
02| 安装方法
您可以选择两种方式之一来安装上述两个库:
-
通过
package.json添加依赖:编辑package.json文件,在"dependencies"字段中添加所需的库及其版本号,然后执行npm install或简写为npm i来安装所有列出的依赖项。例如:{ "dependencies": { "dotenv": "^16.4.7", "x-crawl": "^10.0.2" } } -
直接安装:如果您不想修改
package.json文件,可以直接在命令行中依次运行以下命令来安装每个库:npm install dotenv npm install x-crawl
03| 扩展: 版本号解读
语义化版本控制(Semantic Versioning, SemVer)是一种被广泛接受的版本号格式,它由三个数字组成,分别是主版本号(MAJOR)、次版本号(MINOR)和修订号(PATCH),中间用点号分隔。这种格式有助于清晰表达软件版本之间的变更程度和兼容性:
- 1.0.0:标志着一个稳定且成熟的商业版本。当项目达到这个阶段时,意味着它已经完成了预期的功能实现,并经过了全面测试,可以放心投入生产环境使用。
- 0.0.1:通常代表项目的首个发布版本,可能是预发布或实验性质的。此时,项目可能只包含了最基本的功能,还有许多待完善的地方。
- 2.0.0:表示项目引入了新的特性或者对现有功能进行了重大调整。这样的版本更新可能会引入不向后兼容的变化,因此需要开发者特别注意升级指南,以确保应用程序在新版本下仍然能够正常工作。
04| JavaScript 解构赋值
解构是一种从数组或对象中提取数据的方式,它简化了访问复杂数据结构中的元素的过程。下面是一些解构的例子:
数组解构
let arr = [1, 2, 3];
let [a, b, c] = arr;
console.log(a,b); // 输出 1 2
在这个例子中,我们从 arr 数组中按顺序将值分配给变量 a, b, 和 c。
对象解构
let obj = {x: 1, y: 2};
let {x, y} = obj;
console.log(x); // 输出 1
这里,x 和 y 变量直接从 obj 对象中获取对应的值。
剩余运算符
解构加上剩余运算符可以进一步处理数组和对象。剩余运算符 ... 用来收集不定数量的参数或元素。它可以用于函数参数、数组和对象解构中。以下是如何在解构中使用它的例子:
let [competion, ...likes] = ['vue', 'react', 'angular'];
console.log(competion); // 输出 'vue'
console.log(likes); // 输出 ['react', 'angular']
这里,competion 获取了数组的第一个元素,而 likes 收集了剩下的所有元素。
二、 AI爬虫代码部分
1.明确目标网站
这次爬的是豆瓣首页
2.爬虫模块化导入
建立入口文件,在文件夹下建立 (文件名.mjs)文件。这里使用ES6 模块系统,使得我们可以更加方便地组织和管理代码。通过 import 语句,我们可以按需导入所需的函数、类或对象。
import {
createCrawl,
createCrawlOpenAI
} from 'x-crawl';
import dotenv from 'dotenv';
dotenv.config();
上面的代码片段展示了如何从 'x-crawl' 包中导入 createCrawl 和 createCrawlOpenAI 函数,以及如何加载 .env 文件中的环境变量到 process.env 中,以便在整个应用中使用。
3.AI爬虫逻辑
接下来的部分实现了爬取豆瓣电影排行榜页面的内容,并利用 OpenAI 的 API 对抓取的数据进行解析,最后保存图片到本地目录。以下是具体步骤:
-
创建爬虫实例:通过
createCrawl创建了一个名为crawlApp的爬虫实例,设置了最大重试次数和爬取间隔时间。 -
创建 OpenAI 客户端:
createCrawlOpenAI函数根据传入的clientOptions和defaultModel配置创建了一个 OpenAI 客户端crawlOpenAIApp。 -
发起爬取请求:
crawlPage方法向指定 URL 发起请求,并在成功后执行回调函数。
const crawlApp = createCrawl({
maxRetry: 3,
intervalTime: {max: 2000, min: 100},
})
const crawlOpenAIApp = createCrawlOpenAI({
clientOptions: {
apiKey:'sk-...',
baseURL:'https://api.302.ai/v1/'
},
defaultModel:{
chatModel:'gpt-4-turbo-preview'
}
})
-
等待选择器出现:
page.waitForSelector方法等待页面上出现目标选择器.indent所对应的元素。 -
提取 HTML 内容:使用
$eval方法获取目标选择器下的 HTML 内容,并将其赋值给highlyHTML。 -
解析 HTML:调用
crawlOpenAIApp.parseElements方法,传递highlyHTML和指令字符串,要求 OpenAI 返回 JSON 格式的电影信息列表。 -
保存图片:从解析结果中获取第一个元素的图片链接,使用
crawlFile方法下载图片并保存到指定目录。 -
关闭浏览器:完成所有操作后,调用
browser.close()关闭浏览器实例。 -
错误处理:如果过程中发生任何错误,
catch块会捕获异常并将错误信息打印出来。
crawlApp.crawlPage('https://movie.douban.com/chart')
.then(async (res) => {
const {page,browser} = res.data;
const targetSelctor = '.indent'; //绑定indent
await page.waitForSelector(targetSelctor);// 等待页面出现指定选择器的元素
const highlyHTML = await page.$eval(
targetSelctor,
(el) => el.innerHTML,
)
const result = await crawlOpenAIApp.parseElements(
highlyHTML,
`
获取图片链接、电影名称、电影评分、电影简介
输出格式为json 数组。
如:
[{
"src": "...",
"title": "...",
"score": "...",
"desc": "..."
}]
`
)
crawlApp.crawlFile({
targets:result.elements[0].src,
storeDir: './upload'
})
browser.close();
console.log(result);
})
.catch((err) => {
console.log(err);
})
总结
AI爬虫相对传统爬虫代码简洁和适用性更高,能提升业务能力。仅仅通过调用AI接口,使用promt工程就可以实现对应业务
赶快去试一试吧 😊~~