.:. 草榴社區 » 技術討論區 » 自己写一段程序来自动下载论坛某个页面的所有图片,纯技术
本頁主題: 自己写一段程序来自动下载论坛某个页面的所有图片,纯技术字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
丰色 [樓主]


級別:精靈王 ( 12 )
發帖:5202
威望:636 點
金錢:21458 USD
貢獻:50968 點
註冊:2015-03-07

有问题也可以在此提出


點評

    TOP Posted: 03-27 10:20 引用 | 點評
    这是个问题啊


    級別:風雲使者 ( 13 )
    發帖:69142
    威望:6970 點
    金錢:0 USD
    貢獻:110989 點
    註冊:2021-01-01

    发帖辛苦
    TOP Posted: 03-28 16:47 引用 | 點評
    反骨佬


    級別:新手上路 ( 8 )
    發帖:828
    威望:98 點
    金錢:3958 USD
    貢獻:0 點
    註冊:2022-12-20

    我用shell写过一个
    TOP Posted: 03-27 10:42 引用 | 點評
    特洛夫斯基


    級別:風雲使者 ( 13 )
    發帖:19806
    威望:1902 點
    金錢:50827002 USD
    貢獻:166666 點
    註冊:2015-01-27

    太复杂
    TOP Posted: 03-27 10:52 引用 | 點評
    蓝莓山药


    級別:新手上路 ( 8 )
    發帖:197
    威望:36 點
    金錢:2089 USD
    貢獻:0 點
    註冊:2026-02-24

    感谢分享,不过这个实现更像是一个基础爬虫脚本,直接使用的话还是有点风险的。

    比如:
    - 没有做请求频率控制,图片多的话请求会比较密集
    - User-Agent 比较简单,容易被识别为非正常浏览器请求 

    正常单个帖子问题不大,但如果连续下载多个图片较多的帖子,可能会触发限流或者风控。


    [ 此貼由蓝莓山药重新編輯:2026-03-27 11:20 ]
    TOP Posted: 03-27 10:52 引用 | 點評
    星河大帝


    級別:聖騎士 ( 11 )
    發帖:4472
    威望:601 點
    金錢:14636 USD
    貢獻:2 點
    註冊:2025-09-26

    技术贴支持了
    ------------------------


    TOP Posted: 03-27 11:40 引用 | 點評
    穿红袜子的鱼


    級別:新手上路 ( 8 )
    發帖:30
    威望:24 點
    金錢:83 USD
    貢獻:0 點
    註冊:2024-06-20

    我也写了js版的,手机浏览器也能用。部署到CloudFlare Worker就行。

    代码如下:

    export default {
      async fetch(request, env, ctx) {
        const url = new URL(request.url);

        // 1. 处理代理请求 (绕过跨域并添加 Rust 代码中指定的请求头)
        if (url.pathname === '/proxy') {
          const targetUrl = url.searchParams.get('url');
          if (!targetUrl) return new Response('Missing URL', { status: 400 });

          const proxyRequest = new Request(targetUrl, {
            method: 'GET',
            headers: {
              'User-Agent': 'Mozilla/5.0',
              'Cookie': 'ismob=0'
            }
          });

          try {
            const response = await fetch(proxyRequest);
            // 复制响应并加上 CORS 头,允许前端读取数据
            const newResponse = new Response(response.body, response);
            newResponse.headers.set('Access-Control-Allow-Origin', '*');
            return newResponse;
          } catch (e) {
            return new Response(e.message, { status: 500 });
          }
        }

        // 2. 默认路由返回前端 HTML 页面
        const html = `
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>网页图片打包下载器</title>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
      <style>
        body { font-family: system-ui, sans-serif; max-width: 600px; margin: 40px auto; padding: 20px; line-height: 1.6; }
        h2 { color: #333; }
        input[type="text"] { width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }
        button { padding: 10px 20px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
        button:disabled { background-color: #aaa; cursor: not-allowed; }
        #status { margin-top: 20px; color: #555; font-weight: bold; }
      </style>
    </head>
    <body>
      <h2>图片下载打包器</h2>
      <input type="text" id="targetUrl" placeholder="请输入目标网页的 URL">
      <button id="downloadBtn">提取并打包</button>
      <div id="status"></div>

      <script>
        document.getElementById('downloadBtn').addEventListener('click', async () => {
          const urlInput = document.getElementById('targetUrl').value.trim();
          const statusEl = document.getElementById('status');
          const btn = document.getElementById('downloadBtn');
         
          if (!urlInput) {
            alert('请输入URL!');
            return;
          }

          btn.disabled = true;
          try {
            // 第一步:通过代理获取网页 HTML
            statusEl.innerText = '正在获取网页内容...';
            const htmlRes = await fetch('/proxy?url=' + encodeURIComponent(urlInput));
            const htmlText = await htmlRes.text();

            // 第二步:解析 HTML,寻找特定的 img 标签
            const parser = new DOMParser();
            const doc = parser.parseFromString(htmlText, 'text/html');
            // 选择器和逻辑:查找 img 并获取 ess-data 属性
            const images = doc.querySelectorAll('img[ess-data]');

            if (images.length === 0) {
              statusEl.innerText = '未在页面中找到带有 ess-data 属性的图片。';
              btn.disabled = false;
              return;
            }

            const zip = new JSZip();
            let count = 0;
           
            // 第三步:循环下载图片并加入 ZIP
            for (let i = 0; i < images.length; i++) {
              let imgUrl = images.getAttribute('ess-data');
             
              // 处理相对路径问题,确保是完整 URL
              if (imgUrl.startsWith('//')) {
                imgUrl = 'https:' + imgUrl;
              } else if (imgUrl.startsWith('/')) {
                const baseUrl = new URL(urlInput);
                imgUrl = baseUrl.origin + imgUrl;
              }

              statusEl.innerText = \`正在下载图片 \${i + 1} / \${images.length} ...\`;
             
              // 通过代理获取图片二进制数据
              const imgRes = await fetch('/proxy?url=' + encodeURIComponent(imgUrl));
              const blob = await imgRes.blob();
             
              // 命名逻辑:{count}.jpg
              zip.file(\`\${count}.jpg\`, blob);
              count++;
            }

            // 第四步:生成 ZIP 并触发浏览器下载
            statusEl.innerText = '正在生成 ZIP 文件,请稍候...';
            const zipBlob = await zip.generateAsync({type: 'blob'});
           
            const downloadLink = document.createElement('a');
            downloadLink.href = URL.createObjectURL(zipBlob);
            downloadLink.download = 'images.zip';
            document.body.appendChild(downloadLink);
            downloadLink.click();
            document.body.removeChild(downloadLink);
            URL.revokeObjectURL(downloadLink.href);

            statusEl.innerText = \`完成!共成功打包了 \${count} 张图片。\`;

          } catch (e) {
            statusEl.innerText = '发生错误: ' + e.message;
          } finally {
            btn.disabled = false;
          }
        });
      </script>
    </body>
    </html>
        `;

        return new Response(html, {
          headers: { 'Content-Type': 'text/html;charset=UTF-8' }
        });
      }
    }
    TOP Posted: 03-27 13:50 引用 | 點評
    百鸟争鸣


    級別:聖騎士 ( 11 )
    發帖:2241
    威望:325 點
    金錢:7060 USD
    貢獻:20000 點
    註冊:2025-10-22

    手机上能用吗
    ------------------------




    點評

      TOP Posted: 03-27 10:34 引用 | 點評
      拾贰弓長


      級別:騎士 ( 10 )
      發帖:2538
      威望:539 點
      金錢:11806 USD
      貢獻:1 點
      註冊:2023-01-21

      感谢分享
      TOP Posted: 03-27 10:40 引用 | 點評
      陈贯希


      級別:新手上路 ( 8 )
      發帖:735
      威望:74 點
      金錢:1197 USD
      貢獻:0 點
      註冊:2025-08-29

      感谢分享  技术达人
      TOP Posted: 03-27 10:42 引用 | 點評
      糯香沱茶


      級別:俠客 ( 9 )
      發帖:1664
      威望:218 點
      金錢:3882 USD
      貢獻:150 點
      註冊:2024-03-21

      感谢分享,谢谢技术大佬分享
      TOP Posted: 03-27 10:45 引用 | 點評
      马勒逼船长


      級別:精靈王 ( 12 )
      發帖:5722
      威望:682 點
      金錢:17618 USD
      貢獻:16572 點
      註冊:2023-04-07

      不明觉厉
      TOP Posted: 03-27 10:50 引用 | 點評
      独醉笑清风


      級別:騎士 ( 10 )
      發帖:1906
      威望:371 點
      金錢:9169 USD
      貢獻:7526 點
      註冊:2022-06-02

      大佬,技术帖子啊!膜拜一下
      TOP Posted: 03-27 11:02 引用 | 點評
      又见你


      級別:俠客 ( 9 )
      發帖:631
      威望:114 點
      金錢:11830 USD
      貢獻:0 點
      註冊:2022-01-25

      虽然 但是      要抓图下个图片助手就可以了,方便快捷
      TOP Posted: 03-27 11:12 引用 | 點評
      麋鹿啾啾


      級別:精靈王 ( 12 )
      發帖:4254
      威望:556 點
      金錢:15329 USD
      貢獻:58888 點
      註冊:2022-09-11

      右键-另存为-🆗
      ------------------------
      M



      點評

        TOP Posted: 03-27 11:50 引用 | 點評
        牧场无糖


        級別:精靈王 ( 12 )
        發帖:11711
        威望:1028 點
        金錢:19131 USD
        貢獻:4000 點
        註冊:2025-04-16

        感谢分享技术贴
        ------------------------


        TOP Posted: 03-27 20:05 引用 | 點評
        苏筱熙


        級別:天使 ( 14 )
        發帖:139788
        威望:64064 點
        金錢:120417 USD
        貢獻:69 點
        註冊:2012-09-01

        厉害了
        ------------------------


        TOP Posted: 03-27 22:23 引用 | 點評
        laser


        級別:俠客 ( 9 )
        發帖:562
        威望:112 點
        金錢:782 USD
        貢獻:0 點
        註冊:2010-04-03

        1024
        TOP Posted: 03-28 08:55 引用 | 點評
        画妃花


        級別:新手上路 ( 8 )
        發帖:383
        威望:39 點
        金錢:831 USD
        貢獻:0 點
        註冊:2025-11-06

        1024
        TOP Posted: 03-28 09:22 引用 | 點評
        鸭打鹅


        級別:風雲使者 ( 13 )
        發帖:60062
        威望:5980 點
        金錢:0 USD
        貢獻:30456 點
        註冊:2022-02-02

        感谢分享
        TOP Posted: 03-28 16:48 引用 | 點評
        寻找我的开始


        級別:精靈王 ( 12 )
        發帖:4449
        威望:447 點
        金錢:147552 USD
        貢獻:32488 點
        註冊:2014-09-08

        谢谢分享
        TOP Posted: 04-07 12:31 引用 | 點評
        lyse


        級別:聖騎士 ( 11 )
        發帖:7339
        威望:776 點
        金錢:2860 USD
        貢獻:3928 點
        註冊:2015-11-05

        插件不就行啊
        TOP Posted: 03-27 11:22 引用 | 點評
        钓鱼


        級別:光明使者 ( 14 )
        發帖:5061
        威望:703 點
        金錢:203456453 USD
        貢獻:658299 點
        註冊:2014-05-13

        不明觉厉
        TOP Posted: 03-27 11:28 引用 | 點評
        有码青年


        級別:精靈王 ( 12 )
        發帖:6643
        威望:983 點
        金錢:7140 USD
        貢獻:77477 點
        註冊:2014-02-01

        感谢分享
        TOP Posted: 03-27 11:35 引用 | 點評
        .:. 草榴社區 » 技術討論區

        電腦版 手機版 客戶端 DMCA
        用時 0.02(s) x2, 04-16 00:40