>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22975 个阅读者 刷新本主题
 * 贴子主题:  【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面向对象编程-->类的生命周期
  JavaWeb开发-->访问数据库(Ⅰ)
  JSP与Hibernate开发-->立即检索和延迟检索策略
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->计算属性和数据监听
  Vue3开发-->组合(Composition)API
  【Vue.js技术专题】CSS中DOM元素的过渡模式
  【Vue.js技术专题】在Vue项目中使用Axios
  【Spring Cloud Alibaba专题】ShardingSphere核心概念
  【Java基础编程专题】浮点数的格式化以及运算精度
  向小伙伴们推荐我所创作前后端编程书籍的学习顺序
  【Spring专题】把Model的数据存放在session范围
  探讨IT技术作者的素养
  【持久化专题】用@Formula注解映射派生属性
  【持久化专题】对象-关系的映射概念
  【Java网络编程专题】创建基于SSL的安全服务器和安全客户的范...
  【Java网络编程专题】优化访问数据库的程序代码的一些技巧
  【Java网络编程专题】通过JDBC API调用存储过程
  【JavaWeb专题】在JavaWeb应用中对客户请求的异步处理
  【JavaWeb专题】在Servlet中利用Apache开源类库实现文件上传
  IT技术书写作技巧分享:慎用概念和术语
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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