java获得采集网页内容的方法小结

      为了写一个java的采集程序,从网上学习到3种方法可以获取单个网页内容的方法,主要是运用到是java IO流方面的知识,对其不熟悉,因此写个小结。

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Get_Html {
    public static void main(String[] args) throws Exception    {
    	long start= System.currentTimeMillis();
        String str_url="http://www.hiphop8.com/city/guangdong/guangzhou.php";
        Pattern p = Pattern.compile(">(13\\d{5}|15\\d{5}|18\\d{5}|147\\d{4})<");

        //String html = get_Html_2(str_url);
        //String html = get_Html_1(str_url);
        String html = get_Html_3(str_url);
        Matcher m = p.matcher(html);

        int num = 0;
		while(m.find())
		{
			System.out.println("打印出的号码段落:"+m.group(1)+"  编号"+(++num));
		}
       System.out.println(num);
       long end = System.currentTimeMillis();
		System.out.println("花费的时间"+(end-start)+"毫秒");
    }
    public static String get_Html_2(String str_url) throws IOException{
    	URL url = new URL(str_url);
    	String content="";
		StringBuffer page = new StringBuffer();
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(url
                    .openStream(), "utf-8"));
			while((content = in.readLine()) != null){
				page.append(content);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return page.toString();
    }

    public static String get_Html_1(String str_url) throws IOException{
        URL url = new URL(str_url);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        InputStreamReader input = new InputStreamReader(conn.getInputStream(), "utf-8");
        BufferedReader bufReader = new BufferedReader(input);
        String line = "";
        StringBuilder contentBuf = new StringBuilder();
        while ((line = bufReader.readLine()) != null) {
            contentBuf.append(line);
        }
        return contentBuf.toString();
    }

    /**
     * 通过网站域名URL获取该网站的源码
     * @param url
     * @return String
     * @throws Exception
     */
    public static String get_Html_3(String str_url) throws Exception    {
    	URL url = new URL(str_url);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5 * 1000);                        //设置连接超时
        java.io.InputStream inStream = conn.getInputStream();  //通过输入流获取html二进制数据

        byte[] data = readInputStream(inStream);  //把二进制数据转化为byte字节数据
        String htmlSource = new String(data);
        return htmlSource;
    }

    /**
     * 把二进制流转化为byte字节数组
     * @param inStream
     * @return byte[]
     * @throws Exception
     */
    public static byte[] readInputStream(java.io.InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[]  buffer = new byte[1204];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1){
            outStream.write(buffer,0,len);
        }
        inStream.close();
        return outStream.toByteArray();
    }
}

【分别测试6次的结果】不知道是不是获取的网页数量内容较小,采集效率差不多,不过方法2应该是最好最简便的。

//get_Html_1  967  2658  1132  1199  988  1236

//get_Html_2  2323 2244 1202  1166  1081  1011

//get_Html_3  978  1219   1527   1133  1192  1774

 

1、关于url  .openStream()和conn.getInputStream()。

       二者返回的的都是InputStrema对象,且都是通过openConnection()方法获取URLConnection对象,然后调用getInputStream()方法,所以方法2和方法1是一样的,但前者更方便。

 

2、关于BufferedReader类。

【该类的功能】:能将  字符流  放入缓冲区(内存中的一块小区域),以便实现高效的读取。

【看构造方法】:

BufferedReader(Reader in)                   创建一个使用默认大小输入缓冲区来缓冲字符输入流。

BufferedReader(Reader in, int sz)          创建一个使用指定大小输入缓冲区的缓冲字符输入流。

【常用方法】:readLine()可以快速的实现文本字符的行读取。

 

3、关于InputStreamReader 类

InputStreamReader 是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流,它是Reader的子类。

而为了达到更高效率,我们经常用 BufferedReader 封装 InputStreamReader , 所以我们经常看到的用法是

