最近在学习使用Jsoup爬取网页数据时遇到一个问题就是,我在爬取网页的图片时,获得的图片不全,明明网页上有很多图片,但是我只获取了几张,不知道是什么原因,还请各位大神能够指教一下,在线等,挺急的呢!!!
可能是 js 程序 后来加进去的
应该没有,我都不晓得是什么问题,哎。
有些是显示链接,如果是链接,你要再重新请求一次
嗯嗯,你的意思我晓得了,但是为啥一些正常的<div><img>标签里的图片我都没有下载完全呢,明明有很多张,但是我下载下来的只有两张。
@肥猫桂子: 下载图片是要时间的,你可以试试先把img里面的链接全部获取,然后循环去下载保存
@三人乐乐: 嗯嗯,我是这么写的,也不知道对不对。
public static List<String> getPicSrc(String url) throws IOException{
List<String> srcList=new ArrayList<String>();
/**从URL加载文档*/
Document document=Jsoup.connect(url).maxBodySize(0).get();
/**从文件加载文档*/
//Document document =Jsoup.parse(url);
/**获取文档标题*/
System.out.println("网页标题:"+document.title());
/**获取HTML页面所有图片*/
//Elements images = document.select("img[src~=(?i)\.(png|jpe?g|gif)]");
Elements elements=document.getElementsByTag("img");
for(Element e:elements){
String src=e.attr("src");
System.out.println("图片地址:"+src);
srcList.add(src);
}
return srcList;
}
public static void picZip(List<String> src) throws Exception{
/**图片下载后的保存地址*/
File file =new File("F:/Pictures.zip");
/**若目录或文件不存在,则创建一个*/
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
/**压缩流,将写入输出流的内容压缩输出,生成压缩包*/
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(file));
for(String s:src){
/**每一张图片压缩后的文件名称*/
String picName=s.substring(s.lastIndexOf("/"), s.length());
URL url =new URL(s);
/**获取URl连接*/
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
/**获取输入流*/
InputStream input =connection.getInputStream();
/**设置每一个压缩内容的名称*/
out.putNextEntry(new ZipEntry(picName));
byte[] buffer= new byte[1024];
int length;
/**将输入流中的内容读取出来,并写入输出流*/
while((length=input.read(buffer))>0){
out.write(buffer, 0, length);
}
input.close();
}
out.close();
System.out.println("压缩包已生成,地址:"+file.getAbsolutePath());
}
@肥猫桂子: 我感觉思路没啥问题,反正我写,也是跟你这个差不多,建议你得到图片地址之后,用多线程获取图片
@三人乐乐: 好的呢,谢谢。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class ImgDownloader{
public void getDoc() throws IOException {
File f = new File("T:\\imgs");
if (!f.exists()) {
f.mkdirs();
}
String picUrl = "http://xxx.com/images/";
Document doc = Jsoup.connect(picUrl).get();
Elements links = doc.select("a[href]");
for (Element e : links) {
if (Pattern.matches(".*?jpe?g|png|git$", e.attr("href"))) {
String src = e.absUrl("href");
String imageName = src.substring(src.lastIndexOf("/") + 1, src.length());
URL url = new URL(src);
URLConnection uri = url.openConnection();
InputStream is = uri.getInputStream();
OutputStream os = new FileOutputStream(new File("E:/imgs/somedir", imageName));
byte[] buf = new byte[1024];
int len = -1;
while ((len = is.read(buf)) != -1) {
os.write(buf, 0, len);
}
}
}
}
public static void main(String[] args) throws IOException {
new ImgDownloader().getDoc();
}
}
嗯嗯,非常感谢。之前看了一下是因为有些图片是动态加载进去的,我的只能实现静态页面的,然后我又用了HtmlUtil可以还是获取不到,哎,刚接触是在是不熟。