首页 > 编程语言 >#yyds干货盘点#灵活的 Node.js 多功能爬虫库 —— x-crawl

#yyds干货盘点#灵活的 Node.js 多功能爬虫库 —— x-crawl

时间:2023-05-18 22:04:39浏览次数:52  
标签:Node yyds const js 爬取 item crawl targets 页面

x-crawl

x-crawl 是一个灵活的 Node.js 多功能爬虫库。灵活的使用方式和众多的功能可以帮助您快速、安全、稳定地爬取页面、接口以及文件。

如果你也喜欢 x-crawl ,可以给 x-crawl 存储库 点个 star 支持一下,感谢大家的支持!

GitHub:https://github.com/coder-hxl/x-crawl

特征

  • 异步同步 - 只需更改一下 mode 属性即可切换异步或同步爬取模式。
  • 多种用途 - 可爬页面、爬接口、爬文件以及轮询爬,满足各种场景需求。
  • 写法灵活 - 同种爬取 API 适配多种配置,每种配置方式都非常独特。
  • 间隔爬取 - 无间隔、固定间隔以及随机间隔,产生或避免高并发爬取。
  • 失败重试 - 避免因短暂的问题而造成爬取失败,自定义重试次数。
  • 轮换代理 - 配合失败重试,自定义错误次数以及 HTTP 状态码自动轮换代理。
  • 设备指纹 - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。
  • 优先队列 - 根据单个爬取目标的优先级可以优先于其他目标提前爬取。
  • 爬取 SPA - 爬取 SPA(单页应用程序)生成预渲染内容(即“SSR”(服务器端渲染))。
  • 控制页面 - 可以表单提交、键盘输入、事件操作、生成页面的屏幕截图等。
  • 捕获记录 - 对爬取进行捕获记录,并在终端使用彩色字符串提醒。
  • TypeScript - 拥有类型,通过泛型实现完整的类型。


示例

以每天自动获取世界各地的经历和房间的一些照片为例:

// 1.导入模块 ES/CJS
import xCrawl from 'x-crawl'

// 2.创建一个爬虫实例
const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 3000, min: 2000 } })

// 3.设置爬取任务
// 调用 startPolling API 开始轮询功能,每隔一天会调用回调函数
myXCrawl.startPolling({ d: 1 }, async (count, stopPolling) => {
  // 调用 crawlPage API 来爬取页面
  const res = await myXCrawl.crawlPage({
    targets: [
      'https://www.airbnb.cn/s/experiences',
      'https://www.airbnb.cn/s/plus_homes'
    ],
    viewport: { width: 1920, height: 1080 }
  })

  // 存放图片 URL 到 targets
  const targets = []
  const elSelectorMap = ['._fig15y', '._aov0j6']
  for (const item of res) {
    const { id } = item
    const { page } = item.data

    // 等待页面加载完成
    await new Promise((r) => setTimeout(r, 300))

    // 获取页面图片的 URL
    const urls = await page!.$$eval(
      `${elSelectorMap[id - 1]} img`,
      (imgEls) => {
        return imgEls.map((item) => item.src)
      }
    )
    targets.push(...urls)

    // 关闭页面
    page.close()
  }

  // 调用 crawlFile API 爬取图片
  await myXCrawl.crawlFile({ targets, storeDirs: './upload' })
})

标签:Node,yyds,const,js,爬取,item,crawl,targets,页面
From: https://blog.51cto.com/u_11365839/6307218

相关文章

  • #yyds干货盘点#Tauri 与 Electron
    Tauri什么是Tauri?Tauri是一个为所有主流桌面平台构建小型、快速二进制文件的框架。开发人员可以集成任何编译成HTML、JS和CSS的前端框架来构建他们的用户界面。应用程序的后端是一个Rust二进制文件,具有前端可以与之交互的API。安装方式Xcode$xcode-select--installRu......
  • js中数组方法,超详细的哦
    一、改变原数组的方法1.push()末尾添加数据语法: 数组名.push( 数据)作用: 就是往数组末尾添加数据返回值:  就是这个数组的长度vararr=[10,20,30,40]res=arr.push(20)console.log(arr);//[10,20,30,40,20]console.log(res);//52.pop()末尾出删除数据语......
  • 用一个小故事来揭秘js加密的神秘面纱
    在夜幕降临的时刻,当人们聚集在一起分享民间鬼故事的时候,总有一种神秘的氛围弥漫在空气中。而今天,我将与你分享一个不同寻常的民间鬼故事,这个故事中隐藏着一段神秘的JS加密代码,让我们一起揭开它背后的魔法!这个鬼故事发生在一个古老的村庄,传说中有一个被诅咒的房子,据说住在那里的人会......
  • 使用sockjs-client 和 @stomp/stompjs 创建socket,断线重连机制
    importSockClientfrom'sockjs-client'constStomp=require('@stomp/stompjs')//方法createStompClient(){constthat=thisconstws=newSockClient(`/socket/api/socket-mq?access_token=${getToken()}`)this.stom......
  • Virtual host / experienced an error on node root@XXX and may be inaccessible
    问题: 解决办法:1、find-name  queues 查找rabbitmq队列文件夹,找到对应的目录 2、到步骤1找到的目录下备份后删除以下文件:recovery.dets、msg_store_transient、queues3、重启rabbitmq即可。 ......
  • 泛微CheckServer.jsp注入
    /mobile/plugin/CheckServer.jsp通过urldecode可以绕过泛微waf......
  • nodeJs 常用库之 cross-env
    楔子为什么会注意到这个库呢?起因是因为,在公司的项目package.json看到启动或者编译的命令是这样写的"start":"cross-envNODE_ENV=developmentSERVICE_NAME=testServerneststart","start:dev":"cross-envNODE_ENV=developmentSERVICE_NAME=testServerneststart--......
  • 利用python解析log日志,json文件,配置文件。
    对于喜欢偷懒的我来说,重复同样的工作是很令人头疼的事情,总想找到一条捷径,最好是一劳永逸。本次跟大家分享的是对log日志,json文件以及配置文件的解析,读取。首先是log日志的读写:读取数据:f=open("spring05注意事项.txt",mode='r',encoding='utf-8')line=f.readline()whileline......
  • 使用nvm解决node版本问题
    业务场景:最近需要开发一个基于vue2的项目,再使用Electron打包成exe文件。实际操作时发现vue项目组件依赖最高到node16,电脑上的环境是最新的node20忙着把node20卸载,换上node16,VUE项目是跑进来了,但是使用Electron时候又发现需要node19才现,真是巨坑查阅了半天资料,发现node也是有......
  • js下载pdf文件
    //点击下载文件参数href:下载地址,参数filename:文件名(可自定义文件名)```downloadFile(href,fileName){//获取heads中的filename文件名leta=document.createElement("a");a.style.display="none";//给a标签创建下载的链接a.href=href;//下载后文件名a.downloa......