Crawlee 如何用 SitemapRequestLoader 从 sitemap 批量读取 URL 启动全站爬取
Crawlee 如何用 SitemapRequestLoader 从 sitemap 批量读取 URL 启动全站爬取【免费下载链接】crawleeCrawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, PNG, and other files from websites. Works with Puppeteer, Playwright, Cheerio, JSDOM, and raw HTTP. Both headful and headless mode. With proxy rotation.项目地址: https://gitcode.com/GitHub_Trending/cr/crawlee当你拿到一个网站的 sitemapXML 或纯文本格式遵循 Sitemaps protocol和 crawl sitemap 示例给出从单独验证加载、到接入 Crawler 发起全站爬取的完整操作路径。有一个边界需要先明确SitemapRequestLoader只支持遵循标准 Sitemaps 协议的 XML 和纯文本 sitemap。包含链接的 HTML 页面不在支持范围内——这类页面应交给 Crawler 的enqueueLinks功能处理。准备条件Node.js 16 或更高版本见 README.md。安装crawleenpm 包npm install crawlee目标站点提供可访问的 sitemap URL如https://example.com/sitemap.xml。下文示例沿用文档中的https://crawlee.dev/sitemap.xml替换为你自己的站点即可。原理只读加载器不能直接交给 CrawlerCrawlee 的 Crawler 从单个IRequestManager读取请求通过requestManager选项传入。而SitemapRequestLoader实现的是只读的IRequestLoader接口不允许新增或重试请求因此不能直接传给 Crawler。正确的组合方式是RequestManagerTandem把只读的SitemapRequestLoader和可写的RequestQueue拼在一起。其工作机制是——只要 sitemap 加载器还有未处理的请求就先把请求转入RequestQueue再交给 Crawler 处理爬取过程中动态发现的新请求和失败重试则直接进队列一侧。由于每个请求都会经过队列去重和重试得到统一处理同一 URL 不会被重复爬取。第一步手动迭代验证 sitemap 能被批量读出在接入 Crawler 之前先用文档中的基本用法确认 sitemap 可以正常加载import { SitemapRequestLoader } from crawlee; // Open a sitemap request list. The sitemap is fetched and parsed in the background, // so crawling can start before the whole sitemap is loaded. const sitemapRequestLoader await SitemapRequestLoader.open({ sitemapUrls: [https://crawlee.dev/sitemap.xml], // Optionally filter the URLs read from the sitemap: // include: [https://crawlee.dev/docs/**], }); for await (const request of sitemapRequestLoader) { console.log(request.url); await sitemapRequestLoader.markRequestAsHandled(request); }运行这段脚本控制台会逐条打印 sitemap 中的 URL。两个行为值得注意SitemapRequestLoader.open()解析完成并不表示 sitemap 已读完——加载在后台进行open()可能先于解析完成返回。需要确认加载进度时用isSitemapFullyLoaded()检查见 实现源码。for await循环持续到 sitemap 全部加载完毕且所有 URL 都已被markRequestAsHandled消费后才结束因此脚本正常退出即说明整个 sitemap 被完整读出。第二步接入 Crawler启动全站爬取验证加载器可用后用toTandem()辅助方法把加载器和默认RequestQueue组成 tandem再传给 Crawlerimport { CheerioCrawler, SitemapRequestLoader } from crawlee; // Read the initial URLs from a sitemap. const sitemapRequestLoader await SitemapRequestLoader.open({ sitemapUrls: [https://crawlee.dev/sitemap.xml], }); // Pair the loader with the default RequestQueue via the toTandem() shortcut. const requestManager await sitemapRequestLoader.toTandem(); const crawler new CheerioCrawler({ requestManager, async requestHandler({ enqueueLinks }) { await enqueueLinks(); }, }); await crawler.run();sitemapUrls指向站点入口 sitemap 后爬取过程是sitemap 中的 URL 先被排入队列并被处理requestHandler里的enqueueLinks()会把每个页面上发现的链接追加进队列实现从 sitemap 出发、逐页扩展的全站爬取。可选分支显式指定 RequestQueue如果你想在爬取前对队列做自己的配置比如指定队列名称可以不依赖toTandem()的默认队列改用显式写法import { CheerioCrawler, RequestManagerTandem, RequestQueue, SitemapRequestLoader } from crawlee; // Read the initial URLs from a sitemap. const sitemapRequestLoader await SitemapRequestLoader.open({ sitemapUrls: [https://crawlee.dev/sitemap.xml], }); // A writable queue for requests discovered during the crawl. const requestQueue await RequestQueue.open(); const requestManager new RequestManagerTandem(sitemapRequestLoader, requestQueue); const crawler new CheerioCrawler({ requestManager, async requestHandler({ enqueueLinks }) { await enqueueLinks(); }, }); await crawler.run();两种写法的差别仅在于队列的创建方式爬取行为一致。控制读取哪些 URLinclude / exclude 与 enqueueStrategySitemapRequestLoader.open()支持三类 URL 过滤完整选项定义见 packages/core/src/storages/sitemap_request_loader.tsinclude/excludeURL 模式数组支持 glob 字符串、{ glob: string }对象、RegExp实例或{ regexp: RegExp }对象。glob 匹配始终不区分大小写需要区分大小写时使用RegExp。enqueueStrategy保留相对父 sitemap URL 符合该策略的 URL非http(s)scheme 的条目一律丢弃传all可关闭主机过滤。默认值为EnqueueStrategy.SameHostname即默认只保留与 sitemap 同主机的 URL。const sitemapRequestLoader await SitemapRequestLoader.open({ sitemapUrls: [https://crawlee.dev/sitemap.xml], include: [https://crawlee.dev/docs/**], });上例中include写法来自 request_loaders 指南的代码注释示例表示只读取/docs下的页面。结果验证crawler.run()正常返回且进程退出说明队列中的请求已全部处理完毕。请求队列的数据落在本地磁盘的CRAWLEE_STORAGE_DIR环境变量指向的目录未设置时默认为当前工作目录下的./storage。默认请求队列的文件路径为{CRAWLEE_STORAGE_DIR}/request_queues/default/entries.json见 Request storage 指南——打开该文件确认其中包含 sitemap 派生出的 URL即可核对爬取范围符合预期。爬取中需要确认后台加载是否读完 sitemap 时调用加载器的isSitemapFullyLoaded()。限制与替代路径再次强调格式边界只支持 Sitemaps 协议的 XML / 纯文本 sitemapHTML 链接页请改用 Crawler 的enqueueLinks。open()先于后台解析完成返回不要以open()的 resolve 作为“sitemap 已全部读完”的判断依据。如果你的需求只是把 sitemap 解析成 URL 列表再交给 CrawlerCrawl a sitemap 示例给出了另一条路径用crawlee/utils的Sitemap工具类加载后批量入队——import { CheerioCrawler, Sitemap } from crawlee; const crawler new CheerioCrawler({ async requestHandler({ request, log }) { log.info(request.url); }, }); const { urls } await Sitemap.load(https://crawlee.dev/sitemap.xml); await crawler.addRequests(urls); await crawler.run();该方式会先完整取得 URL 列表再启动爬取适合 URL 规模不大、希望一次性入队的场景而SitemapRequestLoader的后台流式加载更适合大型 sitemap。【免费下载链接】crawleeCrawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, PNG, and other files from websites. Works with Puppeteer, Playwright, Cheerio, JSDOM, and raw HTTP. Both headful and headless mode. With proxy rotation.项目地址: https://gitcode.com/GitHub_Trending/cr/crawlee创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

