V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coderhxl
V2EX  ›  Node.js

一个灵活的 Node.js 多功能爬虫库 —— x-crawl

  •  2
     
  •   coderhxl · 279 天前 · 1891 次点击
    这是一个创建于 279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    x-crawl · npm NPM Downloads GitHub license

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

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

    特征

    • 🔥 异步同步 - 只需更改一下 mode 属性即可切换异步或同步爬取模式。
    • ⚙️ 多种用途 - 支持爬动态页面、静态页面、接口数据、文件以及轮询操作。
    • ⚒️ 控制页面 - 爬取动态页面支持自动化操作、键盘输入、事件操作等。
    • 🖋️ 写法灵活 - 同种爬取 API 适配多种配置,每种配置方式都非常独特。
    • ⏱️ 间隔爬取 - 无间隔、固定间隔以及随机间隔,产生或避免高并发爬取。
    • 🔄 失败重试 - 避免因短暂的问题而造成爬取失败,自定义重试次数。
    • ➡️ 轮换代理 - 配合失败重试,自定义错误次数以及 HTTP 状态码自动轮换代理。
    • 👀 设备指纹 - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。
    • 🚀 优先队列 - 根据单个爬取目标的优先级可以优先于其他目标提前爬取。
    • 🧾 爬取记录 - 对爬取进行记录,并在终端使用彩色字符串提醒。
    • 🦾 TypeScript - 拥有类型,通过泛型实现完整的类型。

    示例

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

    // 1.导入模块 ES/CJS
    import xCrawl from 'x-crawl'
    
    // 2.创建一个爬虫实例
    const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 2000, min: 1000 } })
    
    // 3.设置爬取任务
    // 调用 startPolling API 开始轮询功能,每隔一天会调用回调函数
    myXCrawl.startPolling({ d: 1 }, async (count, stopPolling) => {
      // 调用 crawlPage API 来爬取页面
      const pageResults = await myXCrawl.crawlPage({
        targets: [
          'https://www.airbnb.cn/s/*/experiences',
          'https://www.airbnb.cn/s/plus_homes'
        ],
        viewport: { width: 1920, height: 1080 }
      })
    
      // 通过遍历爬取页面结果获取图片 URL
      const imgUrls = []
      for (const item of pageResults) {
        const { id } = item
        const { page } = item.data
        const elSelector = id === 1 ? '.i9cqrtb' : '.c4mnd7m'
    
        // 等待页面元素出现
        await page.waitForSelector(elSelector)
    
        // 获取页面图片的 URL
        const urls = await page.$$eval(`${elSelector} picture img`, (imgEls) =>
          imgEls.map((item) => item.src)
        )
        imgUrls.push(...urls.slice(0, 6))
    
        // 关闭页面
        page.close()
      }
    
      // 调用 crawlFile API 爬取图片
      await myXCrawl.crawlFile({ targets: imgUrls, storeDirs: './upload' })
    })
    

    运行效果:

    注意: 请勿随意爬取,爬取前可查看 robots.txt 协议。网站的类名可能会有变更,这里只是为了演示如何使用 x-crawl 。

    更多

    更多内容可查看:https://github.com/coder-hxl/x-crawl

    12 条回复
    coderhxl
        1
    coderhxl  
    OP
       279 天前
    快来体验一下吧
    coderhxl
        2
    coderhxl  
    OP
       279 天前
    可以做自动化操作
    ZnductR0MjHvjRQ3
        3
    ZnductR0MjHvjRQ3  
       279 天前   ❤️ 1
    点个 star 先
    coderhxl
        4
    coderhxl  
    OP
       279 天前
    @Motorola3 感谢您的支持
    laoona
        5
    laoona  
       279 天前   ❤️ 1
    先 star
    aikilan
        6
    aikilan  
       279 天前   ❤️ 1
    正好最近有需求,有时间拿来试试,已 star
    coderhxl
        7
    coderhxl  
    OP
       279 天前
    @laoona 感谢您的支持❤️
    coderhxl
        8
    coderhxl  
    OP
       279 天前
    @aikilan 感谢您的支持❤️,使用过程中遇到的问题都可以在 GitHub Issues 中提 Issues ,我会尽快解决。
    stimw
        9
    stimw  
       279 天前   ❤️ 1
    是对 puppeteer 的包装?为啥不用 playwright 呢。。
    coderhxl
        10
    coderhxl  
    OP
       279 天前
    crawlPage API 是用的 puppeteer ,puppeteer 使用者更多些。两者用法上很相似,后续也可以写个新的 API 加上 playwright 。
    coderhxl
        11
    coderhxl  
    OP
       279 天前
    @stimw crawlPage API 是用的 puppeteer ,puppeteer 使用者更多些。两者用法上很相似,后续也可以写个新的 API 加上 playwright 。
    coderhxl
        12
    coderhxl  
    OP
       278 天前
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1176 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:24 · PVG 02:24 · LAX 10:24 · JFK 13:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.