>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22988 个阅读者 刷新本主题
 * 贴子主题:  【Java网络编程专题】用Apache HttpClients下载网上的图片等各种数据 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2020-01-10 11:24:15     消息  查看  搜索  好友  邮件  复制  引用

参考资料

(1)Apache HttpClients的类库下载地址:http://hc.apache.org/downloads.cgi
(2)Apache HttpClients的API 的JavaDoc文档:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/index.html
(3)本文参考了笔者所写的《Java网络编程核心技术详解》,电子工业出版社出版。
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
(4)更多抓取网页数据的各种实用技巧,请参考:盘点用Java抓取HTTP服务器和FTP服务器的网页数据或图片等数据的实用技巧

下载图片的范例

import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

/* 利用Apache的HttpClient来下载图片等二进制文件非常方便
  但是它没有执行JavaScript脚本功能,因此不能正确获得需要执行JavaScript脚本才能产生的HMTL文档
*/

public class ApacheClient {
    public static void main(String[] args) throws IOException{
       byte[] imgData=getByteSource("http://www.javathinker.net/image/topadv-funnyjava.png");
       FileOutputStream out=new FileOutputStream("C:\tmp\\topadv-funnyjava.png");
       out.write(imgData);  //把图片数据保存到文件中
       out.close();
    }

    /** 获取参数url对应的数据的字节流 */
    public static byte[] getByteSource(String url) throws IOException{
        CloseableHttpClient client = null;
        byte[] result=null;
        client = HttpClients.createDefault();
         result=getData(client,url);
         client.close();  
         return result;
    }

    /** 通过 Apache CloseableHttpClient来读取数据 */
    public static byte[] getData(CloseableHttpClient client, String url)throws IOException {
         ByteArrayOutputStream buffer=null;
        // 发送get请求
        HttpGet request = new HttpGet(url);
        // 设置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(50000).setConnectTimeout(50000).build();

        // 设置请求头
        request.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1");

        request.setConfig(requestConfig);
  
        CloseableHttpResponse response = client.execute(request);

         if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
                HttpEntity entity = response.getEntity();
                InputStream in = entity.getContent();
                buffer=new ByteArrayOutputStream();
                byte[] buff=new byte[1024];  
                int len=-1;

                while((len=in.read(buff))!=-1){
                     buffer.write(buff,0,len);
                 }
         }
         request.releaseConnection();
         if(buffer!=null)
              return  buffer.toByteArray();
         else
              return null;
    }
}

作者:孙卫琴


程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 admin 在 2021-10-09 10:52:02 重新编辑]
  Java面向对象编程-->Swing组件(下)
  JavaWeb开发-->使用Session(Ⅱ)
  JSP与Hibernate开发-->立即检索和延迟检索策略
  Java网络编程-->XML数据处理
  精通Spring-->Vue Router路由管理器
  Vue3开发-->Vue简介
  【Vue.js技术专题】路由管理器的基本用法
  【Vue.js技术专题】CSS中DOM元素的过渡模式
  【Spring Cloud Alibaba专题】Seata的架构
  【Spring Cloud Alibaba专题】ShardingSphere核心概念
  【Spring专题】@Query注解设定查询语句
  【Spring专题】Spring框架的数据验证机制
  视频:我的Java课堂总动员,带领小白们走马观花看Java江湖
  探讨IT技术作者的素养
  【持久化专题】用@Formula注解映射派生属性
  【持久化专题】FetchType.LAZY延迟检索策略
  【持久化专题】JPA的事件处理API的用法
  【持久化专题】EntityManager和Session的merge()方法详解
  【Java网络编程专题】优化访问数据库的程序代码的一些技巧
  【持久化专题】通过JPQL查询语句进行批量处理数据
  【JavaWeb专题】Spring MVC创建Web应用范例,轻松入门
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。