x-crawl- Node.js中的多功能爬虫库

170 阅读3分钟

为什么说现在用传统爬虫爬取数据已经逐渐退出舞台了? 我们当然知道现在代码由于AI的逐渐强大,变得越来越好写。有数不清的简单爬虫方法的情况下,代码的可读性和复杂性都远低于传统爬虫代码。我们完全可以在一个项目里完成多个项目的功能。

在这种环境下,你还使用传统爬虫,就像游戏里,你明明有空投枪可以用,你却偏偏要用小手枪。

今天我们就来介绍一个能把AI与爬虫结合起来的一个库:x-crawl。它的强大,在使用之后你就会懂的。

x-crawl

x-crawl 是 Node.js 的辅助爬虫库。有灵活的使用方式和强大的 AI 辅助功能,使爬虫工作变得更加高效、智能和便捷。

一般我们只使用其中的两个功能,OpenAI和爬虫。

为什么说它是多功能的呢?

支持爬动态页面、静态页面、接口数据以及文件数据

灵活性高:单个爬取 API 都适配多种配置,每种配置方式都各有千秋。

实战

介绍完毕后,我们直接开始实战。开着车就往房区横冲直撞,不吃鸡今天不能休息。

万变不离其宗,还是老样子,初始化和安装依赖。想要吃鸡,第一步,跳伞必须得最快。

npm init -y

在生成的package.json文件中,加入依赖:

  "dependencies": {
    "x-crawl":"^10.0.2"
  }

并把最上方的版本号改为:

"version": "0.0.1"

随后再到终端输入npm i 安装...

这样最适合使用,此时完成第一步,你可以跟队友说了:兄弟们我一伞,跳精标,这把吃了!

版本号

这里拓展一下:版本号有什么意义呢?

  • 1.0.0 1主版本 0次更新 0 bug修复
  • 2.0.0 版本大更新
  • 2.2.0 添加了某项功能
  • 2.2.1 bug 修复 第一位代表一个程序的版本,就像游戏更新赛季一样。一般都有着影响游戏模式的更新。

第二位代表更新了游戏中的某个部分,但不影响主要的部分。就像特殊时期增添了一些特殊模式。

第三位代表修改了某些bug,还依稀记得2年前,LOL秒杀大龙只需要一枪,比日本那位都要脆一点...也可以叫做热补丁,需要紧急修改。

一个成熟的程序,肯定有过多次的版本更迭,让自身的功能更加完善。

主程序

正式开始第一步,导包:

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

这里我们从x-crawl中解构出了两个方法

const [coach,...players] =["米卢","李铁","孙继科","范志毅"]
// ... rest 运算符
console.log(coach,players)

image.png 依稀记得国足世界杯啊,米卢教练,范大将军,李铁等球员。我们可以用 结构运算符... 也叫拓展符。 这里的意思是第一个设置为教练,...后面的为players。

想要完成爬虫,先实例化一个爬虫项目再说吧...

const crawlApp = createCrawl({
    maxRetry:3, // 最多请求三次连接
    intervalTime:{ max:2000 , min:1000 } // 请求的时间间隔
})

男人好像总是对次数十分敏感

想要用openAI,咱们得用上api和大模型吧...

const crawlOpenAIApp = createCrawlOpenAI({
   clientOptions:{
      apiKey:'你自己的apikey',
      baseURL:'自己的转发地址'
   },
   defaultModel:{
    chatModel:'gpt-4-turbo-preview', // 使用的模型
   }
})

心都在滴血啊,居然用gpt4,家里有矿吗...杀鸡焉用牛刀,嗄个人机难道还要用我的AWM?

如果有不会弄apikey和转发地址的,可以私信...

crawlApp.crawlPage('https://movie.douban.com/chart') // 发送请求

又是这哥们,每次示范爬虫好像都是爬豆瓣...

.then(async (res) => { const { page, browser } = res.data; // 处理响应

页面交互和浏览器属性

await page.waitForSelector(targetSelector);
const highlyHTML = await page.$eval(
targetSelector,
(el) => el.innerHTML );

等待选择器和提取html内容 AI爬虫核心就是解析indent,打开网页源码找到indent,就是我们要爬取的内容了...

好似开了DMA,游戏刚开始就知道最后的圈刷在哪里...

image.png

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

要想AI 用的好,prompt是关键!

意识够好,枪不准也没用啊。

此时我们已经挺进决赛圈,能不能吃鸡就看这一运行了...

激动的心颤抖的手...

image.png 好在完美运行了,终于可以下班了。这队友还是很给力的...

前几篇文章讲到了用cursor生成爬虫

现在又是另一个方法。

希望大家从中收获些什么...

这里源码附上,求个三连...

// es6 模块化 导包
// 结构运算符
import{
  createCrawl,   // 返回爬虫实例
 createCrawlOpenAI  // openai 配置项
} from 'x-crawl';

// 实例化爬虫应用
const crawlApp = createCrawl({
    maxRetry:3,
    intervalTime:{ max:2000 , min:1000 }
})

const crawlOpenAIApp = createCrawlOpenAI({
   clientOptions:{
      apiKey:'你自己的apikey',
      baseURL:'自备转发地址'
   },
   defaultModel:{
    chatModel:'gpt-4-turbo-preview',
   }
})

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":"....",
      "title":"....",
      "score":"....",
      "desc":"...."
      }]
      `
   )
      browser.close();
      console.log(result)

})

希望大家做成一夜七次郎,把把吃鸡...