还在使用传统爬虫吗?来看看AI怎么爬虫

1,479 阅读4分钟

从零构建AI爬虫项目

在现代Web开发中,运用爬虫来收集数据和处理任务越来越重要,同时随着AI的出现,传统的爬虫已经被淘汰了,现在我们来实现创建一个高效的AI爬虫项目。

实现流程

  • 1.初始化项目为后端项目。
  • 2.安装好相应版本的爬虫依赖。
  • 3.利用JavaScript ES6版本 模块化特性,导入模块。
  • 4.实例化爬虫应用,OpenAI。
  • 5.使用爬虫库x-crawl里面的crawlPage方法,发送HTTP请求。
  • 6.处理响应、解构赋值、定义选择器、获取元素内容。
  • 7.交给大模型处理获取的内容,选择输出的格式。

实现过程

1.初始化项目为后端项目

每个Node.js都是以一个package.json文件开始。它定义了项目的元数据、依赖。dependencies包含了运行项目时必备的库,devDependencies则包含仅在开发过程中使用的工具。

npm init -y

2.安装好相应版本的爬虫依赖

安装好爬取页面所需的的依赖项。

  • 依赖项
"dependencies": {
    "x-crawl": "^10.0.2"
  }
  • 命令
npm install

效果目录:

587e5c0d9ac2869ede613ef718f0d0d.png

3.利用JavaScript ES6版本 模块化特性,导入模块

在 ES6 模块系统中,当你使用大括号 {} 导入成员时,这些名称必须与导出模块中定义的命名导出完全匹配。这意味着你不能随意自定义这些名称;它们必须准确反映源模块中提供的导出名称。

import { 
  createCrawl,  // 返回爬虫实例
  createCrawlOpenAI // openai 配置项
} from 'x-crawl';

但是,你可以通过提供别名来为导入的成员指定不同的本地名称。这允许你在自己的代码中使用更符合上下文或者避免命名冲突的名字。这是通过在导入语句中使用 as 关键字来实现的。

import { 
    createCrawl as createWebCrawler, // 使用别名为 createWebCrawler 
    createCrawlOpenAI as createAICrawler // 使用别名为 createAICrawler 
  } from 'x-crawl';

4.实例化爬虫应用,OpenAI

实例化爬虫应用

const cralwApp = createCrawl({
  maxRetry: 3,
  intervalTime: { max: 2000, min: 1000}
})
  • maxRetry: 3

    • 表示如果初次请求失败,爬虫将最多再尝试两次(总共三次)。一旦达到这个上限而仍未成功,则认为此次抓取任务失败,并可能触发相应的错误处理逻辑。
  • intervalTime: { max: 2000, min: 1000 }

    • 定义了每次重试之间等待的时间范围,单位是毫秒。这里的意思是在每次重试之前,爬虫会在 1 到 2 秒之间随机选择一个时间进行等待。
    • 这种做法有助于分散请求,避免短时间内频繁请求给目标服务器造成过大压力,同时也降低了被目标网站识别为恶意行为的风险。

实例化OpenAI

const crawlOpenAIApp = createCrawlOpenAI({
  clientOptions: {
    apiKey: 'Your-API_Key',
    baseURL: 'https://api.302.ai/v1/'
  },
  defaultModel: {
    chatModel: 'gpt-4-turbo-preview'
  }
})
  • clientOptions 对象:这是传递给 createCrawlOpenAI 的配置对象中的一个属性,用于指定与 OpenAI API 通信所需的客户端选项。

  • defailtModel 对象:定义默认使用的AI模型配置。

    • chatModel: 指定了默认的聊天模型。

5.使用爬虫库x-crawl里面的crawlPage方法,发送HTTP请求

向指定网址发送http请求,这里我们指定的是豆瓣电影。

cralwApp.crawlPage('https://movie.douban.com/chart') 

6.处理响应、解构赋值、定义选择器、获取元素内容

.then(async (res) => {
    const{page,browser} = res.data
    const targetSelector = '.indent' // 定义选择器
    await page.waitForSelector(targetSelector)
    const highkyHTML = await page.$eval(
      targetSelector,
      (el) => el.innerHTML
    )

这里我们可以打印res(response)看看请求成功后返回的对象内容。

705b9e1f1a1a7ff6c1be7b20cf94ee7.png

  • res.data

    • page:这是一个页面实例(Puppeteer 的 Page 对象),它代表了加载的目标网页。你可以通过这个对象来执行各种页面交互操作,比如点击按钮、填写表单或提取内容。
    • browser:这是一个浏览器实例(Puppeteer 的 Browser 对象)。虽然在这个特定的例子中没有直接使用 browser,但它可以用来管理多个页面或执行更高级别的浏览器控制任务。
  • .indent

    • 定义选择器,用于后续定位页面上的特定元素-
  • 获取元素内容

    • 这里调用了 page.$eval 方法,它首先找到匹配选择器的第一个元素,然后在该元素上下文中执行提供的函数 (el) => el.innerHTML,最终返回选定元素的 HTML 内容作为字符串。

7.交给大模型处理获取的内容,选择输出的格式

将上述获取元素内容交给大模型,然后通过聊天的形式,给予大模型提示,定义输出的格式、想要获取的内容。

const result = await crawlOpenAIApp.parseElements(
      highkyHTML,
      `获取图片链接、电影名称、电影评分、电影简介
      输出格式为json 数组
      如:
      [{
        "src":"...",
        "title":"...",
        "score":"...",
        "desc":"..."
      }]
      `
    )

这里使用了...扩展运算符

image.png

当然也可以把输出结果写入文件里面,以及指定想要获取的特定元素数据。

// 下载图片
    cralwApp.crawlFile({
        targets:result.elements[1].src,
        storeDirs:'./upload'
    })

d640c1a02ba20ce9ca09b66b3060486.pngimage.png

总结

传统爬虫讲解传统Node.js爬虫实战:从TopHub抓取热榜数据并保存至CSV文件

通过上述步骤,我们不仅实现了高效的数据抓取,还借助 AI 技术提升了数据解析的准确性和灵活性,使整个爬虫项目更加智能和强大。这种方法为开发者提供了一种现代化的方式来构建复杂且可靠的网络爬虫系统。