Crawlee 如何用 SitemapRequestLoader 从 sitemap 批量读取 URL 启动全站爬取

发布时间:2026/11/3 3:57:41

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),仅供参考
延伸阅读

更多相关文章

2026/11/3 3:55:31

企业AI框架选Java还是Python

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

2026/10/25 21:10:39

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

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

2026/11/3 3:54:56

IPv4特殊地址判定:五类地址的位运算方法与工程实践

IPv4地址分类这件事,说简单也简单,说容易翻车也是真的容易翻车。我见过太多人写网络工具的时候,随手一个正则就把10.开头的地址当成私有地址,结果100.64.0.0/10这种运营商级NAT的地址段被漏掉,或者把198.18.0.0/15这种…

2026/11/3 3:54:56

Level-2全推行情Python API接入与打板实战避坑

简介:《同花顺level-2全推行情Python API操作手册》面向从事高频交易与量化策略开发的Python工程师,尤其适合涨停板打板、盘口异动监控等场景的中高级读者,帮助其掌握沪深Level-2实时行情的接入与数据解析。资源包仅含1个PDF文档,…

2026/11/3 3:54:56

布隆过滤器+缓存切面实战:解决缓存穿透与代码解耦

1. 从一次缓存穿透事故说起:为什么要在项目里引入布隆过滤器做电商类项目的人大概都遇到过这种场景:某个不存在的商品 ID 被反复请求,每次请求都绕过缓存直接打到数据库,数据库连接池瞬间被打满,页面响应时间从几十毫秒…

2026/11/3 3:54:56

在Claude Code中配置BioMCP:生物医学AI工作流搭建全攻略

做生信和医学研究的人,有个很典型的日常状态:左手 PubMed、右手 UniProt,浏览器里开十几个标签页,来回复制基因 ID、下载表格、折腾序列格式。我前阵子在 Claude Code 里配置好 BioMCP(Biomedical Model Context Proto…

2026/11/3 3:54:56

规范先行:用Spec-kit实现OpenAPI驱动的前后端开发与契约测试

如果你经历过“接口还没定,前后端就开始各写各的”,那你一定明白联调那几周的滋味。最近半年,我把团队的开发流程彻底翻了过来——先写OpenAPI规范,再用Spec-kit把规范变成服务端骨架、客户端SDK和契约测试。说白了就是SDD&#x…

2026/11/3 3:49:56

2024年TensorFlow安装避坑与PyTorch对比:框架选择实战指南

做深度学习这些年,TensorFlow和PyTorch谁更该学的问题,从2019年一直问到2024年,答案其实已经变了好几轮。现在搜tensorflow这个词,蹦出来的热搜往往集中在“tensorflow安装”怎么避坑、老项目怎么维护,以及“tensorflo…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