Java实现-------网络蜘蛛
2015-05-31 20:20
459 查看
闲来无事,学习了一下网络蜘蛛的简易原理。是最简单的一种,一般新手都可以看得懂哦~~
读者可以将其进行扩展,可以实现用来抓取网页js或者css等等哦。。。
读者可以将其进行扩展,可以实现用来抓取网页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); } }
相关文章推荐
- Java实现-------网络蜘蛛
- [Python]网络爬虫(八):糗事百科的网络爬虫(v0.3)源码及解析(简化更新)
- 一个RCurl抓取美团网信息的实例
- tcpdump抓包
- Android应用开发:网络工具——Volley(二)
- Android应用开发:网络工具——Volley(一)
- Android 开发工具类 32_通过 HTTP 协议实现文件上传
- 禅之道——http://www.pythontip.com/coding/run(python online)
- 解读uglifyJS(转载:http://rapheal.sinaapp.com/2014/05/15/uglifyjs-ast-parse/)
- D-link 带USB口无线路由器 配置网络共享打印机
- VMware中网络设置之NAT
- android HTTPURLConnection解决不能访问HTTPs请求
- 网络数据请求实践二:多文件上传的实现方法
- No module named http_client
- 网络数据请求实践一:android-async-http实现下载和上传
- 独立成分分析http://blog.sina.com.cn/s/blog_73402e3c0101gqy0.html
- 学习笔记一:TCP与UDP通信协议
- TCP/IP 笔记 1.3 IP:网际协议
- 因子分析(Factor Analysis) http://www.cnblogs.com/jerrylead/archive/2011/05/11/2043317.html
- 混合高斯模型 http://www.cnblogs.com/CBDoctor/archive/2011/11/06/2236286.html