首页 新闻 会员 周边

Jsoup爬取网页图片

0
悬赏园豆:50 [已解决问题] 解决于 2019-03-14 14:25

最近在学习使用Jsoup爬取网页数据时遇到一个问题就是,我在爬取网页的图片时,获得的图片不全,明明网页上有很多图片,但是我只获取了几张,不知道是什么原因,还请各位大神能够指教一下,在线等,挺急的呢!!!

肥猫桂子的主页 肥猫桂子 | 初学一级 | 园豆:119
提问于:2019-03-03 15:31
< >
分享
最佳答案
0

可能是 js 程序 后来加进去的

收获园豆:50
电磁魔王喵喵 | 小虾三级 |园豆:1339 | 2019-03-03 17:09

应该没有,我都不晓得是什么问题,哎。

肥猫桂子 | 园豆:119 (初学一级) | 2019-03-04 10:52
其他回答(2)
0

有些是显示链接,如果是链接,你要再重新请求一次

三人乐乐 | 园豆:4819 (老鸟四级) | 2019-03-04 14:40

嗯嗯,你的意思我晓得了,但是为啥一些正常的<div><img>标签里的图片我都没有下载完全呢,明明有很多张,但是我下载下来的只有两张。

支持(0) 反对(0) 肥猫桂子 | 园豆:119 (初学一级) | 2019-03-04 14:45

@肥猫桂子: 下载图片是要时间的,你可以试试先把img里面的链接全部获取,然后循环去下载保存

支持(0) 反对(0) 三人乐乐 | 园豆:4819 (老鸟四级) | 2019-03-04 14:51

@三人乐乐: 嗯嗯,我是这么写的,也不知道对不对。
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());
}

支持(0) 反对(0) 肥猫桂子 | 园豆:119 (初学一级) | 2019-03-04 14:56

@肥猫桂子: 我感觉思路没啥问题,反正我写,也是跟你这个差不多,建议你得到图片地址之后,用多线程获取图片

支持(0) 反对(0) 三人乐乐 | 园豆:4819 (老鸟四级) | 2019-03-04 15:04

@三人乐乐: 好的呢,谢谢。

支持(0) 反对(0) 肥猫桂子 | 园豆:119 (初学一级) | 2019-03-04 15:06
0
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();
    }
}
CaiYongji | 园豆:1267 (小虾三级) | 2019-03-07 11:21

嗯嗯,非常感谢。之前看了一下是因为有些图片是动态加载进去的,我的只能实现静态页面的,然后我又用了HtmlUtil可以还是获取不到,哎,刚接触是在是不熟。

支持(0) 反对(0) 肥猫桂子 | 园豆:119 (初学一级) | 2019-03-07 12:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册