BufferedReader Buf = new BufferedReader(new InputStreamReader(System.in);

 

这里的InputStreamReader类的功能是将字节流转换为字符流,所以以上语句实现了 :将 字节输入流 转换为 字符输入流 且放置缓冲区。

引用一张图:

 

4、关于 ByteArrayOutputStream类

       它是OutputStream类的扩展类,其构造函数是byteArrayInputStream(byte []buf),作用是把字节数组buf 变成输入流的形式,并通过toString()或者toByteArray()方法或得想要的数据形式。方法3中的readInputStream方法可改为返回String类型,将后面的outStream.toByteArray()改为outStream.toString()方法,这样又精简了代码。

 

5、 关于InputStream类

       InputStream与OutputStream: 是  8位字节 输入/输出流类的基类,主要用在处理二进制数据,它是按字节来处理的。文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,其余的字节流的处理类都是对该类的扩展,如等上面讲ByteArrayInputStream类

       由于InputStream.read()方法是每次从流里只读取读取一个字节,效率会非常低。而InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次可以读取多个字节,效率较高,所以方法3中创建了一个byte字节数组,以便一次性读取更多的字节。当read()方法读取内容为空的时候,返回-1.

      另外字符输入输出流的基类 Reader/Writer,且要知道1个字符= 2字节,字符都是在内存中生成的,一个中文占两个字节,其子类包含有上面讲的的InputStreamRead类与BufferReader类。

 

      写了几点总结,都是和java的IO流有关的,是不是应该改个标题,想想还是算了,毕竟采集程序中很重要的一部分就是IO流方面的,java在IO流方面提供了丰富的类库,边学边积累吧。

时间: 2024-10-14 05:01:12

java获得采集网页内容的方法小结的相关文章

阿里Java架构师打包 FatJar 方法小结

在函数计算(Aliyun FC)中发布一个 Java 函数,往往需要将函数打包成一个 all-in-one 的 zip 包或者 jar 包.Java 中这种打包 all-in-one 的技术常称之为 Fatjar 技术.本文小结一下 Java 里打包 FatJar 的若干种方法. 什么是 FatJar FatJar 又称作 uber-Jar,是包含所有依赖的 Jar 包.Jar 包中嵌入了除 java 虚拟机以外的所有依赖.我们知道 Java 的依赖分为两种, 零散的 .class 文件和把多个

Java 中 hashCode 和 equals 方法 小结

转载:http://www.oschina.net/question/82993_75533 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. hashcode主要是set集合使用,是用于判断对象是否”可能“相等的快捷办法,以解决大集合的问题.举例来说,如果一个一万个元素的集合加入一个元素,如果是一个新元素,那么必须要equal一万次才能加入.所以采用hashcode,hashcode的思路是如果equal,则ha

学习笔记4:java中Thread类的方法小结

稍稍对Thread类中的常用方法简单地做了一次总结,加深点印象. 仍然还是采用继承Thread类的案例来实现创建线程的方式 , 附代码段: /*  * @auto: 牧羊的伯格女皇  * 2015-10-16  * Thread的常用方法稍微总结:  * 1. start() 启动线程并执行相应的run()方法  * 2. run()  子线程要执行的代码放入run()方法中  * 3. currentThread() 静态的, 调取当前的线程,即返回对当前正在执行的线程对象的引用.  * 4.

(转)java判断string变量是否是数字的六种方法小结

java判断string变量是否是数字的六种方法小结 (2012-10-17 17:00:17) 转载▼ 标签: it 分类: 转发 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ System.out.println(str.charAt(i)); if (!Character.isDigit(str.charAt(i))){ return fal

java新手在实际开发中所遇到的问题及解决方法小结,(持续更新遇到的问题)

?从事开发一年有余,想到自己初入公司时的困窘,在此把我记忆中在实际开发中所遇到的问题做一总结性的小结,为自己以后方便查阅,以及后来者遇到相同问题时解决更加方便快捷,希望大家集思广益把自己遇到的问题及解决方法写出来,添砖加瓦.为后来者给予一点帮助! 实用案例 如何使用Java实现汉诺塔问题 Java中定时器的使用方法 Java打印杨辉三角的具体实现代码 Java中如何实现分页功能 Java读取大文件如何高效率 Java中生成随机数的几种方法 Java zip压缩单个文件实现方法 如何计算Java对

jsoup实现java抓取网页内容。

Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力.但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup . jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非

Java中static、final用法小结(转)

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

java ----获取路径的各种方法(总结)

Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同级目录:http://localhost:8080/test/articles/article1.jsp和http://localhost:8080/test/artic

Java返回类型泛型的用法小结

Java返回类型泛型的用法小结 版权声明:本文为博主原创文章,未经博主允许不得转载. 关于Java泛型的基本用法就不多说了,主要是一个编译期的检查,也避免了我们代码中的强制转换,比较经典的用法有泛型DAO,泛型Page的DTO. 现在我要说的是一个挺有趣但是貌似还不是太多的人在代码中使用的方法,前段时间用guava和op4j的时候发现这样的用法,看看了源码,也是很简单的. 比如guava中创建集合的方法 List<xx> list = Lists.newArrayList(),这个代替了我们传