豆瓣兄又又对不起了——AI爬虫实例

244 阅读1分钟

刚学了点爬虫知识,立马就想到了我们的豆瓣老兄,今天就来爬上一爬(来了牢弟)。

image.png

一、AI爬虫的基本原理

AI爬虫的原理在于它结合了自动化访问、解析网页内容以及人工智能算法来处理动态变化的网站设计和内容。

二、开发前准备

1新建一个x-crawl文件夹然后在集成终端打开(备注:vscode编译器),执行npm init -y 命令。 之后得到package.json文件(确保你安装了node.js)。对package.json文件作如下添加和修改

修改前 屏幕截图 2024-12-09 112818.png

修改后 屏幕截图 2024-12-09 112917.png

命令行输入npm i json-server,最后建一个index.mjs(作为 ES6 模块来处理)编写代码。 最终文件目录:

image.png

代码实例:

// es6 模块化 导包
// 解构运算符
import { 
    createCrawl,  // 返回爬虫实例
    createCrawlOpenAI // openai 配置项
  } from 'x-crawl';
  
  // 实例化爬虫应用
  const crawlApp = createCrawl({
    maxRetry: 3,
    intervalTime: { max: 2000, min: 1000}
  })
  
  const crawlOpenAIApp = createCrawlOpenAI({
    clientOptions: {
      apiKey: 'bbb',
      baseURL: 'https://api.302.ai/v1/'
    },
    defaultModel: {
      chatModel: 'gpt-4-turbo-preview'
    }
  })
  
  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);
        //  console.log(highlyHTML);
        const result = await crawlOpenAIApp.parseElements(
            highlyHTML,
            `获取图片链接、电影名称、平分、简介
            输出格式为json 数组.
            如:[{
            "src":"....",
            "title":"...",
            "score":"...",
            "desc":"..."

            }]
            `
        )
        browser.close();

        console.log(result);

        
    })


代码解释:

通过 import 语句从 x-crawl 模块中导入 createCrawl 和 createCrawlOpenAI 两个函数。createCrawl 函数用于创建一个爬虫应用实例,createCrawlOpenAI 函数用于配置 openai 的相关选项。

接着,使用 createCrawl 函数创建了一个名为 crawlApp 的爬虫应用实例,在调用该函数时传入一个对象作为参数,其中 maxRetry 属性设置为 3,表示最大重试次数为 3,intervalTime 属性是一个对象,包含 max 为 2000 和 min 为 1000 的时间范围,可能用于控制爬虫的请求间隔时间。

然后,使用 createCrawlOpenAI 函数创建了一个名为 crawlOpenAIApp 的 openai 配置实例,传入的对象包含 clientOptions,其中 apiKey 为 'bbb'baseURL 为 'https://api.302.ai/v1/',以及 defaultModel 包含 chatModel 为 'gpt-4-turbo-preview',用于配置 openai 的客户端选项和默认模型。

之后,调用 cralwApp.crawlPage 方法对 https://movie.douban.com/chart 页面进行爬取操作,这里存在一个错误,应该是 crawlApp 而不是 cralwApp。该方法返回一个 Promise,后续使用 .then 方法处理爬取结果。

在 .then 方法中,接收一个异步函数作为回调,当 crawlPage 操作完成后,会将结果作为 res 参数传递给这个回调函数。从 res.data 中使用解构赋值提取出 page 和 browser 两个属性,它们可能是与页面操作和浏览器实例相关的信息。

定义了一个常量 targetSelector 并赋值为 '.indent',用于在页面中定位元素。

使用 page.waitForSelector 方法等待页面中出现与 targetSelector 匹配的元素,使用 await 关键字确保在元素出现或超时之前暂停程序执行。

使用 page.$eval 方法查找与 targetSelector 匹配的元素,将该元素作为参数传递给回调函数 (el) => el.innerHTML,提取该元素的 innerHTML 属性,将结果存储在 highlyHTML 变量中。

调用 crawlOpenAIApp.parseElements 方法,将 highlyHTML 和一段描述解析要求的字符串作为参数,期望将结果以 JSON 数组的形式输出。

最后,调用 browser.close() 关闭浏览器,并使用 console.log 打印 result

运行node index.mjs爬取数据

屏幕截图 2024-12-08 100941.png