利用AI爬虫轻松爬取页面HTML

69 阅读4分钟

前言

在没有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 方法的结果输出到控制台。

image.png 最后按照我们prompt中的指定格式输出了,返回了电影的图片链接,标题,评分和描述。

小结

我们ai爬虫的核心就是发送http请求后,爬取HTML内容,然后解析我们选定的特定元素在本文中为.indent,并将解析出来的HTML传递给大模型进行进一步处理,实现非常简单,感兴趣的小伙伴可以动手试一试,希望对大家有帮助。