某些图片网站的爬取历程
今天不知道为什么对Java爬虫异常感兴趣,就参照API文档和别人的教程写了一个爬取http://www.netbian.com/网站的程序,下面直接上源码!!!package com.cn.utils;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
/**
* @AuThor :tanyongfeng
* @version 1.0.0
*/
public class ImageDownloading {
public static void main(String[] args) {
ArrayList<String> filePath = new ArrayList<>();//构建文件路径集合
ArrayList<String> fileId= new ArrayList<>();//构建独一无二的文件名
String url;//可以diy的地址
for (int PageIndex =2 ; PageIndex < 20 ; PageIndex++){
if (PageIndex == 1){//网站http://www.netbian.com/1_index.htm会显示404 所以判断
url= "http://www.netbian.com/";
}else{
url= "http://www.netbian.com/index_"+PageIndex+".htm";
};
try {
Document doc = Jsoup.connect(url).get();
Elements el = doc.getElementsByClass("list");//获取class值为list的元素
Elements li = el.select("li").select("a");//获取div下的 li下的a标签
for (Element element : li){//遍历
String url1 = String.valueOf(element.attr("href"));//获取第二层的href
if (url1.contains("p")){//有些href是广告 和图片链接最主要的区别是 含有字母p 所以判断一下
continue;
}
String ID = url1.substring(6,11);//获取文件ID 这个独一无二的值
fileId.add(ID);//添加到集合中
String url2 = "http://www.netbian.com/desk/"+ID+"-1920x1080.htm";//构建下载1080P图片地址
/* 第二层网页跳转开始抓取 */
Document document = Jsoup.connect(url2).get();
Element ending = document.getElementById("endimg");
Elements img = ending.getElementsByTag("img");
filePath.add(img.get(0).attr("src"));
}
} catch (IOException e) {
System.out.println("抓取文件过程中出错");
e.printStackTrace();
}finally {
System.out.println("爬取完第"+PageIndex+"页");
}
}
try {
SavePng(filePath,fileId);//开始根据文件地址和文件名进行下载保存
} catch (Exception e) {
System.out.println("保存文件过程中出错");
e.printStackTrace();
}finally {
System.out.println("保存完成");
}
}
//下载图片到本地函数
/**
*
* @Param filePath 文件路径
* @param fileId 文文件ID
*/
public static void SavePng(ArrayList<String> filePath,ArrayList<String> fileId){
ByteOutputStream byteOutputStream = null;
FileOutputStream fileOutputStream = null;
DataInputStream dataInputStream = null;
//遍历保存图片
for (int index = 0 ; index < filePath.size() ; index++){
URL url = null;
try {
url = new URL(filePath.get(index));
dataInputStream = new DataInputStream(url.openStream());
File file = new File("D:/test/"+fileId.get(index)+".jpg");
fileOutputStream = new FileOutputStream(file);
byteOutputStream = new ByteOutputStream();
byte[] buffer = new byte;
int length;
/*写入字节*/
while ((length = dataInputStream.read(buffer))>0){
byteOutputStream.write(buffer,0,length);
}
byte[] context = byteOutputStream.toByteArray();
fileOutputStream.write(context);
System.out.println("保存了"+file.getName());
} catch (MalformedURLException e) {
System.out.println("URL转换错误");
e.printStackTrace();
} catch (FileNotFoundException e) {
System.out.println("无法创建文件");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件传输出现错误");
e.printStackTrace();
}
}
/*关闭流*/
try {
fileOutputStream.close();
byteOutputStream.close();
dataInputStream.close();
} catch (IOException e) {
System.out.println("关闭流出现错误");
e.printStackTrace();
}
}
}
其中我使用的是 Jsoup 技术
因此需要首先引入依赖
<dependencies> <dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
</dependencies>
同时如果你进网站可以自定义源码中的url变量(也就是图片分类) 比如改成 http://www.netbian.com/meinv/.....你会发现新大陆..
文件默认保存在D:/test目录下.如果有问题可以评论哦!!
请大家赏个币吧哈哈。
成功截图
下载的图片都是1920*1080的图片 图片质量非常好 半夏orz 发表于 2020-7-27 22:16
感谢回复
我的表述有问题,如果下载地址不能直接拿到,而是点击下载时后台生成的,而下载需要登录。这样 ...
我这个源码只适用于上述的网站.下载地址一般来说都是和网页源代码显示的一致.如果是网站重定向和请求转发应该是没有问题的 Tanyongfeng 发表于 2020-7-25 21:52
后缀无规律的是什么意思
感谢回复
我的表述有问题,如果下载地址不能直接拿到,而是点击下载时后台生成的,而下载需要登录。这样会不会就很麻烦。
再恶心一点,下载要积分。。。
大佬牛逼 是高清的图吗? 学习了,谢谢分享 感谢楼主分享 谢谢 感谢分享 爬虫真的有用 学习了 {:1_893:} java爬要导好多包啊,python的话要用的包相对少一些 学习了,第一次知道java爬虫 就是那个秋 发表于 2020-7-24 00:12
是高清的图吗?
1080P的图