获取网页的HTML文本

想要爬取网站上的图片第一步需要先把网站的html代码爬取下来,然后在使用正则表达式先获取img标签,在根据img正则获取到得集合获取src路径,然后在遍历集合把图片保存到本地

下述代码需要使用httpclient,所以需要使用maven导入

     <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.12</version>
         </dependency>

获取HTML文本方法

    //获取HTML内容
    private static String getHtml(String url) throws Exception {
        URL url1 = new URL(url);//使用java.net.URL
        URLConnection connection = url1.openConnection();//打开链接
        InputStream in = connection.getInputStream();//获取输入流
        InputStreamReader isr = new InputStreamReader(in);//流的包装
        BufferedReader br = new BufferedReader(isr);

        String line;
        StringBuffer sb = new StringBuffer();
        while ((line = br.readLine()) != null) {//整行读取
            sb.append(line, 0, line.length());//添加到StringBuffer中
            sb.append('\n');//添加换行符
        }
        //关闭各种流,先声明的后关闭
        br.close();
        isr.close();
        in.close();
        return sb.toString();
    }

得到HTML内容后在根据正则表达式获取所有的img标签

img标签正则

    // 获取img标签正则
    private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";

获取img标签文本方法

//获取ImageUrl地址
    private static List<String> getImageUrl(String html) {
        Matcher matcher = Pattern.compile(IMGURL_REG).matcher(html);
        List<String> listimgurl = new ArrayList<String>();
        while (matcher.find()) {
            listimgurl.add(matcher.group());
        }
        return listimgurl;
    }

得到img标签集合后在根据正则表达式获取图片的URL路径

src正则

    // 获取src路径的正则
    private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";

获取src下的URL方法

    //获取ImageSrc地址
    private static List<String> getImageSrc(List<String> listimageurl) {
        List<String> listImageSrc = new ArrayList<String>();
        for (String image : listimageurl) {
            Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(image);
            while (matcher.find()) {
                listImageSrc.add(matcher.group().substring(0, matcher.group().length() - 1));
            }
        }
        return listImageSrc;
    }

最后遍历得到的集合调用保存图片的方法,把图片保存到本地

保存图片的方法

图片默认保存路径F:\images

图片名称默认使用UUID随机生成字符串保存

public static String doGetImage(String url) {
        //获取HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //设置HttpGet请求对象,设置url地址
        HttpGet httpGet = new HttpGet(url);
        System.out.println("当前URL:" + url);
        //设置请求信息
       // httpGet.setConfig(this.getConfig());

        //使用HttpClient发起请求,获取响应
        try (CloseableHttpResponse response = httpClient.execute(httpGet);) {
            //解析响应,返回结果
            if (response.getStatusLine().getStatusCode() == 200) {
                //判断响应体是否不为空,如果不为空就可以使用EntityUtils
                if (response.getEntity() != null) {
                    //下载图片
                    //获取图片的后缀
                    String extName = url.substring(url.lastIndexOf("."));

                    //创建图片名,重命名图片
                    String picName = UUID.randomUUID().toString() + extName;
                    String fileName = "F:\\images\\";
                    File file = new File(fileName);
                    if (!file.exists()) {
                        file.mkdir();
                    }
                    //下载图片
                    //声明OutPutStream
                    OutputStream outputStream = new FileOutputStream(new File(fileName + picName));

                    response.getEntity().writeTo(outputStream);

                    //返回图片名称
                    System.out.println("图片名称:"+picName);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //如果下载失败,返回空串
        return "";
    }

以上代码只适用于图片路劲为完整的URL路劲,相对路径未测试

最后修改:2021 年 06 月 15 日 11 : 53 PM
如果觉得我的文章对你有用,请随意赞赏