前言
在没有AI没有问世前,我们想要编写一个功能完善的网络爬虫是一个复杂且耗时的任务,但随着AI技术的发展,我们可以轻松的利用大模型来完成一个爬虫技术。
本文将展示如何利用最新的AI技术和工具,结合简洁的JavaScript代码,快速搭建一个功能完善的网络爬虫,以抓取和解析豆瓣电影排行榜的数据。我们将详细介绍每个步骤,并解释关键代码段的作用,帮助读者理解和掌握这一现代化的爬虫构建方法,话不多说,我们直接开搞。
具体实现
首先来介绍我们今天需要使用到的库x-crawl
,它是一个灵活的Node.js AI辅助爬虫库,拥有强大的AI辅助功能,想要具体了解的可以去它的官网 x-crawl看看,里面详细介绍了库的每一个功能以及如何使用,让初学者也能轻松上手。
ok介绍完成之后我们还是老规矩,初始化一个后端项目,然后安装我们使用的x-crawl
库:
npm init -y
npm i x-crawl
初始化完成之后在我们的package.json
文件中加入我们的依赖x-crawl
使用的是10.0.2
版本:
"dependencies":{
"x-crawl":"^10.0.2"
}
为了更加贴合企业开发和严谨,这里我们将版本从1.0.0
改为0.0.1
虽然这只是一个小小的demo,但是我们要养成一个良好的程序员素质,接下来我们创建一个index.mjs
文件用来编写我们今天的代码,mjs
后缀为es6
新加入的一种命名后缀,支持我们模块化设计导入需要的包:
import {
createCrawl, // 负责返回爬虫实例
createCrawlOpenAI // openai 配置项
} from 'x-crawl';
这边我们利用{}
解构运算符来获取x-crawl
中我们需要的功能,因为库中的功能太多,我们全部导入不仅会多利用内存也会加大工作量,所以我们只取我们需要的两项。
然后我们先实例化一个爬虫应用,命名为crawlApp
:
// 实例化爬虫应用
const crawlApp = createCrawl({
maxRetry:3, // 最大重试次数为3次
intervalTime:{max: 2000,min: 1000}
})
这两行代码设置了爬虫的行为,懂得都懂
maxRetry
指定了在遇到请求失败时的最大重试次数,如果爬取失败了,它最多能重试3次。
intervalTime
定义了每次请求之间的随机间隔时间,如果你要一一直爬取一个网站,时间间隔最好长一些。
接下来我们创建一个爬虫应用实例,这边的LLM我们使用最牛的gpt4o:
const crawlOpenAIApp = createCrawlOpenAI({
clientOptions:{
apiKey: 'your key',
baseURL: 'https://api.302.ai/v1/'
},
defaultModel:{
chatModel:'gpt-4-turbo-preview'
}
})
这里我们还是使用国内的网站进行代理转发,可以不用梯子,如果没有的可以去302.AI - 全功能AI应用平台,按用量付费,开箱即用,开源生态注册一个,可以免费领取1美金,按次数使用能用很长一段时间。
然后我们开始实现功能,我们先爬取豆瓣电影排行榜的页面,等待页面元素加载,提取元素的html内容,然后使用parseElements
方法解析该 HTML 内容,最后关闭浏览器并输出解析结果。
crawlApp.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
)
const result = await crawlOpenAIApp.parseElements(
highlyHTML,
`获取图片连接、电影名称、电影评分、电影简介
输出格式为json数组。
如:
[{
"src":"...",
"tite":"...",
"score":"...",
"desc":"..."
}]
`
)
browser.close();
console.log(result)
})
-
crawlApp.crawlPage('https://movie.douban.com/chart')
:调用crawlApp
对象的crawlPage
方法,传入豆瓣电影排行榜的 URL 作为参数,开始对该页面进行爬取操作。 -
.then(async (res) => {...})
:使用.then
方法处理crawlPage
方法的异步结果。async
关键字表示该回调函数是一个异步函数。 -
const{ page,browser } = res.data;
:从res.data
中解构出page
和browser
对象,它们可能是与页面和浏览器相关的资源。 -
const targetSelector = '.indent';
:定义一个变量targetSelector
,存储一个 CSS 选择器.indent
,用于后续查找页面元素。await page.waitForSelector(targetSelector);
:等待页面中出现targetSelector
所指定的元素。
-
const highlyHTML = await page.$eval(targetSelector, (el) => el.innerHTML);
:使用page.$eval
方法,根据targetSelector
找到元素,并将该元素的innerHTML
存储在highlyHTML
变量中。 -
const result = await crawlOpenAIApp.parseElements(highlyHTML,...)
:调用crawlOpenAIApp
对象的parseElements
方法,将highlyHTML
和一段prompt作为参数,该prompt说明了要从highlyHTML
中提取的信息(图片连接、电影名称、电影评分、电影简介)以及期望的输出格式(JSON 数组),你也可以给出你想要爬取的内容的限制,给它一个明确具体的需求和 -
browser.close();
:关闭浏览器资源,释放资源。 -
console.log(result)
:将parseElements
方法的结果输出到控制台。
最后按照我们prompt中的指定格式输出了,返回了电影的图片链接,标题,评分和描述。
小结
我们ai爬虫的核心就是发送http请求后,爬取HTML内容,然后解析我们选定的特定元素在本文中为.indent
,并将解析出来的HTML传递给大模型进行进一步处理,实现非常简单,感兴趣的小伙伴可以动手试一试,希望对大家有帮助。