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


級別:精靈王 ( 12 )
發帖:5040
威望:619 點
金錢:20479 USD
貢獻:50944 點
註冊:2015-03-07


自己写一段程序来自动下载论坛某个页面的所有图片,纯技术



直接开干!

首先说明一下,我这只有Mac和Linux系统,Windows在最后做点补充说明。

一、故事的开始

通常,打开终端,进入命令行,输入以下命令,回车执行:
複製代碼
curl -L https://t66y.com/htm_data/2603/7/7193659.html


大概率会显示如下信息:


但是,我用代理,浏览器是能正常打开的,能看到聚聚「涝汁海鲜」淫妻的大场面😄

那该怎么办呢?


二、有一种技术叫「Rust」

「Rust 是一门系统级编程语言,目标是同时做到高性能 + 内存安全 + 并发安全。它由 Mozilla 最初发起,现在由 Rust Foundation 维护。」

突然来这么一句,那就意味着,我们要用Rust语言搞她。

三、安装环境

继续在终端的命令行下执行下面命令:
複製代碼
curl https://sh.rustup.rs -sSf | sh

大概率会出现下面信息:
複製代碼
  1. curl https://sh.rustup.rs -sSf | sh
  2. info: downloading installer
  3. warn: It looks like you have an existing rustup settings file at:
  4. warn: /root/.rustup/settings.toml
  5. warn: Rustup will install the default toolchain as specified in the settings file,
  6. warn: instead of the one inferred from the default host triple.
  7. Welcome to Rust!
  8. //*
  9. 此处省略好多行
  10. *//
  11. 1) Proceed with standard installation (default - just press enter)
  12. 2) Customize installation
  13. 3) Cancel installation
  14. >
複製代碼

默认,直接回车安装。
等待安装执行完成后,会是这个结果:
複製代碼
  1. info: profile set to default
  2. info: default host triple is x86_64-unknown-linux-gnu
  3. info: syncing channel updates for stable-x86_64-unknown-linux-gnu
  4. info: latest update on 2026-03-26 for version 1.94.1 (e408947bf 2026-03-25)
  5. info: downloading 6 components
  6.         cargo installed                       10.46 MiB
  7.        clippy installed                        4.44 MiB
  8.     rust-docs installed                       20.60 MiB
  9.      rust-std installed                       28.46 MiB
  10.         rustc installed                       75.00 MiB
  11.       rustfmt installed                        2.11 MiB                                                                                                                                                               info: default toolchain set to stable-x86_64-unknown-linux-gnu
  12.   stable-x86_64-unknown-linux-gnu installed - rustc 1.94.1 (e408947bf 2026-03-25)
  13. Rust is installed now. Great!
  14. ////后面就都省略了
複製代碼

恭喜,这就表示安装成功了。
然后继续执行下面命令:
複製代碼
source $HOME/.cargo/env

使当前安装立即生效
然后执行下面命令验证一下:
複製代碼
cargo --version

如果出现类似于:
複製代碼
cargo 1.94.1 (29ea6fb6a 2026-03-24)

表示Rust以及其执行命令cargo安装成功。

接下来,我们测试下运行程序:
複製代碼
  1. cargo new hello
  2. cd hello
  3. cargo run
複製代碼

如果您要是之前没搞过编程,大概率会出现:
複製代碼
  1.     Creating binary (application) `hello` package
  2. note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
  3.    Compiling hello v0.1.0 (/root/hello)
  4. error: linker `cc` not found
  5.   |
  6.   = note: No such file or directory (os error 2)
  7. error: could not compile `hello` (bin "hello") due to 1 previous erro
複製代碼

这说明,光成功安装了Rust和Cargo还不够,创建新项目并尝试运行cargo run时遇到了链接器错误linker 'cc' not found。这个问题与Cargo.toml的清单格式无关,而是由于您的系统缺少编译Rust项目所必需的C语言工具链(构建依赖)。

所以,还得需要安装build-essential软件包组,它包含了GCC、G++、make等基本的编译工具。

那么,还是在命令行,执行以下命令:
複製代碼
  1. sudo apt update
  2. sudo apt install build-essential
複製代碼


我就不贴执行情况了,如果中间提示:
複製代碼
Do you want to continue? [Y/n]

你就直接选择【Y】回车,继续安装。
直到结束所有进程,回到待机状态,就表示安装完成了。

在执行前面的命令:
複製代碼
cargo run

那么,八九不离十,就应该出现:
複製代碼
  1.    Compiling hello v0.1.0 (/root/hello)
  2.     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.23s
  3.      Running `target/debug/hello`
  4. Hello, world!
複製代碼


到此,所有条件已经具备。

三、这才是我们要干的:编程

1、首先创建项目

仍然在命令行执行下面命令:
複製代碼
  1. cd
  2. cargo new img_fetcher
  3. cd img_fetche
複製代碼

