惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
Schneier on Security
Schneier on Security
SecWiki News
SecWiki News
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
O
OpenAI News
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Cisco Talos Blog
Cisco Talos Blog
Spread Privacy
Spread Privacy
Help Net Security
Help Net Security
P
Privacy & Cybersecurity Law Blog
K
Kaspersky official blog
S
Security @ Cisco Blogs
Latest news
Latest news
AWS News Blog
AWS News Blog
U
Unit 42
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Know Your Adversary
Know Your Adversary
Scott Helme
Scott Helme
博客园 - 司徒正美
B
Blog RSS Feed
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker
Google Online Security Blog
Google Online Security Blog
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Last Week in AI
Last Week in AI
月光博客
月光博客
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
SegmentFault 最新的问题
NISL@THU
NISL@THU
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

博客园 - *感悟人生*

PDFtoEXCEL批量处理高保真同步格式 JS 逆向与前端安全加固实战指南 批量处理苹果电脑的HEIF格式转成JPG|PNG 邮件群发系统 注册授权--续 独立授权模块 --可以为你的程序或者工具加上一把锁 音频转换合并切割工具 修改文件重命名(1、默认去掉预览和备份,2、默认当前文件路径) AI 平台 SQL语句解析 扣代码中,遇到this 应该怎么处理 AST解OB混淆,适用大部分的混淆 Akamai的形成与风控分析:聚焦Akamai 3.0 执行py3o的重启脚本(包含手动执行,以及自动执行的脚本) reduce与map+filter的复杂计算场景 py3o中汇总的计算:sum reduce map 三种形式来处理对比 py3o中数字金额转大写 加密解密基本概念 MJ提示词自动批处理GUI版 uv 在 Python 开发中的常用命令详解 表单和载荷的区别,以及python和js在处理json时的空格问题。
R函数处理异步迭代,在爬虫中的作用。
*感悟人生* · 2025-03-19 · via 博客园 - *感悟人生*

代码分析

  1. 函数 r 处理异步迭代

    function r(t, e, n, r, o, i, s) {
        try {
            var a = t[i](s),  // 调用迭代器方法,例如 next()
                u = a.value;   // 获取迭代返回的值
        } catch (c) {
            return void n(c);  // 处理异常
        }
        a.done ? e(u) : Promise.resolve(u).then(r, o); 
        // 如果迭代完成,调用 e 处理最终值,否则递归处理 Promise 以执行后续操作
    }
    • 这里 t[i](s) 可能是对 异步生成器 (async generator) 的调用,如 next()throw()
    • Promise.resolve(u).then(r, o); 使得代码可以顺序执行 async/await 逻辑。
  2. 函数 o(t) 返回一个新的 Promise 包装器
    function o(t) {
        return function () {
            var e = this, n = arguments;
            return new Promise(function (o, i) {
                var s = t.apply(e, n);
                function a(t) { r(s, o, i, a, u, "next", t); }
                function u(t) { r(s, o, i, a, u, "throw", t); }
                a(void 0);
            });
        };
    }
      • o(t) 是一个高阶函数,返回另一个函数。
      • 这个返回的函数执行后,会创建一个 Promise 并调用 t.apply(e, n),即执行原始函数 t

          a(t) 处理 next() 迭代,而 u(t) 处理 throw() 异常,确保 async/await 代码可以顺序执行。

爬虫相关作用

这段代码的核心功能是将异步生成器 (async generator) 包装成 Promise,从而支持 async/await 语法。这在爬虫开发中非常有用,主要体现在以下方面:

  1. 顺序执行异步请求

    • 现代爬虫通常需要异步获取多个网页,使用 async/await 让代码看起来更直观,避免回调地狱。
    • 例如,爬取多个页面时:
      async function crawlPages(urls) {
          for (const url of urls) {
              const data = await fetch(url).then(res => res.text());
              console.log(`Fetched data from ${url}`);
          }
      }

        2.处理 Promise 失败和重试

    •   通过 catch (c) { return void n(c); },代码可以捕获爬虫请求中的错误,如网络超时、403/404 响应等。

  可以结合重试逻辑来提高爬取成功率

async function fetchWithRetry(url, retries = 3) {
    for (let i = 0; i < retries; i++) {
        try {
            return await fetch(url).then(res => res.text());
        } catch (error) {
            console.log(`Retry ${i + 1} for ${url}`);
        }
    }
    throw new Error(`Failed to fetch ${url} after ${retries} attempts`);
}

3.支持爬取数据的流式处理

  • 代码涉及 Promise.resolve(u).then(r, o);,这意味着它可以在数据部分获取后立即处理,而无需等待整个任务完成。
  • 这对于增量爬取(如爬取动态加载的网页内容)非常重要,例如
async function* streamCrawl(urls) {
    for (const url of urls) {
        yield await fetch(url).then(res => res.text());
    }
}

(async () => {
    for await (const pageData of streamCrawl(["url1", "url2"])) {
        console.log(pageData);
    }
})();

总结

这段代码的主要目的是将异步函数转换为基于 Promise 的执行流,它在爬虫领域的关键作用包括:

  • 简化异步爬取任务
  • 支持 async/await 语法,使代码更加清晰
  • 错误处理(超时、403/404 失败等)
  • 支持流式爬取,提高数据处理效率

这些特性使得代码适用于爬取 API、动态网页数据提取、增量爬取等应用场景。