java学习-GET方式抓取网页(UrlConnection和HttpClient)
抓取网页其实就是模拟客户端(PC端,手机端。。。)发送请求,获得响应数据documentation,解析对应数据的过程。---自己理解,错误请告知
一般常用请求方式有GET,POST,HEAD三种
GET请求的数据是作为url的一部分,对于GET请求来说,附带数据长度有限制,数据安全性低
POST请求,数据作为标准数据传输给服务器,数据长度没有限制,数据通过加密传输,安全性高
HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
闲话少说。
通过GET请求获取网页
UrlConnection下载网页通过InputStream读取数据,通过FileOutPutStream将数据写入文件
public class DownloadHtml {
    /**
     * 方法说明:用于下载HTML页面
     *@param SrcPath  下载目标页面的URL
     *@param filePath 下载得到的HTML页面存放本地目录
     *@param fileName  下载页面的名字
     */
    public static void downloadHtmlByNet(String SrcPath,String filePath,String fileName){
        try{
            URL url = new URL(SrcPath);
            URLConnection conn = url.openConnection();
            //设置超时间为3秒
            conn.setConnectTimeout(3*1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            //输出流
            InputStream str = conn.getInputStream();
            //控制流的大小为1k
            byte[] bs = new byte[1024];
            //读取到的长度
            int len = 0;
            //是否需要创建文件夹
            File saveDir = new File(filePath);
            if(!saveDir.exists()){
                saveDir.mkdir();
            }
            File file = new File(saveDir+File.separator+fileName);   
            //实例输出一个对象
            FileOutputStream out = new FileOutputStream(file);
            //循环判断,如果读取的个数b为空了,则is.read()方法返回-1,具体请参考InputStream的read();
            while ((len = str.read(bs)) != -1) {
                //将对象写入到对应的文件中
                out.write(bs, 0, len);
            }
            //刷新流
            out.flush();
            //关闭流
            out.close();
            str.close();
            System.out.println("下载成功");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    //测试
    public static void main(String[] args) {
         //下载网页
    url是要下载的指定网页,filepath存放文件的目录如d:/resource/html/ ,filename指文件名如"下载的网页.html"
         downloadHtmlByNet(url,filepath,filename);
    }
}
HttpClient是Apache Jakarta Common 下的子项目。提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包
public static void downloadHtmlByNet(String SrcPath,String filePath,String fileName){
        DefaultHttpClient httpClient=new DefaultHttpClient();//初始化httpclient
        BasicHttpParams httpParams=new BasicHttpParams();//初始化参数
//模拟浏览器访问防止屏蔽程序抓取而返回403错误
user_agent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 user_agent="Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"
httpParams.setParameter("http.useragent", user_agent);
httpClient.setParams(httpParams);
try {
HttpGet httpGet=new HttpGet(SrcPath);
HttpContext httpContext=new BasicHttpContext();
HttpResponse httpResponse=httpClient.execute(httpGet,httpContext);
HttpEntity entity=httpResponse.getEntity();
if(entity!=null){
writeToFile(entity,filePath,fileName);//将entity内容输出到文件 }
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
httpClient.getConnectionManager().shutdown();
}
}
private static void writeToFile(HttpEntity entity, String filepath, String filename) {
        //输出流
        try{
        InputStream str = entity.getContent();
        //控制流的大小为1k
        byte[] bs = new byte[1024];
        //读取到的长度
        int len = 0;
        //是否需要创建文件夹
        File saveDir = new File(filePath);
        if(!saveDir.exists())
           {
            saveDir.mkdir();
           }
        File file = new File(saveDir+File.separator+fileName);
      //实例输出一个对象
        FileOutputStream out = new FileOutputStream(file);
        //循环判断,如果读取的个数b为空了,则is.read()方法返回-1,具体请参考InputStream的read();
        while ((len = str.read(bs)) != -1) {
            //将对象写入到对应的文件中
            out.write(bs, 0, len);
        }
        //刷新流
        out.flush();
        //关闭流
        out.close();
        str.close();
        System.out.println("下载成功");
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
唉,以前学过都忘差不多了,多学多记,下次使用post抓去有用数据。
java学习-GET方式抓取网页(UrlConnection和HttpClient)的更多相关文章
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
		
自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,e ...
 - Node.js的学习--使用cheerio抓取网页数据
		
打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据. 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据. 关键是抓取到网页 ...
 - HttpClient+Jsoup 抓取网页信息(网易贵金属为例)
		
废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...
 - Java 抓取网页中的内容【持续更新】
		
背景:前几天复习Java的时候看到URL类,当时就想写个小程序试试,迫于考试没有动手,今天写了下,感觉还不错 内容1. 抓取网页中的URL 知识点:Java URL+ 正则表达式 import jav ...
 - java抓取网页数据,登录之后抓取数据。
		
最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...
 - Java抓取网页数据(原网页+Javascript返回数据)
		
有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...
 - Java抓取网页数据(原来的页面+Javascript返回数据)
		
转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同 ...
 - 使用JAVA抓取网页数据
		
一.使用 HttpClient 抓取网页数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
 - Java广度优先爬虫示例(抓取复旦新闻信息)
		
一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发 ...
 
随机推荐
- (线段树  && 字符串的处理)codeforces -- 570C
			
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/J Description Daniel has a s ...
 - mysql insert 事务相关(草稿)
			
当 insert 多条语句时初步试了一下是自带事务机制的,如在一个这样的表中: 执行语句 INSERT INTO `t_mytest`(`id`) VALUES (1),(2),(3),(4),(5) ...
 - 西邮Linux兴趣小组2014级免试挑战题 (续)
			
在上一篇的博客中已经解到第四关了,现在继续挑战-- [ 第四关] 在上一关解压成功后,生成了一个file文件.用vim的二进制格式打开,转成十六进制,发现文件头格式如下: 是个以ELF字符开头的文件, ...
 - 删除map、list集合元素总结
			
@Testpublic void removeElementFromMap(){Map<Integer, String> test = new HashMap<Integer, St ...
 - 自适应XAML布局经验总结 (四)区域布局设计模式
			
本系列对实际项目中的XAML布局场景进行总结,给出了较优化的自适应布局解决方案,希望对大家有所帮助. 下面介绍区域布局设计模式. 7. 头尾模式 页面有时分为顶部栏,中间内容和底部栏三部分.这时可以使 ...
 - golang array, slice, string笔记
			
本来想写一篇关于golang io的笔记,但是在学习io之前必须了解array, slice, string概念,因此将在下篇写golang io. array: 数组的长度是该数组类型的一部分, ...
 - Backup--还原选项之STANDBY
			
很多DBA对还原时制定RECOVERY 与 NORECOVERY选项都很熟悉,但是对于STANDBY就有点茫然了,今天一起来学习下吧. --============================== ...
 - 浅析C# Dictionary实现原理
			
目录 一.前言 二.理论知识 1.Hash算法 2.Hash桶算法 3.解决冲突算法 三.Dictionary实现 1. Entry结构体 2. 其它关键私有变量 3. Dictionary - Ad ...
 - error while loading shared libraries: libudev.so.0 的问题
			
在linux下运行koala的时候遇到了问题: 应该是缺少文件libudev.so.0 在/lib和/lib64目录下也都没有这个文件.然后网上找解决方案,在/lib/x86_64-linux-gnu ...
 - 国际化SEO优化的最佳实践
			
作者:Kristopher Jones 翻译 :吴祺深 欢迎访问网易云社区,了解更多网易技术产品运营经验. 让我们来说一下hreflang属性.如果你还没有关掉这个页面,那么你已经完成了这个教程最重要 ...