你可能不知道的AI爬虫技术😊~

1,401 阅读5分钟

前言

在数据获取的领域,传统爬虫技术已经能够解决许多问题。然而,随着人工智能(AI)的发展,AI驱动的爬虫开始崭露头角,为数据采集带来了新的可能性和效率提升。下面使用AI爬虫进行演示AI爬取豆瓣电影首页内容。对比传统爬虫

image.png

一、环境准备

为了构建一个基于AI的爬虫应用,您需要完成以下环境准备工作:

  • 需要拥有node.js环境
  • 创建一个文件夹,使用npm init -y初始化项目
  • 我们需要用到两个库:dotenvx-crawl
  1. 引入必要的库

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

这里,xy 变量直接从 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' 包中导入 createCrawlcreateCrawlOpenAI 函数,以及如何加载 .env 文件中的环境变量到 process.env 中,以便在整个应用中使用。

3.AI爬虫逻辑

接下来的部分实现了爬取豆瓣电影排行榜页面的内容,并利用 OpenAI 的 API 对抓取的数据进行解析,最后保存图片到本地目录。以下是具体步骤:

  1. 创建爬虫实例:通过 createCrawl 创建了一个名为 crawlApp 的爬虫实例,设置了最大重试次数和爬取间隔时间。

  2. 创建 OpenAI 客户端createCrawlOpenAI 函数根据传入的 clientOptionsdefaultModel 配置创建了一个 OpenAI 客户端 crawlOpenAIApp

  3. 发起爬取请求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'
    }
})
  1. 等待选择器出现page.waitForSelector 方法等待页面上出现目标选择器 .indent 所对应的元素。

  2. 提取 HTML 内容:使用 $eval 方法获取目标选择器下的 HTML 内容,并将其赋值给 highlyHTML

  3. 解析 HTML:调用 crawlOpenAIApp.parseElements 方法,传递 highlyHTML 和指令字符串,要求 OpenAI 返回 JSON 格式的电影信息列表。

  4. 保存图片:从解析结果中获取第一个元素的图片链接,使用 crawlFile 方法下载图片并保存到指定目录。

  5. 关闭浏览器:完成所有操作后,调用 browser.close() 关闭浏览器实例。

  6. 错误处理:如果过程中发生任何错误,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);
   })

image.png

总结

AI爬虫相对传统爬虫代码简洁和适用性更高,能提升业务能力。仅仅通过调用AI接口,使用promt工程就可以实现对应业务

赶快去试一试吧 😊~~