java使用jsoup抓取网页图片


有时需要抓取网页的图片。 一般有几种方式:

1、python是最方便的,但是有学习成本。
2、图片批量下载软件,这个可用,但是不支持多页面,抓取规则也不太灵活。
3、java来抓取,讲真不是最高效的,但是职业就是java,不用学习成本。

pom.xml中引入jsoup

<dependency>
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	<version>1.9.1</version>
</dependency>

代码

/**
 * 1、STORE_LOCATION 是图片存储路径,这个根据需要自定义
 * 2、抓取图片的需求不同,规则自定义下
 * 3、多网页抓取,用个for循环即可。
 */
public class DownloadImageUtils {
    private static Logger logger = LoggerFactory.getLogger(DownloadImageUtils.class);
    public static String STORE_LOCATION="F:\\pic\\";
    public static List<Image> images =new ArrayList<Image>();

    public static void main(String[] args) {
       String netUrl = "http://www.baidu.com"; //要爬的网页
       new DownloadImageUtils().start(netUrl);
    }

    public void start(String pageUrl){
        List<Image> images = parsePage(pageUrl);
        downloadImage(images);
    }

    public List<Image> parsePage(String pageUrl){
        List<Image> images =new ArrayList<Image>();
        Connection connect = Jsoup.connect(pageUrl);
        Document document = null;
        try {
            document = connect.get();
            /* 自定义规则 */
            Elements elements = document.getElementsByTag("img"); // 找到所有img标签
                for (Element element : elements) {
                    String alt = element.attr("alt");
                    String src = element.attr("src");
                    Image image =  new Image();
                    if(!StringUtils.isEmpty(alt) && src.contains("imgs") && !src.contains("imgs2")){
                        System.out.println(element.html());
                        System.out.println(element.attr("src"));
                        image.setAlt(alt.replace("-FHD",""));
                        image.setSrc(src);
                        images.add(image);
                    }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return images;
    }


    //下载该图片!
    public void downloadImage(List<Image> images){
        for (Image image:images) {
            InputStream in = null;
            BufferedOutputStream os = null;
            try {
                URL url = new URL(image.getSrc());
                File file = new File(STORE_LOCATION + image.getAlt() + ".jpg");
                logger.info("filename:{}",file.getAbsoluteFile());
                if(file.exists()){ //
                    return;
                }
                URLConnection conn = url.openConnection();
                in = conn.getInputStream();
                os = new BufferedOutputStream(new FileOutputStream(file.getAbsoluteFile()));
                byte[] buff = new byte[1024];
                int num = 0;
                while((num = in.read(buff))!= -1)
                {
                    os.write(buff, 0, num);
                    os.flush();
                }
            } catch (MalformedURLException e) {
                logger.error("获取图片url异常");
                e.printStackTrace();
            } catch (IOException e) {
                logger.error("下载图片url连接异常");
                e.printStackTrace();
            }
            finally{
                if( in != null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        logger.error("读入流关闭异常");
                    }
                }
                if( os != null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        logger.error("输出流关闭异常");
                    }
                }
            }
        }
    }

    static class Image {
        private String alt;
        private String src;
        public String getAlt() {
            return alt;
        }
        public void setAlt(String alt) {
            this.alt = alt;
        }
        public String getSrc() {
            return src;
        }
        public void setSrc(String src) {
            this.src = src;
        }
    }
}

jsoup的一些方法

jsoup 获取元素的方法不只一种,代码:

// 根据标签获取元素
document.getElementsByTag("img");
// 根据css样式获取元素
document.query(".red");

URLConnection 和 jsoup

使用URLConnection,来读取网页内容也是可以的。 但是解析的时候只能硬拼字符串了,还是比较头疼。 jsoup方便很多。

URL myurl = new URL(netUrl);
URLConnection myconn = myurl.openConnection();
InputStream myin = myconn.getInputStream();
mybr = new BufferedReader(new InputStreamReader(myin,"UTF-8"));
String line;
while((line = mybr.readLine())!= null)
{
    getImageUrl(line,netUrl);//判断网页中的jpg图片
}

猜你喜欢

转载自blog.csdn.net/enthan809882/article/details/106311104