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

传统爬虫 还是 AI 辅助爬虫?该怎么选?

  •  1
     
  •   coderhxl · 11 天前 · 6048 次点击

    前言

    在数据抓取领域,传统爬虫与 AI 辅助爬虫各有千秋。传统爬虫基于规则进行数据抓取,适用于结构稳定、规则明确的网站。然而,随着网站结构的频繁变动和复杂化,传统爬虫逐渐暴露出其局限性。相比之下,AI 辅助爬虫借助人工智能技术,能够智能解析网页、自适应变化,展现出更高的灵活性和准确性。那么,面对不同的抓取需求,我们该如何选择呢?本文将深入探讨传统爬虫与 AI 辅助爬虫的特点与优劣,为您提供决策参考。

    传统爬虫 和 AI 辅助爬虫 分别是什么

    传统爬虫

    传统爬虫主要依赖于固定的规则或模式来抓取网页数据。它们通常通过识别网页中的特定元素,如类名、标签或结构,来定位和提取所需信息。然而,这种方式的局限性显而易见。一旦网站进行更新,改变了原有的类名、标签或结构,传统爬虫就会因为无法识别新的元素而失效,导致数据抓取失败或错误。

    AI 辅助爬虫

    AI 辅助爬虫能够智能地分析和理解网页内容,从而更准确地定位并提取所需信息。通过自然语言处理等技术,它们能够理解网页的语义信息,从而更精确地定位所需数据,即使网站进行了更新,AI 辅助爬虫也能继续有效地抓取数据。

    示例

    选用大家熟悉的豆瓣来进行示范,而爬虫则是用 x-crawl

    • 传统爬虫,通过网页中的特定元素获取豆瓣电影排行榜的电影信息
    • 爬虫 + AI ,爬虫搭配 AI 获取豆瓣电影排行榜的电影信息

    传统爬虫

    传统爬虫,通过网页中的特定元素获取豆瓣电影排行榜的电影信息

    import { createCrawl } from 'x-crawl'
    
    // 创建爬虫应用
    const crawlApp = createCrawl()
    
    // crawlPage 用于爬取页面
    crawlApp.crawlPage('https://movie.douban.com/chart').then(async (res) => {
      const { page, browser } = res.data
    
      // 等待元素出现在页面中
      await page.waitForSelector('#wrapper #content .article')
      const filmHandleList = await page.$$('#wrapper #content .article table')
    
      const pendingTask = []
      for (const filmHandle of filmHandleList) {
        // 封面链接(picture)
        const picturePending = filmHandle.$eval('td img', (img) => img.src)
        // 电影名(name)
        const namePending = filmHandle.$eval(
          'td:nth-child(2) a',
          (el) => el.innerText.split(' / ')[0]
        )
        // 简介(info)
        const infoPending = filmHandle.$eval(
          'td:nth-child(2) .pl',
          (el) => el.textContent
        )
        // 评分(score)
        const scorePending = filmHandle.$eval(
          'td:nth-child(2) .star .rating_nums',
          (el) => el.textContent
        )
        // 评论人数(commentsNumber)
        const commentsNumberPending = filmHandle.$eval(
          'td:nth-child(2) .star .pl',
          (el) => el.textContent?.replace(/\(|\)/g, '')
        )
    
        pendingTask.push([
          namePending,
          picturePending,
          infoPending,
          scorePending,
          commentsNumberPending
        ])
      }
    
      const filmInfoResult = []
      let i = 0
      for (const item of pendingTask) {
        Promise.all(item).then((res) => {
          // filmInfo 是一个电影信息对象,顺序在前面就决定好了
          const filmInfo = [
            'name',
            'picture',
            'info',
            'score',
            'commentsNumber'
          ].reduce((pre, key, i) => {
            pre[key] = res[i]
            return pre
          }, {})
    
          // 保存每个电影信息
          filmInfoResult.push(filmInfo)
    
          // 最后一次的处理
          if (pendingTask.length === ++i) {
            browser.close()
    
            // 整理,根据数量决定是多还是单
            const filmResult = {
              element: filmInfoResult,
              type: filmInfoResult.length > 1 ? 'multiple' : 'single'
            }
    
            console.log(filmResult)
          }
        })
      }
    })
    

    AI 辅助爬虫

    爬虫 + AI ,让爬虫和 AI 获取豆瓣电影排行榜的电影信息

    import { createCrawl, createCrawlOpenAI } from 'x-crawl'
    
    // 创建爬虫应用
    const crawlApp = createCrawl()
    
    // 创建 AI 应用
    const crawlOpenAIApp = createCrawlOpenAI({
      clientOptions: { apiKey: process.env['OPENAI_API_KEY'] },
      defaultModel: { chatModel: 'gpt-4-turbo-preview' }
    })
    
    // crawlPage 用于爬取页面
    crawlApp.crawlPage('https://movie.douban.com/chart').then(async (res) => {
      const { page, browser } = res.data
    
      // 等待元素出现在页面中, 并获取 HTML
      await page.waitForSelector('#wrapper #content .article')
      const targetHTML = await page.$eval(
        '#wrapper #content .article',
        (e) => e.outerHTML
      )
    
      browser.close()
    
      // 让 AI 获取电影信息 (描述越详细越好)
      const filmResult = await crawlOpenAIApp.parseElements(
        targetHTML,
        `这是电影列表, 需要获取电影名(name), 封面链接(picture), 简介(info), 评分(score), 评论人数(commentsNumber)。使用括号的单词作为属性名`
      )
    
      console.log(filmResult)
    })
    

    两个示例的结果

    两个示例最终展示的电影信息

    {
      "elements": [
        {
          "name": "老狐狸",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2900908599.webp",
          "info": "2023-10-27(东京国际电影节) / 2023-11-24(中国台湾) / 白润音 / 刘冠廷 / 陈慕义 / 刘奕儿 / 门胁麦 / 黄健玮 / 温升豪 / 班铁翔 / 杨丽音 / 傅孟柏 / 高英轩 / 庄益增 / 张再兴 / 许博维 / 管罄 / 钟瑶 / 游珈瑄 / 郑旸恩 / 戴雅芝 / 姜仁 / 萧鸿文...",
          "score": "8.1",
          "commentsNumber": "29211 人评价"
        },
        {
          "name": "机器人之梦",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2899644068.webp",
          "info": "2023-05-20(戛纳电影节) / 2023-12-06(西班牙) / 2024(中国大陆) / 伊万·拉班达 / 阿尔伯特·特里佛·塞加拉 / 拉法·卡尔沃 / 何塞·加西亚·托斯 / 何塞·路易斯·梅地亚维拉 / 加西埃拉·莫利娜 / 埃斯特·索兰斯 / 西班牙 / 法国 / 巴勃罗·贝格尔...",
          "score": "9.1",
          "commentsNumber": "64650 人评价"
        },
        {
          "name": "白日之下",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2904961420.webp",
          "info": "2023-06-11(上海国际电影节) / 2023-11-02(中国香港) / 2024-04-12(中国大陆) / 姜大卫 / 余香凝 / 林保怡 / 梁仲恒 / 陈湛文 / 周汉宁 / 梁雍婷 / 龚慈恩 / 宝珮如 / 朱柏谦 / 朱栢康 / 许月湘 / 胡枫 / 鲍起静 / 高翰文 / 彭杏英 / 罗浩铭 / 谭玉瑛...",
          "score": "8.0",
          "commentsNumber": "36540 人评价"
        },
        {
          "name": "可怜的东西",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2897662939.webp",
          "info": "2023-09-01(威尼斯电影节) / 2023-12-08(美国) / 艾玛·斯通 / 马克·鲁弗洛 / 威廉·达福 / 拉米·尤素夫 / 克里斯托弗·阿波特 / 苏西·本巴 / 杰洛德·卡尔迈克 / 凯瑟琳·亨特 / 薇琪·佩珀代因 / 玛格丽特·库里 / 汉娜·许古拉 / 杰克·巴顿...",
          "score": "7.0",
          "commentsNumber": "130113 人评价"
        },
        {
          "name": "完美的日子",
          "picture": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2898894527.webp",
          "info": "2023-05-25(戛纳电影节) / 2023-12-21(德国) / 2023-12-22(日本) / 役所广司 / 柄本时生 / 中野有纱 / 山田葵  / 麻生祐未 / 石川小百合 / 三浦友和 / 田中泯 / 大下浩人 / 犬山犬子 / 牧口元美 / 长井短 / 研直子 / 茂吕师冈 / 县森鱼 / 片桐入 / 芹泽兴人...",
          "score": "8.3",
          "commentsNumber": "33562 人评价"
        },
        {
          "name": "新威龙杀阵",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905374090.webp",
          "info": "2024-03-08(西南偏南电影节) / 2024-03-21(美国网络) / 杰克·吉伦哈尔 / 康纳·麦格雷戈 / 杰西卡·威廉姆斯 / 比利·马格努森 / 丹妮拉·曼希沃 / 吉米索拉·艾库美罗 / 卢卡斯·盖奇 / 特拉维斯·范·文克 / 达伦·巴内特 / 乔昆姆·德·阿尔梅达...",
          "score": "6.3",
          "commentsNumber": "9980 人评价"
        },
        {
          "name": "首尔之春",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905204009.webp",
          "info": "2023-11-22(韩国) / 黄政民 / 郑雨盛 / 李星民 / 朴解浚 / 金成畇 / 朴勋 / 安世镐 / 郑允荷 / 丁海寅 / 南允皓 / 全秀芝 / 韩国 / 金成洙 / 141 分钟 / 首尔之春 / 剧情 / 金成洙 Sung-su Kim / 韩语",
          "score": "8.8",
          "commentsNumber": "171858 人评价"
        },
        {
          "name": "金手指",
          "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2901830629.webp",
          "info": "2023-12-30(中国大陆) / 梁朝伟 / 刘德华 / 蔡卓妍 / 任达华 / 方中信 / 陈家乐 / 白只 / 姜皓文 / 太保 / 钱嘉乐 / 袁咏仪 / 周家怡 / 岑珈其 / 李靖筠 / 吴肇轩 / 柯炜林 / 冯泳贤 / 杜曜宇 / 李建城 / 古永锋 / 中国香港 / 中国大陆 / 庄文强...",
          "score": "6.1",
          "commentsNumber": "135956 人评价"
        },
        {
          "name": "美国小说",
          "picture": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2902166424.webp",
          "info": "2023-09-08(多伦多国际电影节) / 2023-12-15(美国) / 杰弗里·怀特 / 翠西·艾利斯·罗斯 / 约翰·奥提兹 / 伊萨·雷 / 斯特林·K·布朗 / 埃里卡·亚历山大 / 莱斯利·格塞斯 / 亚当·布罗迪 / 凯斯·大卫 / 迈拉·卢克利希亚·泰勒 / 雷蒙德·安东尼·托马斯...",
          "score": "7.7",
          "commentsNumber": "26223 人评价"
        },
        {
          "name": "利益区域",
          "picture": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2899514583.webp",
          "info": "2023-05-19(戛纳电影节) / 2023-12-15(美国) / 克里斯蒂安·富里道尔 / 桑德拉·惠勒 / 约翰·卡特豪斯 / 拉尔夫·赫尔福特 / 弗雷娅·克罗伊茨卡姆 / 马克斯·贝克 / 伊摩根·蔻格 / 斯蒂芬妮·佩特罗维茨 / 拉尔夫·齐尔曼 / 玛丽·罗莎·提特言...",
          "score": "7.4",
          "commentsNumber": "24875 人评价"
        }
      ],
      "type": "multiple"
    }
    

    比较

    传统爬虫提取信息所需的步骤

    const pendingTask = []
    for (const filmHandle of filmHandleList) {
      const picturePending = filmHandle.$eval('td img', (img) => img.src)
      const namePending = filmHandle.$eval(
        'td:nth-child(2) a',
        (el) => el.innerText.split(' / ')[0]
      )
      const infoPending = filmHandle.$eval(
        'td:nth-child(2) .pl',
        (el) => el.textContent
      )
      const scorePending = filmHandle.$eval(
        'td:nth-child(2) .star .rating_nums',
        (el) => el.textContent
      )
      const commentsNumberPending = filmHandle.$eval(
        'td:nth-child(2) .star .pl',
        (el) => el.textContent?.replace(/\(|\)/g, '')
      )
    
      pendingTask.push([
        namePending,
        picturePending,
        infoPending,
        scorePending,
        commentsNumberPending
      ])
    }
    
    const filmInfoResult = []
    let i = 0
    for (const item of pendingTask) {
      Promise.all(item).then((res) => {
        const filmInfo =
          ['name', 'picture', 'info', 'score', 'commentsNumber'].reduce <
          any >
          ((pre, key, i) => {
            pre[key] = res[i]
            return pre
          },
          {})
    
        filmInfoResult.push(filmInfo)
    
        if (pendingTask.length === ++i) {
          const filmResult = {
            element: filmInfoResult,
            type: filmInfoResult.length > 1 ? 'multiple' : 'single'
          }
        }
      })
    }
    

    依靠固定的类名和结构,过程还是比较繁琐的。

    AI 辅助爬虫提取信息所需的步骤

    const filmResult = await crawlOpenAIApp.parseElements(
      targetHTML,
      `这是电影列表, 需要获取电影名(name), 封面链接(picture), 简介(info), 评分(score), 评论人数(commentsNumber)。使用括号的单词作为属性名`
    )
    

    一句话的事。


    • 传统爬虫 需要依靠 “固定的类名”“各种繁琐的操作” 来获取数据,如果网站更新频繁,那么网站更新后类名或结构的改变可能导致传统的爬虫抓取策略失效,需要重新获取最新的类名以及更新各种操作才能爬取数据。
    • AI 辅助爬虫 只需要 “一段话” 就能够更加高效、智能和便捷获取到所需的数据。甚至可以将整个 HTML 传给 AI 帮我们操作,由于网站内容更加复杂需要更准确描述要取的位置,并且会消耗大量的 Tokens ,但即使网站后续的更新导致类名或结构发生改变也能正常爬到数据,因为我们可以不再依赖于固定的类名或结构来定位并提取所需信息,而是让 AI 理解并解析网页的语义信息,从而更高效、智能和便捷提取所需数据。

    如果所需的内容更多,那么传统爬虫所做的步骤也就更多,而 AI 辅助爬虫只需增加几句话就能搞定,并且不用担心网站更新后的类名和结构是否会发生改动。

    总结

    传统爬虫主要依赖于预设的规则或模式来抓取网页数据,它们对于结构稳定、规则明确的网站表现出色。然而,随着网络技术的飞速发展和网站结构的频繁更新,传统爬虫面临着越来越多的挑战。一旦网站结构发生变化,传统爬虫通常需要重新调整规则,甚至可能导致抓取失败,这大大降低了其效率和准确性。

    相比之下,AI 辅助爬虫结合了人工智能技术,能够智能地解析网页结构和语义,自适应网站的变化。通过机器学习和自然语言处理等技术,AI 辅助爬虫可以识别并学习网页中的特征,从而更准确地定位和提取所需数据。这使得 AI 辅助爬虫在面对复杂多变的网站结构时,能够保持高效的抓取能力。

    总的来说,传统爬虫和 AI 辅助爬虫各有其适用场景。对于结构稳定、规则明确的网站,传统爬虫可能是一个更经济、更直接的选择。然而,对于结构复杂、频繁更新的网站,AI 辅助爬虫则展现出了更高的灵活性和准确性优势。在选择时,我们需要根据具体的抓取需求、网站特点以及资源投入等因素进行综合考虑。

    资源

    文中示例中所用到的爬虫都是来自 x-crawl ,不管是传统爬虫还是 AI 辅助爬虫它都可以满足您,并且还拥有很多好用的功能。

    x-crawl

    x-crawl 是一个灵活的 Node.js AI 辅助爬虫库。灵活的使用方式和强大的 AI 辅助功能,使爬虫工作变得更加高效、智能和便捷。

    它由两部分组成:

    • 爬虫:由爬虫 API 以及各种功能组成,即使不依靠 AI 也能正常工作。
    • AI:目前基于 OpenAI 提供的 AI 大模型,让 AI 简化很多繁琐的操作。

    特征

    • 🤖 AI 辅助 - 强大的 AI 辅助功能,使爬虫工作变得更加高效、智能和便捷。
    • 🖋️ 写法灵活 - 单个爬取 API 都适配多种配置,每种配置方式都各有千秋。
    • ⚙️ 多种用途 - 支持爬动态页面、静态页面、接口数据以及文件数据。
    • ⚒️ 控制页面 - 爬取动态页面支持自动化操作、键盘输入、事件操作等。
    • 👀 设备指纹 - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。
    • 🔥 异步同步 - 无需切换爬取 API 即可进行异步或同步的爬取模式。
    • ⏱️ 间隔爬取 - 无间隔、固定间隔以及随机间隔,决定是否高并发爬取。
    • 🔄 失败重试 - 自定义重试次数,避免因短暂的问题而造成爬取失败。
    • ➡️ 轮换代理 - 搭配失败重试,自定义错误次数以及 HTTP 状态码自动轮换代理。
    • 🚀 优先队列 - 根据单个爬取目标的优先级可以优先于其他目标提前爬取。
    • 🧾 爬取信息 - 可控的爬取信息,会在终端输出彩色字符串信息。
    • 🦾 TypeScript - 拥有类型,通过泛型实现完整的类型。

    如果您觉得 x-crawl 对您有所帮助,或者您喜欢 x-crawl ,可以在 GitHub 上给  x-crawl 存储库  点个 star 。您的支持是我们持续改进的动力!感谢您的支持!

    x-crawl GitHub: https://github.com/coder-hxl/x-crawl

    x-crawl 文档: https://coder-hxl.github.io/x-crawl/cn/

    第 1 条附言  ·  11 天前
    如果想查看 AI 需要处理的 HTML:由于内容太多此处放不下,就只能放在 https://coder-hxl.github.io/x-crawl/cn/guide/#example2 此链接 示例 2 底部的 查看 AI 需要处理的 HTML
    第 2 条附言  ·  11 天前
    该文章是面对依赖类名或结构这些元素的爬虫,嫌文章太长至少阅读完总结那部分再评论比较好哦,像逆向这种爬虫方式也很好,但是学习成本还是蛮大的,但是感觉有点离题了
    第 3 条附言  ·  11 天前
    总的来说,传统爬虫和 AI 辅助爬虫各有其适用场景。对于结构稳定、规则明确的网站,传统爬虫可能是一个更经济、更直接的选择。然而,对于结构复杂、频繁更新的网站,AI 辅助爬虫则展现出了更高的灵活性和准确性优势,并且成本较高,会消耗大量的 Tokens 。在选择时,我们需要根据具体的抓取需求、网站特点以及资源投入等因素进行综合考虑。

    也可以二者结合,第一次爬取的时候缓存路径,后面让传统爬虫用缓存路径的,如果错误就调用 AI 重新获取路径再缓存。
    92 条回复    2024-04-26 09:41:11 +08:00
    hpan
        1
    hpan  
       11 天前   ❤️ 1
    AI 能爬图文并保持图文结构吗
    coderhxl
        2
    coderhxl  
    OP
       11 天前
    @hpan 上面的示例就是爬了图片和文字哦,并且可以看到结构很完美。AI 是一句话的事,而传统爬虫还是比较繁琐的。

    如果想查看 AI 需要处理的 HTML:由于内容太多此处放不下,就只能放在此链接 https://coder-hxl.github.io/x-crawl/cn/guide/#example2 示例 2 底部的 查看 AI 需要处理的 HTML
    coderhxl
        3
    coderhxl  
    OP
       11 天前
    @hpan
    {
    "name": "老狐狸",
    "picture": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2900908599.webp",
    "info": "2023-10-27(东京国际电影节) / 2023-11-24(中国台湾) / 白润音 / 刘冠廷 / 陈慕义 / 刘奕儿 / 门胁麦 / 黄健玮 / 温升豪 / 班铁翔 / 杨丽音 / 傅孟柏 / 高英轩 / 庄益增 / 张再兴 / 许博维 / 管罄 / 钟瑶 / 游珈瑄 / 郑旸恩 / 戴雅芝 / 姜仁 / 萧鸿文...",
    "score": "8.1",
    "commentsNumber": "29211 人评价"
    }
    我截取了一个电影信息让您瞧瞧,picture 就是图片
    gauthier
        4
    gauthier  
       11 天前   ❤️ 1
    能用别的语言模型吗?
    wujunchuan2008
        5
    wujunchuan2008  
       11 天前   ❤️ 1
    有点意思
    ospider
        6
    ospider  
       11 天前   ❤️ 2
    @livid 疑似 GPT 生成的帖子
    coderhxl
        7
    coderhxl  
    OP
       11 天前
    @gauthier 对于 OpenAI 的话,也可以使用 gpt-3.5-turbo ,默认就是这个了。后续也可能加入其他的 AI 模型,其实看名字就可以知道一点点了 createCrawlOpenAI ,这个是以 OpenAI 命名的,如果加入其他 AI 也会容易兼容。
    coderhxl
        8
    coderhxl  
    OP
       11 天前
    @wujunchuan2008 感谢您的支持。
    coderhxl
        9
    coderhxl  
    OP
       11 天前
    @ospider 哈哈,的确是用了 AI 帮忙,毕竟我文学水平有限,不过用的是百度的文心一言。不是让 AI 直接生成的,而是问他传统爬虫是什么之类的,然后筛选。像 x-crawl 这种,AI 又不认识。
    coderhxl
        10
    coderhxl  
    OP
       11 天前
    @ospider 你可以去问问 AI 了不了解 x-crawl ,毕竟这个工具还是我开发的,AI 版本还是前几天加入的
    coderhxl
        11
    coderhxl  
    OP
       11 天前
    @ospider AI 只是更好的将我想描述的描述出来,相当于换了一句话讲,但意思更完美了
    blankmiss
        12
    blankmiss  
       11 天前   ❤️ 2
    第一步识别是否是机器人,game over
    coderhxl
        13
    coderhxl  
    OP
       11 天前
    @blankmiss 啊?没明白说啥
    karatsuba
        14
    karatsuba  
       11 天前   ❤️ 3
    众所周知爬虫最难的不是拉数据
    blankmiss
        15
    blankmiss  
       11 天前
    第一你那个效率很低,第二 无法避免风控 #14 说的很对 第三 对接口逆向没什么帮助 第四 像八爪鱼 这种可视化插件 更方便
    herozzm
        16
    herozzm  
       11 天前   ❤️ 1
    除非用理想本地大模型,不然用 api 的话一天爬上万不得亏惨
    herozzm
        17
    herozzm  
       11 天前
    我觉得 AI 更多用在数据提取过滤和清洗,而不是抓取这个环节
    coderhxl
        18
    coderhxl  
    OP
       11 天前
    @karatsuba 这篇文章只是讲述传统爬虫与 AI 辅助爬虫的特点与优劣,为您提供决策参考。并没有讲太多的题外话,其他功能 x-crawl 也有,像设备指纹,轮换代理都有哦,https://coder-hxl.github.io/x-crawl/cn/ 下面的特征可以瞧瞧
    maolon
        19
    maolon  
       11 天前   ❤️ 4
    老实的说用 gpt 做每一次的爬取也太奢侈了吧。
    先不说钱,gpt4 的 t/s 本来就不高,gpt3 也没高到哪里去,长一点的内容要处理到啥时候去。
    最好还是用 ai 识别爬取 sample 内容,然后用它来自动生成一个 xxx.com.path.parser 的 util, 然后你的爬虫动态调用这个
    zephyru
        20
    zephyru  
       11 天前   ❤️ 1
    的确,这个自己玩玩还行,大规模抓取用 AI 辅助效率不高,当前成本还蛮高的...
    与其让 Ai 解析 html 文本,不如让 AI 辅助生成解析用的函数...
    coderhxl
        21
    coderhxl  
    OP
       11 天前
    @blankmiss 该文章是面对依赖类名或结构这些元素的爬虫,像逆向这种肯定也很好,但是并非此文章的主题
    enson110
        22
    enson110  
       11 天前   ❤️ 1
    用 AI 的成本呢?每篇都用 AI 成本很高吧?
    coderhxl
        23
    coderhxl  
    OP
       11 天前
    @enson110 要不咱看看总结那部分,“传统爬虫可能是一个更经济、更直接的选择”
    624144061
        24
    624144061  
       11 天前   ❤️ 1
    好好好,这就看看实现 star 了
    coderhxl
        25
    coderhxl  
    OP
       11 天前
    fank99
        26
    fank99  
       11 天前   ❤️ 1
    更像是自动的页面解析工具。。
    coderhxl
        27
    coderhxl  
    OP
       11 天前
    @zephyru 也是个不错的方法
    coderhxl
        28
    coderhxl  
    OP
       11 天前
    @maolon 传统爬虫可能是一个更经济的选择,文章也有提到
    coderhxl
        29
    coderhxl  
    OP
       11 天前
    @herozzm 这里也是筛选了部分 html 给 AI 进行提取数据
    624144061
        30
    624144061  
       11 天前   ❤️ 1
    可以考虑做成 fastgpt 或者 dify 的插件,服务于 aigc ,本身就有本地大模型的前提下,这个库就不用考虑成本了
    coderhxl
        31
    coderhxl  
    OP
       11 天前
    @fank99 可以这么理解,像依赖类名或结构这些元素的爬虫不也是对页面解析提取数据
    ayang23
        32
    ayang23  
       11 天前   ❤️ 1
    喂给 AI 一个或几个页面,生成一个解析函数,再交给传统爬虫,就能用得起了。
    triangle111
        33
    triangle111  
       11 天前   ❤️ 1
    之前写过一个 TF-IDF 提取的页面内容的,不过感觉页面解析会有很多广告/推荐阅读等干扰信息,如果不排除掉直接上 AI 感觉效果应该不是很好。
    另外这种感觉要么更小白点,直接搞个 gui 界面,要么更专业点,比如对一些接口进行 hook ,判断哪些 headers cookie 是关键的。
    hahahaii
        34
    hahahaii  
       11 天前   ❤️ 1
    @zephyru 确实,可以加上使用 try 包裹,报错时,爬网页然后调用 gpt 生成新的函数。
    coderhxl
        35
    coderhxl  
    OP
       11 天前
    @624144061 好滴
    coderhxl
        36
    coderhxl  
    OP
       11 天前
    @ayang23 好方法,只是解析函数是如何应对通用爬虫的场景
    coderhxl
        37
    coderhxl  
    OP
       11 天前
    @triangle111 对的,所以最好两者结合起来用,可以先获取 Body ,然后对 Body 内的一些元素进行删除,特别是 script 和 svg 这两个的内容,内容越多消耗的资源也就越多,而且还没啥用。这样就能以最小的代价利用 AI 爬取数据。
    coderhxl
        38
    coderhxl  
    OP
       11 天前
    @hahahaii 但是还是要考虑生成的函数如何应对通用爬虫的场景
    barat
        39
    barat  
       11 天前   ❤️ 1
    主要还是依赖 puppeteer ,没有 puppeteer ,AI 也是白搭,但是 puppeteer 又很重
    coderhxl
        40
    coderhxl  
    OP
       11 天前
    @barat puppeteer 用于模仿人类的行为,当然也可以用其他的获取页面内容
    luozic
        41
    luozic  
       11 天前   ❤️ 1
    解析数据这种,可以用 AI 来辅助生成代码;
    爬虫的难的是稳定的能取到数据
    coderhxl
        42
    coderhxl  
    OP
       11 天前
    @luozic 对的,x-crawl 也有很多功能能稳定爬取到数据,像重试,代理,设备指纹... 可以瞧瞧这里 https://coder-hxl.github.io/x-crawl/cn/guide/#features
    coderhxl
        43
    coderhxl  
    OP
       11 天前
    感谢各位大佬的评论和提供的建议!
    clemente
        44
    clemente  
       11 天前   ❤️ 1
    爬虫要的是精确数据 不需要 AI
    MapleEve
        45
    MapleEve  
       11 天前   ❤️ 1
    部署一个 dify ,传统爬虫加 AI 筛选
    coderhxl
        46
    coderhxl  
    OP
       11 天前
    @clemente 文章太长也没办法,要不咱看看前言和总结部分的内容,也感谢您的评论哈
    coderhxl
        47
    coderhxl  
    OP
       11 天前
    @MapleEve 示例中用的也是 传统爬虫 + AI ,毕竟将整个 Body 传进去还是消耗很大的
    1018ji
        48
    1018ji  
       11 天前   ❤️ 1
    我选 ai
    coderhxl
        49
    coderhxl  
    OP
       11 天前
    @1018ji 我都要,传统爬虫 + AI ,毕竟将整个 Body 传进去还是消耗很大的
    GeekGao
        50
    GeekGao  
       11 天前   ❤️ 1
    对于本站人群而言,难的不是技术。
    AI 仅仅是实现目的的工具,但是比起自己 coding 又太贵。
    coderhxl
        51
    coderhxl  
    OP
       11 天前
    @GeekGao 哈哈,毕竟自己动手还是挺麻烦的
    ashuai
        52
    ashuai  
       11 天前   ❤️ 2
    AI 应该用来编写脚本,脚本失效时通知 AI 更新脚本
    coderhxl
        53
    coderhxl  
    OP
       11 天前
    @ashuai 也可以这么做,第一次爬取的时候缓存路径,后面让传统爬虫用缓存路径的,如果错误就调用 AI 重新获取路径再缓存。
    coderhxl
        54
    coderhxl  
    OP
       11 天前
    @ashuai 这样既能体验 AI 的便捷,又消耗不那么大
    CAze
        55
    CAze  
       11 天前   ❤️ 1
    我现在都是这样做的,把要爬取的 html 网页丢给 gpt ,让他生成辅助函数,省钱又高效
    coderhxl
        56
    coderhxl  
    OP
       11 天前
    @CAze 好办法,可以讲解一下思路不
    kevin1452
        57
    kevin1452  
       11 天前   ❤️ 1
    op 的思路很棒~
    不过我的理解只是适用于没有研发的人, 少量抓取数据..
    成本/速度/吞吐量都不太友好..
    粗略看下也没解决反爬的问题, ai 能在这方面帮上忙吗?
    coderhxl
        58
    coderhxl  
    OP
       11 天前
    @kevin1452 目前咱们是将 HTML 交给 AI 通过自然语言提取数据,结合 AI 技术的爬虫能够更好地应对网站更新后类名或结构改变的问题。像代理,设备指纹 x-crawl 也有,只是并非这篇文章的主题就没有写,https://coder-hxl.github.io/x-crawl/cn/guide/#features 可以瞧瞧这里
    terranboy
        59
    terranboy  
       11 天前   ❤️ 1
    只是让 AI 分析下 HTML 结构 好像没啥意义
    coderhxl
        60
    coderhxl  
    OP
       11 天前
    @terranboy 依赖于固定的规则或模式来抓取网页数据的爬虫不也是这样,而且一旦网站进行更新,改变了原有的类名、标签或结构,传统爬虫就会因为无法识别新的元素而失效,导致数据抓取失败或错误。AI 辅助爬虫能够智能地分析和理解网页内容,从而更准确地定位并提取所需信息。通过自然语言处理等技术,它们能够理解网页的语义信息,从而更精确地定位所需数据,即使网站进行了更新,AI 辅助爬虫也能继续有效地抓取数据。当然成本也很高
    zhangfeiwudi
        61
    zhangfeiwudi  
       11 天前   ❤️ 1
    有点意思,通过 AI 来做数据清洗,但是爬虫貌似 ai 参与不了
    coderhxl
        62
    coderhxl  
    OP
       11 天前
    @zhangfeiwudi AI 辅助爬虫,算是让 AI 筛选数据
    terranboy
        63
    terranboy  
       11 天前
    @coderhxl 亮点就是页面更新了 结构变了 不需要人来重写规则, 确实节省点时间,那我问你 URL 变了呢
    coderhxl
        64
    coderhxl  
    OP
       11 天前
    @terranboy URL 就是根啊,没了根用哪种方式都没用
    coderhxl
        65
    coderhxl  
    OP
       11 天前
    @terranboy 不太能理解你这个问题
    CAze
        66
    CAze  
       11 天前   ❤️ 1
    @coderhxl 把 html 内容复制出来,并且告诉 gpt 我需要抓取哪些内容的关键字,并且给定一个 json 结构,一般能完成 90
    %的工作了
    coderhxl
        67
    coderhxl  
    OP
       11 天前
    @CAze 原理差不多是这样,但是如果仅仅是告诉 AI 要拿哪些数据,效果可能还不是很好
    bubble21
        68
    bubble21  
       11 天前   ❤️ 1
    能提取(识别)图片里面的文字吗?
    coderhxl
        69
    coderhxl  
    OP
       11 天前
    @bubble21 这是个很不错的点子,现在暂不支持,后续会考虑加上哦
    coderhxl
        70
    coderhxl  
    OP
       11 天前
    @bubble21 当时我也考虑到加上这个,用 puppeteer 获取页面截图,上传截图给 AI 提取内容。
    tinyzilan123
        71
    tinyzilan123  
       11 天前   ❤️ 1
    把爬取到的内容给 AI 解析,直接返回需要的字段的意思吧
    这样消耗的 token 会有不少吧,毕竟爬虫本身就是大量重复工作
    coderhxl
        72
    coderhxl  
    OP
       11 天前
    @tinyzilan123 对的,所以有另一种解决方案,二者结合,第一次爬取的时候缓存路径,后面让传统爬虫用缓存路径的,如果错误就调用 AI 重新获取路径再缓存。这样既不用担心网站更新导致爬虫工作失败,也避免浪费 token
    coderhxl
        73
    coderhxl  
    OP
       11 天前
    @tinyzilan123 就看使用者怎么用了
    topang
        74
    topang  
       11 天前   ❤️ 1
    能用本地模型就好了
    coderhxl
        75
    coderhxl  
    OP
       11 天前
    @topang 可以自己封装一个方法,需要的时候调用就行了
    jianyang
        76
    jianyang  
       11 天前   ❤️ 1
    有时候这些个 AI 并不是很听话、比如以 GPT3.5 来说、要求其回复格式后,它的回复也会有偶尔不听话的时候、GPT4.0 还算听话一些,可是用 4.0 做这玩意也太奢侈了,再就是效率太低了,这也是最关键的地方。
    之前我也想过用 AI 辅助爬虫,我觉得最佳方式是让 AI 来写取关键信息的正则或者 xpath 等,程序还是常规爬区方式,主要用于非程序员或者偷懒写规则都挺好。
    coderhxl
        77
    coderhxl  
    OP
       11 天前
    @jianyang AI 主要是能够更好地应对网站更新后类名或结构改变的问题,并且 AI 还能根据要求筛选数据等操作。
    coderhxl
        78
    coderhxl  
    OP
       11 天前
    @jianyang 并且这种方式貌似不适用于通用型爬虫,适用于特定网站。
    charslee013
        79
    charslee013  
       11 天前   ❤️ 1
    想请教一下下,采用其他平替的开源模型效果如何?比如说 01-Yi 34B 200K 这种支持超长文本输入的,在成本和推理速度上会不会更优秀一些?
    coderhxl
        80
    coderhxl  
    OP
       11 天前
    @charslee013 这个得试了才能知道,如果有好的建议也会采纳的
    changz
        81
    changz  
       11 天前
    真有钱啊
    teenthsch
        82
    teenthsch  
       11 天前
    我想说的是,ai 的输出不是都非常稳定吧
    gongquanlin
        83
    gongquanlin  
       10 天前
    里面的浏览器指纹拉下来代码看了下,还是改的 UA 之类的内容
    核心的 GPU 指纹、dns leak 、webrtc leak 都没有处理
    MapleEve
        84
    MapleEve  
       10 天前
    @coderhxl #47 所以才让你用 Dify ,他可以多次处理爬虫拿到的数据
    coderhxl
        85
    coderhxl  
    OP
       10 天前
    @changz 现在用 AI 成本高但以后不一定
    coderhxl
        86
    coderhxl  
    OP
       10 天前
    @teenthsch gpt4 跟 gpt3 对比还是很听话的
    coderhxl
        87
    coderhxl  
    OP
       10 天前
    @gongquanlin 基本的设备指纹也够用
    coderhxl
        88
    coderhxl  
    OP
       10 天前
    @MapleEve OK ,Dify 还没了解过,有机会可以瞧瞧,搞开源还是蛮消耗精力的
    hpan
        89
    hpan  
       9 天前
    @coderhxl 不错不错,不过我的意思是,能不能把图片直接下载回来,然后我要将爬取的内容发布到 wordpress 或者公众号,需要将图片文件上传上去,毕竟链接应用搞不好哪天就失效了
    charslee013
        90
    charslee013  
       9 天前
    我自己测试了一下,在 qwen1.5 32B-Chat 模型下能够有效的提取 HTML 结构并且返回想要的结果,不一定要使用 GPT4 而且还省下了大量 Token 的费用,具体测试代码在这 https://gist.github.com/charSLee013/e3feebf457b3650e8c84095789da55d7
    coderhxl
        91
    coderhxl  
    OP
       7 天前
    @hpan 可以调用 crawlFile API 爬文件,https://coder-hxl.github.io/x-crawl/cn/guide/crawl-file
    coderhxl
        92
    coderhxl  
    OP
       7 天前
    @charslee013 很 OK
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   818 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:24 · PVG 06:24 · LAX 15:24 · JFK 18:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.