随着互联网的不断增长和信息量的爆炸式增加,有效地从网页中提取有用的数据变得越来越重要。传统的爬虫(Web Crawler)技术已经广泛应用于搜索引擎、市场研究、舆情监测等领域。然而,面对复杂的现代网站结构和丰富的多媒体内容,传统方法显得力不从心。这时,结合了人工智能(AI)算法的新型爬虫------AI爬虫应运而生。本文将探讨AI爬虫的工作原理、其与传统爬虫的区别以及未来的发展趋势。
一.准备环境
为了能够将AI运用进爬虫之中,我们先需要准备以下环境:
- 安装node.js脚手架
- 创建一个文件夹,并用
npm init -y
将文件夹初始化为后端项目。 - 导入两个库:
dotenv
和x-crawl
。
dotenv
:是一个运用于Node.js的库,可以将 .env
文件中的APIkey、数据库连接字符串等敏感信息加载到 process.env
中,来保护这些信息,以防被修改或被他人获取。
x-crawl
:是一个结合了传统爬虫技术和AI算法的Web数据采集框架,非常适合来爬取复杂多变的网站。此外,x-crawl
还为开发者提供了灵活的接口和丰富的特性,使它能够完成大规模应用开发的任务。
二.安装
我们可以通过手动修改 package.json
文件,在其中的 dependencies
字段添加所需要的库和版本号,在执行 npm i
来安装。
JavaScript
{
"name": "x-crawl",
"version": "0.0.1",
"main": "index.mjs",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"x-crawl": "^10.0.2",
"dotenv":"^16.4.7"
}
}
三.爬取数据
在这里,我们将爬取豆瓣的电影榜单。
1.导包
JavaScript
import {
createCrawl, // 返回爬虫实例
createCrawlOpenAI // openai 配置项
} from 'x-crawl';
创建 index.mjs
文件。在这里使用ES6是为了更好的导包和后期维护。
2.实例化爬虫应用
JavaScript
const cralwApp = createCrawl({
maxRetry: 3,
intervalTime: { max: 2000, min: 1000}
})
通过 createCrawl
创建一个名为 crawlApp
的实例对象。并设置最大爬取次数和爬取间隔。
3.实例化OpenAI
php
const crawlOpenAIApp = createCrawlOpenAI({
clientOptions: {
apiKey: 'sk-DQyFVvlYDkVEcwRy1uY6WOkEz0AUhGeQRdSQ0mXKA4JgCp8M',
baseURL: 'https://api.302.ai/v1/'
},
defaultModel: {
chatModel: 'gpt-4-turbo-preview'
}
})
同样的通过 createCrawlOpenAI
创建一个 crawlOpenAIApp
实例对象。
clientOptions 是创建客户端时传递的一组配置选项,来设置 APIkey
和 baseURL
等一些基础选项。
defaultModel 是设置初始模型,在这我们选择 chatModel
中的 gpt-4-turbo-preview
模型。
4.发送爬取请求
JavaScript
cralwApp.crawlPage('https://movie.douban.com/chart')
.then(async (res) => {
const { page, browser } = res.data;
const targetSelector = '.indent';
await page.waitForSelector(targetSelector);
const highlyHTML = await page.$eval(
targetSelector,
(el) => el.innerHTML
)
通过调用 cralwApp
上的 crawlPage
方法,来打开豆瓣热门电影的网页并返回一个Promise,其中包含页面对象和其他信息。
用 .then
来处理由 crawlPage
返回的 Promise。当页面加载完成并且解析完Promise,就会执行回调函数中的代码。 async
关键字表示这个回调函数是异步的,允许我们使用 await
来等待其他 Promise 操作。
运用了解构的方法从 res.data
中提取出 page
和 browser
对象。 page
是一个 Puppeteer 页面实例,代表当前加载的网页;browser
则是浏览器实例,可用于管理整个浏览器会话。
这定义了一个 CSS 选择器字符串 '.indent'
,用于定位页面上的特定元素。根据豆瓣电影排行榜页面的设计,.indent
可能是用来包裹电影列表内容的 HTML 元素。
使用 page.waitForSelector()
方法等待直到页面中出现与 targetSelector
匹配的元素。这确保了在继续下一步之前,页面已经完全加载并渲染了所需的元素。
使用 page.$eval
是将一个选择器和一个函数作为参数。它首先查找与给定选择器匹配的第一个元素,然后在这个元素上下文中执行提供的函数,并将结果返回给调用者。el.innerHTML
获取了由 .indent
选择器选中的第一个元素内部的 HTML 内容,并将其赋值给变量 highlyHTML
。
5.限定回答
JavaScript
const result = await crawlOpenAIApp.parseElements(
highlyHTML,
`
获取图片链接、电影名称、电影评分、电影简介
输出格式为json 数组。
如:
[{
"src": "...",
"title": "...",
"score": "...",
"desc": "..."
}]
`
)
browser.close();
console.log(result)
调用 crawlOpenAIApp
对象的 parseElements
方法,解析爬取的内容(highlyHTML
)并提取出所需要的结果,以JSON数组的形式返回。用 browser.close()
关闭浏览器。
小拓展
1.版本号
在一开始的 package.json
文件中出现了 version": "0.0.1
。这表示当前的爬虫框架是最初版本,还处于测试阶段。 现在最常用的版本号格式是 语义化版本控制(Semantic Versioning, SemVer) ,其基本形式为 MAJOR.MINOR.PATCH
:
- 主版本号 (MAJOR) :当做了不兼容的 API 修改时增加。
- 次版本号 (MINOR) :当以向后兼容的方式添加功能时增加。
- 修订号 (PATCH) :当进行向后兼容的问题修复时增加。
例如:
- 1.0.0 :表示第一个正式发布的稳定版本。性能完全、可以用于商业并对用户负责。
- 1.1.0 :表示在当前版本下添加了一些新功能。
- 2.0.0 :表示进行了重大更新,和之前的功能有许多不同,需要用户重新适应。
- 2.0.1 :表示修复 2.0.0 中的一些BUG问题。
2.解构
在从 res.data
中提取出 page
和 browser
对象时运用了解构的方法。 解构是以一种更加简洁的方式从复杂变量中获取一些特定数据,使代码更加简洁和便于维护,提高代码的可读性。
JavaScript
const person = {
name: 'Alice',
age: 25,
};
// 解构赋值
const { name, age } = person;
console.log(name); // 输出: Alice
console.log(age); // 输出: 25
这里是将 name
和 age
的值直接获取并输出。
3.剩余运算符
剩余运算符(...)用于收集多个元素到一个数组或对象中,和解构相结合可以进一步处理数组和对象。
css
const [coach,...members] = ["米卢","李铁","孙继科","范志毅"]
// ...rest 运算符
console.log(coach,members)//输出 米卢 [ '李铁', '孙继科', '范志毅' ]
这里是将第一个米卢 作为教练独自归为一类,剩下的李铁 、孙继科 、范志毅则是作为球员归为一类。
总结
AI爬虫的出现代表了网络数据采集领域的前沿进展。随着技术的不断进步,我们预计未来的AI爬虫将变得更加智能、高效,同时遵守严格的法律和道德规范,确保数据的安全性和隐私保护。