企业AI框架选Java还是Python

企业AI框架选Java还是Python

针对企业开展AI开发来说, 首先碰到的技术选型环节里那个绕不过去的问题便是, 是选用Java, 还是别的什么。此问题于小型企业或许并非难题, 因为其生态多样、容易上手且社区资源颇丰来着。然而在具备一定规模的Java企业当中,这可是个实实在在的工程问题。该Java领域的AI生态的确是…

2026/9/13 23:58:26 阅读更多 →
Flipper Zero 应用图标资源接入指南:从 fap_icon_assets 到 I_ 前缀变量的完整流程

Flipper Zero 应用图标资源接入指南:从 fap_icon_assets 到 I_ 前缀变量的完整流程

Flipper Zero 应用图标资源接入指南:从 fap_icon_assets 到 I_ 前缀变量的完整流程 【免费下载链接】unleashed-firmware Flipper Zero Unleashed Firmware 项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware 导读 本指南基于 unleashe…

2026/9/13 23:58:26 阅读更多 →
屠龙少年终成恶龙,前端转产品的我给前端挖了个坑

屠龙少年终成恶龙,前端转产品的我给前端挖了个坑

从前端转向产品大概三周左右, 借由《我转产品了 - 前端转产品是种怎样的体验》这篇文章, 将自身的一些感受分享给大家, 评论区突然出现好多厉害的人。因较为忙碌, 不知不觉间似乎一下子又过去了一个多月, 此次趁着周末没开成会议, 给大家讲讲最近的“有意思但又很奇特的事”。当…

2026/9/13 23:58:26 阅读更多 →

