Java实现 - 网络蜘蛛

  闲来无事,学习了一下网络蜘蛛的简易原理。是最简单的一种,一般新手都可以看得懂哦

  读者可以将其进行扩展,可以实现用来抓取网页js或者css等网络资源,后续可以通过自定义解析获取想要的资源。

 

package com.insist.entity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 网络蜘蛛类
 * @author SNOOPY
 */
public class Spider {
    /**
     * 
     * @param srcLink  要获取网页源码的路径
     * @param encoding    编码格式
     * @return
     */
    public static String getPageHtmlSource(String srcLink){
        //List<String> list = new ArrayList<String>();
        InputStream inputStream = null;
        InputStreamReader inputStreamReader =null;
        BufferedReader bufferedReader = null;
        StringBuilder strBuilder = null;
        String htmlcode = null;
        try {
            //1、建立与网页服务器连接
            URL url = new URL(srcLink);
            URLConnection urlconnection =url.openConnection();//打开链接
            //urlconnection.setRequestProperty("User-Agent", "java");
            
            String encoding = getHtmlEncoding(srcLink,url);
System.out.println("encoding====="+encoding);            
            //2、通过该连接,读取数据(获取输入流)
            inputStream = urlconnection.getInputStream();//得到字节输入流
            inputStreamReader = new InputStreamReader(inputStream,encoding);//转为字符流
            
            bufferedReader = new BufferedReader(inputStreamReader);//构建缓冲输入流
            strBuilder = new StringBuilder();//非线程安全,多线程同时访问时会有问题    但效率高  StringBuffer 线程安全

            String line = null;//存储一行数据
            while((line=bufferedReader.readLine())!=null){
                strBuilder.append(line+"\r\n");//回车换行区别 回车: 回到同一行的起始位置,换行:换到下一行
            }
            htmlcode = strBuilder.toString();
            
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return htmlcode;
    }
    public static String getHtmlEncoding(String url,URL Url){
        /**
         * 根据头部获取encoding
         */
        String encoding = null;
        try {
            HttpURLConnection huc = (HttpURLConnection)Url.openConnection();
            huc.connect();
            Map<String,List<String>> map = huc.getHeaderFields();
            Set<String> keys = map.keySet();
            Iterator<String> it = keys.iterator();
            String key = null;  
            String tmp = null;  
            while (it.hasNext()) {  
                key = it.next();  
                tmp = map.get(key).toString().toLowerCase();  
                // 获取content-type charset  
                if (key != null && key.equals("Content-Type")) {
                    int m = tmp.indexOf("charset=");//返回指定子字符串在此字符串中第一次出现处的索引。
                    if (m != -1) {  
                        encoding = tmp.substring(m + 8).replace("]", "");  
                        return encoding;  
                    }  
                }  
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return encoding;
    }
    public static void main(String[] args) {
        /**
         * 测试方法
         * 最好用浏览器进行测试,控制台测试也可以,但是可能因为网页字符集和控制台字符集不匹配造成不能显示汉子
         */
        String srcURL ="http://www.qq.com";
        String html = getPageHtmlSource(srcURL);
        System.out.println(html);
    }
}

 


 

posted @ 2015-05-31 20:20  宫商角徵羽  阅读(255)  评论(0编辑  收藏  举报