这三行表示,退回到你的初始目录,然后创建新目录,并进入该目录
新目录名,你可以随便改。
执行完后,会自动创建下面目录和文件
複製代碼
  1. ll
  2. total 24
  3. drwxr-xr-x  4 root root 4096 Mar 27 01:15 ./
  4. drwx------ 10 root root 4096 Mar 27 01:15 ../
  5. -rw-r--r--  1 root root   82 Mar 27 01:15 Cargo.toml
  6. drwxr-xr-x  6 root root 4096 Mar 27 01:15 .git/
  7. -rw-r--r--  1 root root    8 Mar 27 01:15 .gitignore
  8. drwxr-xr-x  2 root root 4096 Mar 27 01:15 src
複製代碼

Cargo.toml是配置文件,src目录是我们要编写的程序,一个文件就行,他叫:「main.rs」
其它可以不用管了。

2、编辑并修改Cargo.toml
我习惯用nano,命令行执行:
複製代碼
nano Cargo.toml

按住「ctrl+k」,删除所有行,然后复制粘贴下面内容到里面:
複製代碼
  1. [package]
  2. name = "img_fetcher"
  3. version = "0.1.0"
  4. edition = "2021"
  5. [dependencies]
  6. reqwest = { version = "0.11", features = ["blocking"] }
  7. scraper = "0.18"
複製代碼

然后保存退出,nano我习惯按「ctrl+x」,然后按提示,输入「y」回车,即可保存退出到命令行。

3、编辑主程序:main.rs

我仍然用nano编辑器,命令行执行:
複製代碼
nano ./src/main.rs


清空里面的内容,复制粘贴下面代码,保存退出:
複製代碼
  1. use reqwest::blocking::Client;
  2. use scraper::{Html, Selector};
  3. use std::fs::{create_dir_all, File};
  4. use std::io::{copy, stdin};
  5. fn main() -> Result<(), Box<dyn std::error::Error>> {
  6.     // ===== 输入 =====
  7.     let mut input = String::new();
  8.     println!("输入URL:");
  9.     stdin().read_line(&mut input)?;
  10.     let url = input.trim().to_string();
  11.     input.clear();
  12.     println!("保存目录(默认 imgs):");
  13.     stdin().read_line(&mut input)?;
  14.     let dir = if input.trim().is_empty() {
  15.         "imgs".to_string()
  16.     } else {
  17.         input.trim().to_string()
  18.     };
  19.     input.clear();
  20.     println!("最小宽度px(默认 800):");
  21.     stdin().read_line(&mut input)?;
  22.     let min_width: u32 = if input.trim().is_empty() {
  23.         800
  24.     } else {
  25.         input.trim().parse().unwrap_or(800)
  26.     };
  27.     create_dir_all(&dir)?;
  28.     // ===== 请求页面 =====
  29.     let client = Client::builder().build()?;
  30.     let resp = client
  31.         .get(&url)
  32.         .header("User-Agent", "Mozilla/5.0")
  33.         .header("Cookie", "ismob=0")
  34.         .send()?;
  35.     let html = resp.text()?;
  36.     // ===== 解析图片 =====
  37.     let document = Html::parse_document(&html);
  38.     let selector = Selector::parse("img").unwrap();
  39.     let mut count = 0;
  40.     for element in document.select(&selector) {
  41.         if let Some(img_url) = element.value().attr("ess-data") {
  42.             println!("下载: {}", img_url);
  43.             let mut resp = client.get(img_url).send()?;
  44.             let filename = format!("{}/{}.jpg", dir, count);
  45.             let mut file = File::create(&filename)?;
  46.             copy(&mut resp, &mut file)?;
  47.             count += 1;
  48.         }
  49.     }
  50.     println!("完成,共下载 {} 张图片", count);
  51.     // ===== 说明 min_width =====
  52.     println!("默认最小宽度为 {}px (当前版本不做实际过滤)", min_width);
  53.     Ok(())
  54. }
複製代碼


四、执行程序

在当前目录下,命令行执行:
複製代碼
cargo run

那么,系统会自动编译程序:

不出意外的话,最终会出现:


然后我们按提示输入我们要下载页面的地址,比如:https://t66y.com/htm_data/2603/7/7193659.html
然后还可以按提示输入保存目录、图片最小宽度筛选,也可以直接回车,采用默认参数

我这就成功下载到了指定目录:


查看一下文件列表:

前面的数字表示大小,单位是K,紧挨着就是文件名,自动数字。

到此,主要功能就完成了。

五、Windows下咋办

大概率应该是这样的:
在Windows上运行Rust程序,只需以下几个简单步骤:
1. 安装Rust工具链
访问 https://www.rust-lang.org/tools/install 下载并运行 rustup-init.exe,按提示完成安装。
2. 安装MSVC构建工具
安装 ‌Visual Studio Installer‌,然后选择“使用C++的桌面开发”工作负载,确保勾选“Windows 10/11 SDK”和“MSVC v143 - VS 2022 C++ x64/x86 生成工具”。
3. 然后就可以参照前面的创建项目、编辑程序、执行


六、其它

万一在安装、执行过程中遇到什么问题,建议把问题复制给AI,先让AI帮你解决,实在不行,再到此讨论。


