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

时间:2018-04-27 15:35:06

标签: java

我正在制作一个从 XKCD 网站下载前100个漫画的程序,但XKCD的网址与图片网址不同。为了方便起见,我想知道在转到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 个答案:

答案 0 :(得分:1)

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

  

是否有自动系统访问漫画和元数据的界面?   是。您可以通过JSON界面获取漫画,例如http://xkcd.com/info.0.json(当前漫画)和http://xkcd.com/614/info.0.json(漫画#614)等网址。

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

非常好用,我经常使用它。

因此,如果您在txt中有来自xkcd.com/info.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);

这应该有用。

答案 1 :(得分:0)

我建议使用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);
}

如果您运行此代码,您将在控制台上看到打印出的图片网址:

https://imgs.xkcd.com/comics/river_border.png

答案 2 :(得分:-1)

这里的问题是你不是用图像调用saveImage方法,而是用页面URL调用。

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

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