我正在制作一个从 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);
}
}
答案 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"