内容冗长,耽搁大家时间,感谢捧场。

赞(91)
DMCA / ABUSE REPORT | TOP Posted: 03-27 10:19 樓主 引用 | 發表評論
丰色 [樓主]


級別:精靈王 ( 12 )
發帖:5040
威望:619 點
金錢:20479 USD
貢獻:50944 點
註冊:2015-03-07


有问题也可以在此提出


點評

    TOP Posted: 03-27 10:20 #1樓 引用 | 點評
    百鸟争鸣


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

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


    點評

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


      級別:騎士 ( 10 )
      發帖:2333
      威望:504 點
      金錢:11145 USD
      貢獻:0 點
      註冊:2023-01-21

      感谢分享
      TOP Posted: 03-27 10:40 #3樓 引用 | 點評
      反骨佬


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

      我用shell写过一个
      TOP Posted: 03-27 10:42 #4樓 引用 | 點評
      陈贯希


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

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


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

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


      級別:聖騎士 ( 11 )
      發帖:5662
      威望:661 點
      金錢:17225 USD
      貢獻:16572 點
      註冊:2023-04-07

      不明觉厉
      TOP Posted: 03-27 10:50 #7樓 引用 | 點評
      特洛夫斯基


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

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


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

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

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

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


      此貼由蓝莓山药重新編輯:2026-03-27 11:20
      TOP Posted: 03-27 10:52 #9樓 引用 | 點評
      独醉笑清风


      級別:騎士 ( 10 )
      發帖:1817
      威望:350 點
      金錢:6259 USD
      貢獻:7184 點
      註冊:2022-06-02

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


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


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


      級別:聖騎士 ( 11 )
      發帖:6317
      威望:665 點
      金錢:2296 USD
      貢獻:3397 點
      註冊:2015-11-05

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


      級別:光明使者 ( 14 )
      發帖:2847
      威望:521 點
      金錢:205042224 USD
      貢獻:499699 點
      註冊:2014-05-13

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


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

      感谢分享
      TOP Posted: 03-27 11:35 #14樓 引用 | 點評
      星河大帝


      級別:騎士 ( 10 )
      發帖:2693
      威望:364 點
      金錢:5213 USD
      貢獻:2 點
      註冊:2025-09-26

      技术贴支持了
      ------------------------
      TOP Posted: 03-27 11:40 #15樓 引用 | 點評
      如此这般


      級別:聖騎士 ( 11 )
      發帖:6165
      威望:757 點
      金錢:42959 USD
      貢獻:89 點
      註冊:2011-06-06

      感谢分享
      TOP Posted: 03-27 11:47 #16樓 引用 | 點評
      麋鹿啾啾


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


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


      點評

        TOP Posted: 03-27 11:50 #17樓 引用 | 點評
        茉莉雨


        級別:精靈王 ( 12 )
        發帖:5193
        威望:733 點
        金錢:4285 USD
        貢獻:49186 點
        註冊:2022-05-31

        很强!
        TOP Posted: 03-27 11:57 #18樓 引用 | 點評
        pepsi-cola


        級別:俠客 ( 9 )
        發帖:2040
        威望:282 點
        金錢:3664 USD
        貢獻:0 點
        註冊:2022-04-28

        感谢分享
        TOP Posted: 03-27 11:58 #19樓 引用 | 點評
        周老板


        級別:新手上路 ( 8 )
        發帖:188
        威望:34 點
        金錢:1836 USD
        貢獻:0 點
        註冊:2017-08-18

        手机浏览器能实现么?
        TOP Posted: 03-27 12:05 #20樓 引用 | 點評
        耕耘一分收获


        級別:俠客 ( 9 )
        發帖:1764
        威望:242 點
        金錢:4141 USD
        貢獻:0 點
        註冊:2024-11-18

        技术贴,发帖辛苦
        TOP Posted: 03-27 12:31 #21樓 引用 | 點評
        陈十三


        級別:騎士 ( 10 )
        發帖:2175
        威望:483 點
        金錢:55492 USD
        貢獻:63 點
        註冊:2024-04-20

        厉害了大佬
        技术贴
        TOP Posted: 03-27 13:01 #22樓 引用 | 點評
        洛比


        級別:俠客 ( 9 )
        發帖:1280
        威望:205 點
        金錢:12451 USD
        貢獻:0 點
        註冊:2022-09-02


        感谢分享
        TOP Posted: 03-27 13:04 #23樓 引用 | 點評
        hatasuki12


        級別:聖騎士 ( 11 )
        發帖:6214
        威望:628 點
        金錢:497 USD
        貢獻:2875 點
        註冊:2014-05-11

        技术贴,感谢分享!
        ------------------------
        B
        TOP Posted: 03-27 13:05 #24樓 引用 | 點評

        .:. 草榴社區 -> 技術討論區

        快速回帖 頂端
        內容
        HTML 代碼不可用

        使用簽名
        Wind Code自動轉換

        按 Ctrl+Enter 直接提交