一个灵活的 Node.js 多功能爬虫库 x-crawl - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coderhxl
V2EX    Node.js

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

  •  2
     
  •   coderhxl 2024-03-20 11:56:20 +08:00 2608 次点击
    这是一个创建于 635 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    coderhxl
        1
    coderhxl  
    OP
       2024-03-20 11:59:57 +08:00
    快来体验一下吧
    coderhxl
        2
    coderhxl  
    OP
       2024-03-20 14:30:18 +08:00
    可以做自动化操作
    ZnductR0MjHvjRQ3
        3
    ZnductR0MjHvjRQ3  
       2024-03-20 15:24:33 +08:00   1
    点个 star 先
    coderhxl
        4
    coderhxl  
    OP
       2024-03-20 15:42:04 +08:00
    @Motorola3 感谢您的支持
    laoona
        5
    laoona  
       2024-03-20 18:43:41 +08:00   1
    先 star
    aikilan
        6
    aikilan  
       2024-03-20 18:52:17 +08:00   1
    正好最近有需求,有时间拿来试试,已 star
    coderhxl
        7
    coderhxl  
    OP
       2024-03-20 19:00:38 +08:00
    @laoona 感谢您的支持
    coderhxl
        8
    coderhxl  
    OP
       2024-03-20 19:02:47 +08:00
    @aikilan 感谢您的支持,使用过程中遇到的问题都可以在 GitHub Issues 中提 Issues ,我会尽快解决。
    stimw
        9
    stimw  
       2024-03-20 21:05:18 +08:00   1
    是对 puppeteer 的包装?为啥不用 playwright 呢。。
    coderhxl
        10
    coderhxl  
    OP
       2024-03-20 21:46:21 +08:00
    crawlPage API 是用的 puppeteer ,puppeteer 使用者更多些。两者用法上很相似,后续也可以写个新的 API 加上 playwright 。
    coderhxl
        11
    coderhxl  
    OP
       2024-03-20 21:48:29 +08:00
    @stimw crawlPage API 是用的 puppeteer ,puppeteer 使用者更多些。两者用法上很相似,后续也可以写个新的 API 加上 playwright 。
    coderhxl
        12
    coderhxl  
    OP
       2024-03-21 11:47:25 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3006 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:34 PVG 08:34 LAX 16:34 JFK 19:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86