You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java技术问询:如何从XKCD页面抓取图片URL以下载前100幅漫画

解决XKCD漫画图片URL抓取的简便方法

嘿,这个问题我太熟悉了!XKCD其实贴心地给开发者提供了官方的JSON API,完全不用费劲去解析网页HTML来抓图片URL,直接调用API就能拿到所有你需要的信息,比抓页面高效多了!

核心思路:用XKCD官方API

每一幅XKCD漫画都对应一个JSON接口,格式是:
https://xkcd.com/{漫画编号}/info.0.json

比如第10幅漫画的API地址就是https://xkcd.com/10/info.0.json,请求这个地址会返回一个JSON对象,里面的img字段就是你要找的图片直接URL,除此之外还包含标题、alt文本等额外信息,非常实用。

你的Java代码修改示例

下面是基于你的代码扩展后的完整示例,用原生Java的HttpURLConnection请求API并解析JSON(你需要引入org.json库来处理JSON,或者替换成Jackson/Gson这类你熟悉的JSON库):

import java.io.IOException;
import java.net.URL;
import java.net.HttpURLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.json.JSONObject;

public class XKCD {
    // 获取指定编号漫画的图片URL
    public static String getXKCDImageUrl(int comicNumber) throws IOException {
        String apiUrl = "https://xkcd.com/" + comicNumber + "/info.0.json";
        URL url = new URL(apiUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        
        // 读取API返回的JSON内容
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuilder content = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }
        
        // 关闭资源
        in.close();
        conn.disconnect();
        
        // 解析JSON拿到图片URL
        JSONObject json = new JSONObject(content.toString());
        return json.getString("img");
    }

    // 你原来的保存图片方法
    public static void saveImage(String imageUrl, int i) throws IOException {
        URL url = new URL(imageUrl);
        String fileName = url.getFile();
        String destName = i + fileName.substring(fileName.lastIndexOf("/"));
        // ... 这里继续写你的文件保存逻辑,比如输入流读取并写入本地文件
    }

    // 主方法:批量下载前100幅漫画
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            try {
                String imgUrl = getXKCDImageUrl(i);
                saveImage(imgUrl, i);
                System.out.println("成功保存第" + i + "幅漫画");
            } catch (IOException e) {
                System.err.println("下载第" + i + "幅漫画失败:" + e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

额外提示

  • 如果你不想用org.json库,也可以用Gson或者Jackson这类更流行的JSON解析库,只需要定义一个简单的POJO类来映射JSON字段(比如XKCDComic类,包含img、title等属性),解析起来会更简洁。
  • XKCD的API没有请求频率限制,但建议不要过于频繁地请求,避免给服务器造成压力。
  • 前100幅漫画的编号都是有效的,不用担心404问题,如果后续要下载更多,记得处理可能的异常情况。

内容的提问来源于stack exchange,提问作者Stuart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:19