有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从java中的页面获取不同的url?

我正在开发一个程序,从XKCD网站下载前100本漫画,但是XKCD的URL与图像URL不同。为了方便起见,我想知道在转到XKCD URL之后是否有一种简单的方法来获取图像的URL。这是我的密码:

public class XKCD {

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("/"));
System.out.println(destName);

InputStream is = url.openStream();
OutputStream os = new FileOutputStream(destName);

byte[] b = new byte[2048];
int length;

while ((length = is.read(b)) != -1) {
    os.write(b, 0, length);
}

is.close();
os.close();
}
public static void main(String[] args) throws MalformedURLException, 
IOException {
    for(int i=1;i<=100;i++){
        saveImage("https://xkcd.com/"+i+"/", i);
    }
}

共 (3) 个答案

  1. # 1 楼答案

    我建议用JSOUP来做这件事。它可以从相对链接生成绝对URL:

    您可以使用以下方法将库导入到项目中:

    <!  https://mvnrepository.com/artifact/org.jsoup/jsoup  >
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.11.2</version>
    </dependency>
    

    您可以使用如下简单代码获得图像的绝对路径:

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.connect("https://xkcd.com/").get();
        Elements links = document.select("img");
        links.stream()
                .map(link -> link.absUrl("src"))
                .filter(str -> str.contains("/comics"))
                .forEach(System.out::println);
    }
    

    如果运行此代码,您将看到控制台上打印的图像URL:

    https://imgs.xkcd.com/comics/river_border.png
    
  2. # 2 楼答案

    XKCD有一个JSON API:https://xkcd.com/about/

    Is there an interface for automated systems to access comics and metadata? Yes. You can get comics through the JSON interface, at URLs like http://xkcd.com/info.0.json (current comic) and http://xkcd.com/614/info.0.json (comic #614).

    下面是一个很好的JavaJSON库:https://github.com/stleary/JSON-java

    真的很容易使用,我用了很多

    因此,如果您有来自xkcd的文本。com/info。txt中的0.json,您可以说:

    import org.json.*;
    
    JSONObject obj=new JSONObject(txt);
    String url=obj.getString("img");
    String titleText=obj.getString("alt");
    int year=Integer.parseInt(obj.getString("year"));
    int num=Integer.parseInt(obj.getString("num"));
    int month=Integer.parseInt(obj.getString("month"));
    int day=Integer.parseInt(obj.getString("day"));
    String title=obj.getString("title");
    
    Image img=downloadImageOrWhateverYouDoWithTheImageURL(url);
    

    这应该行得通

  3. # 3 楼答案

    这里的问题是,调用saveImage方法不是使用image,而是使用页面URL

    获取页面本身,然后从以下示例字符串解析正则表达式:

    "Image URL (for hotlinking/embedding): https://imgs.xkcd.com/comics/barrel_cropped_(1).jpg"