最新新闻

大模型知识表征与逻辑推理机制解析

大模型知识表征与逻辑推理机制解析

1. 大模型知识表征的本质特征大语言模型通过海量文本训练形成的知识表征,本质上是一种高维空间中的分布式表示。这种表示方式与人类大脑的神经表征有相似之处,但存在几个关键差异点:首先,模型的知识存储是隐式的。当我们询问GPT-4…

2026/9/14 0:56:54 阅读更多 →
pyfem弹塑性有限元实现:本构积分与收敛问题解析

pyfem弹塑性有限元实现:本构积分与收敛问题解析

简介:PyFEM 是一套基于 Python 的弹塑性有限元计算程序包,面向力学分析、结构仿真和数值计算学习者,主要解决材料在载荷下的线弹性及塑性变形建模问题,可应用于土木、机械与航空航天等工程场景。压缩包共 88 个文件,包…

2026/9/14 0:56:54 阅读更多 →
STM32 VS Code开发环境搭建:ARM GNU工具链+CMake+OpenOCD调试闭环

STM32 VS Code开发环境搭建:ARM GNU工具链+CMake+OpenOCD调试闭环

1. 为什么STM32开发者正在集体“逃离”Keil,转向VS Code?你手头那块STM32F103C8T6最小系统板,是不是还躺在抽屉里吃灰?不是它不行,而是你用的开发环境——Keil MDK或IAR——正在悄悄拖慢你的节奏。我见过太多工程师&am…

2026/9/14 0:56:54 阅读更多 →
鼎阳SDS7404A H10示波器:10-bit高分辨率与4GHz带宽的工程实践指南

鼎阳SDS7404A H10示波器:10-bit高分辨率与4GHz带宽的工程实践指南

1. 项目概述:这台示波器不是“测电压的盒子”,而是信号世界的显微镜与时间标尺 鼎阳 SDS7404A H10 数字示波器,光看型号就藏着三重关键信息:SDS 是鼎阳科技(Siglent)的示波器产品线代号,7404A 表…

2026/9/14 0:56:54 阅读更多 →
TensorFlow人脸识别全链路实现:从预处理到ArcFace部署

TensorFlow人脸识别全链路实现:从预处理到ArcFace部署

简介:本资源是一套基于Python与TensorFlow框架实现的完整人脸识别系统源代码,面向计算机科学、人工智能及电子工程等专业的高年级本科生、研究生与技术爱好者,适用于课程设计、实验开发与科研原型构建。代码经过充分测试,可直接运…

2026/9/14 0:55:54 阅读更多 →
AI数字人格构建:从内容账号到可生长的拟人化阿凡达

AI数字人格构建:从内容账号到可生长的拟人化阿凡达

1. 项目概述:这不是电影续集,而是一场真实发生的内容进化实验“阿凡达的进击之路”——这六个字乍看像在聊詹姆斯卡梅隆的科幻IP,但实际指向的,是过去三年里中文互联网内容生态中一个悄然成型、却极具代表性的演化现象&#xff1a…

2026/9/14 0:55:54 阅读更多 →

日新闻

AI音乐侵权案中的测试工程与版权保护技术

AI音乐侵权案中的测试工程与版权保护技术

1. 项目概述:当测试工程师遇上AI音乐侵权案去年夏天,我作为技术顾问参与了一起特殊的著作权纠纷案——某音乐平台AI作曲功能被指控批量侵权。这起案件的特殊性在于:原告方并非传统音乐人,而是一家拥有百万级曲库的数字音乐发行商&…

2026/9/14 0:00:26 阅读更多 →
嵌入式面试I2C与SPI深度解析:从协议到量产调试

嵌入式面试I2C与SPI深度解析:从协议到量产调试

1. 这份“高频知识点洞察”到底是什么,又为什么值得你花时间细读? 如果你最近在刷嵌入式开发岗位的招聘JD,或者正坐在工位上改第7版简历,又或者刚被面试官一句“讲讲I2C和SPI的区别”问得手心冒汗——那你不是一个人。过去两年我带…

2026/9/14 0:00:26 阅读更多 →
51单片机开环控制磁阻传感器的硬件匹配与代码实现

51单片机开环控制磁阻传感器的硬件匹配与代码实现

简介:本资源是一份面向嵌入式初学者与单片机课程实践者的51单片机开关磁阻电机(SRM)开环控制教学方案,聚焦磁阻位置检测、固定时序驱动与基础状态可视化。资源包含1个C语言主程序文件(zhuang600.c)实现电机…

2026/9/14 0:00:26 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/14 0:52:26 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/14 0:06:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →