- 浏览: 390242 次
- 性别:
- 来自: 长春
文章分类
最新评论
-
milkyTea_:
...
学习:二维码、QR码、J4L-QRCode、java -
xunke515:
请问如何更换其他用户,注销了从新登录的时候选择么?
Hadoop启动时出现Unrecognized option: -jvm 和 Could not create the Java virtual machine -
_copythat:
学习:二维码、QR码、J4L-QRCode、java -
小fi(FD):
楼主,你好,关于你发表的《基于动态表单的Java不确定字段数报 ...
基于动态表单的Java不确定字段数报表项目实现 -
rmn190:
受用了。多谢分享!
SD2见闻--参加PPT制作秘笈沙龙
这是一个web搜索的基本程序,从命令行输入搜索条件(起始的URL、处理url的最大数、要搜索的字符串), 它就会逐个对Internet上的URL进行实时搜索,查找并输出匹配搜索条件的页面。 这个程序的原型来自《java编程艺术》, 为了更好的分析,站长去掉了其中的GUI部分,并稍作修改以适用jdk1.5。以这个程序为基础,可以写出在互联网上搜索 诸如图像、邮件、网页下载之类的“爬虫”。 先请看程序运行的过程: D:\java>javac SearchCrawler.java(编译) D:\java>java SearchCrawler http://127.0.0.1:8080/zz3zcwbwebhome/index.jsp 20 java Start searching... result: searchString=java http://127.0.0.1:8080/zz3zcwbwebhome/index.jsp http://127.0.0.1:8080/zz3zcwbwebhome/reply.jsp http://127.0.0.1:8080/zz3zcwbwebhome/learn.jsp http://127.0.0.1:8080/zz3zcwbwebhome/download.jsp http://127.0.0.1:8080/zz3zcwbwebhome/article.jsp http://127.0.0.1:8080/zz3zcwbwebhome/myexample/jlGUIOverview.htm http://127.0.0.1:8080/zz3zcwbwebhome/myexample/Proxooldoc/index.html http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=301 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=297 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=291 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=286 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=285 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=284 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=276 http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=272 又如: D:\java>java SearchCrawler http://www.sina.com 20 java Start searching... result: searchString=java http://sina.com http://redirect.sina.com/WWW/sinaCN/www.sina.com.cn class=a2 http://redirect.sina.com/WWW/sinaCN/www.sina.com.cn class=a8 http://redirect.sina.com/WWW/sinaHK/www.sina.com.hk class=a2 http://redirect.sina.com/WWW/sinaTW/www.sina.com.tw class=a8 http://redirect.sina.com/WWW/sinaUS/home.sina.com class=a8 http://redirect.sina.com/WWW/smsCN/sms.sina.com.cn/ class=a2 http://redirect.sina.com/WWW/smsCN/sms.sina.com.cn/ class=a3 http://redirect.sina.com/WWW/sinaNet/www.sina.net/ class=a3 D:\java> 下面是这个程序的源码 import java.util.*; import java.net.*; import java.io.*; import java.util.regex.*; // 搜索Web爬行者 public class SearchCrawler implements Runnable{ /* disallowListCache缓存robot不允许搜索的URL。 Robot协议在Web站点的根目录下设置一个robots.txt文件, *规定站点上的哪些页面是限制搜索的。 搜索程序应该在搜索过程中跳过这些区域,下面是robots.txt的一个例子: # robots.txt for http://somehost.com/ User-agent: * Disallow: /cgi-bin/ Disallow: /registration # /Disallow robots on registration page Disallow: /login */ private HashMap< String,ArrayList< String>> disallowListCache = new HashMap< String,ArrayList< String>>(); ArrayList< String> errorList= new ArrayList< String>();//错误信息 ArrayList< String> result=new ArrayList< String>(); //搜索到的结果 String startUrl;//开始搜索的起点 int maxUrl;//最大处理的url数 String searchString;//要搜索的字符串(英文) boolean caseSensitive=false;//是否区分大小写 boolean limitHost=false;//是否在限制的主机内搜索 public SearchCrawler(String startUrl,int maxUrl,String searchString){ this.startUrl=startUrl; this.maxUrl=maxUrl; this.searchString=searchString; } public ArrayList< String> getResult(){ return result; } public void run(){//启动搜索线程 crawl(startUrl,maxUrl, searchString,limitHost,caseSensitive); } //检测URL格式 private URL verifyUrl(String url) { // 只处理HTTP URLs. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = new URL(url); } catch (Exception e) { return null; } return verifiedUrl; } // 检测robot是否允许访问给出的URL. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase();//获取给出RUL的主机 //System.out.println("主机="+host); // 获取主机不允许搜索的URL缓存 ArrayList< String> disallowList =disallowListCache.get(host); // 如果还没有缓存,下载并缓存。 if (disallowList == null) { disallowList = new ArrayList< String>(); try { URL robotsFileUrl =new URL("http://" + host + "/robots.txt"); BufferedReader reader =new BufferedReader(new InputStreamReader(robotsFileUrl.openStream())); // 读robot文件,创建不允许访问的路径列表。 String line; while ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {//是否包含"Disallow:" String disallowPath =line.substring("Disallow:".length());//获取不允许访问路径 // 检查是否有注释。 int commentIndex = disallowPath.indexOf("#"); if (commentIndex != - 1) { disallowPath =disallowPath.substring(0, commentIndex);//去掉注释 } disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } } // 缓存此主机不允许访问的路径。 disallowListCache.put(host, disallowList); } catch (Exception e) { return true; //web站点根目录下没有robots.txt文件,返回真 } } String file = urlToCheck.getFile(); //System.out.println("文件getFile()="+file); for (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { return false; } } return true; } private String downloadPage(URL pageUrl) { try { // Open connection to URL for reading. BufferedReader reader = new BufferedReader(new InputStreamReader(pageUrl.openStream())); // Read page into buffer. String line; StringBuffer pageBuffer = new StringBuffer(); while ((line = reader.readLine()) != null) { pageBuffer.append(line); } return pageBuffer.toString(); } catch (Exception e) { } return null; } // 从URL中去掉"www" private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); } return (url); } // 解析页面并找出链接 private ArrayList< String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { // 用正则表达式编译链接的匹配模式。 Pattern p =Pattern.compile("< a\\s+href\\s*=\\s*\"?(.*?)[\"|>]",Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents); ArrayList< String> linkList = new ArrayList< String>(); while (m.find()) { String link = m.group(1).trim(); if (link.length() < 1) { continue; } // 跳过链到本页面内链接。 if (link.charAt(0) == '#') { continue; } if (link.indexOf("mailto:") != -1) { continue; } if (link.toLowerCase().indexOf("javascript") != -1) { continue; } if (link.indexOf("://") == -1){ if (link.charAt(0) == '/') {//处理绝对地 link = "http://" + pageUrl.getHost()+":"+pageUrl.getPort()+ link; } else { String file = pageUrl.getFile(); if (file.indexOf('/') == -1) {//处理相对地址 link = "http://" + pageUrl.getHost()+":"+pageUrl.getPort() + "/" + link; } else { String path =file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() +":"+pageUrl.getPort()+ path + link; } } } int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); } link = removeWwwFromUrl(link); URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { continue; } /* 如果限定主机,排除那些不合条件的URL*/ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { continue; } // 跳过那些已经处理的链接. if (crawledList.contains(link)) { continue; } linkList.add(link); } return (linkList); } // 搜索下载Web页面的内容,判断在该页面内有没有指定的搜索字符串 private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive){ String searchContents = pageContents; if (!caseSensitive) {//如果不区分大小写 searchContents = pageContents.toLowerCase(); } Pattern p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); for (int i = 0; i < terms.length; i++) { if (caseSensitive) { if (searchContents.indexOf(terms[i]) == -1) { return false; } } else { if (searchContents.indexOf(terms[i].toLowerCase()) == -1) { return false; } } } return true; } //执行实际的搜索操作 public ArrayList< String> crawl(String startUrl, int maxUrls, String searchString,boolean limithost,boolean caseSensitive ) { System.out.println("searchString="+searchString); HashSet< String> crawledList = new HashSet< String>(); LinkedHashSet< String> toCrawlList = new LinkedHashSet< String>(); if (maxUrls < 1) { errorList.add("Invalid Max URLs value."); System.out.println("Invalid Max URLs value."); } if (searchString.length() < 1) { errorList.add("Missing Search String."); System.out.println("Missing search String"); } if (errorList.size() > 0) { System.out.println("err!!!"); return errorList; } // 从开始URL中移出www startUrl = removeWwwFromUrl(startUrl); toCrawlList.add(startUrl); while (toCrawlList.size() > 0) { if (maxUrls != -1) { if (crawledList.size() == maxUrls) { break; } } // Get URL at bottom of the list. String url = toCrawlList.iterator().next(); // Remove URL from the to crawl list. toCrawlList.remove(url); // Convert string url to URL object. URL verifiedUrl = verifyUrl(url); // Skip URL if robots are not allowed to access it. if (!isRobotAllowed(verifiedUrl)) { continue; } // 增加已处理的URL到crawledList crawledList.add(url); String pageContents = downloadPage(verifiedUrl); if (pageContents != null && pageContents.length() > 0){ // 从页面中获取有效的链接 ArrayList< String> links =retrieveLinks(verifiedUrl, pageContents, crawledList,limitHost); toCrawlList.addAll(links); if (searchStringMatches(pageContents, searchString,caseSensitive)) { result.add(url); System.out.println(url); } } } return result; } // 主函数 public static void main(String[] args) { if(args.length!=3){ System.out.println("Usage:java SearchCrawler startUrl maxUrl searchString"); return; } int max=Integer.parseInt(args[1]); SearchCrawler crawler = new SearchCrawler(args[0],max,args[2]); Thread search=new Thread(crawler); System.out.println("Start searching..."); System.out.println("result:"); search.start(); } }
发表评论
-
如何让cxf客户端简单支持ssl
2012-06-26 22:52 976首先生成自我签名的证书,关于如何使用keytool生成证 ... -
webservice cxf 开发实战
2012-05-30 15:51 750webservice cxf 开发实战,请看附件(含源码)。 -
JMeter 使用入门
2011-10-22 14:31 836JMeter 使用入门 <!-- google ... -
Java知识拾遗:三大框架的技术起源
2011-08-02 07:06 782Struts、Hibernate和Spring是我们Ja ... -
分享高效java开发者必备的资源列表
2011-07-14 00:01 694一. Java相关工具资源 1. Eclipse 开 ... -
Office等类型文件的在线编辑
2011-05-10 23:04 128715.4 Office等类型文件的在线编辑自从WebDA ... -
学习:二维码、QR码、J4L-QRCode、java
2011-04-15 18:52 33700开源码 Java 解码器(编码解码)下载:http://s ... -
使用 jsoup 对 HTML 文档进行解析和操作
2011-04-04 21:59 504jsoup 简介 Java 程序在解析 HTML 文档时 ... -
Java通过jsoup实现网页天气数据解析
2011-04-03 10:04 1426import java.io.IOException; ... -
免费的office开发控件weboffice
2011-02-11 14:32 1540免费的office开发控件weboffice,有Java版本的 ... -
Java程序把Word文档直接转换成HTML文件
2011-02-09 09:57 1124Jacob是Java和Windows下的Com桥,通过它我们可 ... -
Tomcat总死可以试一试调一下catalina.bat的这一行
2011-01-12 08:12 847set DEBUG_OPTS=-Xms512m -Xmx102 ... -
Tomcat内存溢出的原因以及解决办法
2010-12-29 13:57 875Tomcat内存溢出的原因 在生产环境中tomcat内存设置 ... -
PHP+MYSQL的OA为何没有Java的值钱
2010-12-25 11:33 840现在市场上的oa基本上可归结为两大阵营,即php阵营和java ... -
MyEclipse 6.0.1配置Tomcat 6服务器【图解】
2010-09-03 14:48 16931 从菜单[Windows]选择[Preferences. ... -
java 查询可用域名
2010-07-20 09:48 1430这段时间在注册域名,咱起步晚,好用的域名都给别人注册了。 想 ... -
使用RSA算法进行加密和解密
2010-07-20 09:36 1673用RSA算法进行加密和解密 一、 生成公钥和私钥 ... -
用javascript与java进行RSA加密与解密
2010-07-19 08:47 977这几天一直做安全登录,网上查了好多资料,不尽如意。 ... -
公钥加密私钥解密&私钥加密公钥解密
2010-07-16 16:20 1546公钥加密体制1、公钥加密体制用于保密性时,就是公钥加密,私钥解 ... -
Java生成RSA非对称型加密的公钥和私钥(利用java API)
2010-07-16 14:10 1512非对称型加密非常适合多个客户端和服务器之间的秘密通讯,客户端使 ...
相关推荐
目标:采用Socket和多线程技术,实现一个java Web服务器,加深对HTTP的认识。 新建java项目 webServer 新建java文件 WebServer.java Processor.java 一、HTTP协议的作用原理 WWW是以Internet作为...
一个很好的方法来获得数百万的Google Play商店客户。无需编码,无需更多插件。它只是工作。 完整的Android应用程序模板-无需编码!#nocode 24/7人工实时聊天支持和AI可搜索文档 适用于在Chrome浏览器上运行的任何Web...
java 一个消息发布网站.rar Java 数字签名、数字证书生成源码.rar Java 版的酒店系统,貌似完整.rar Java 电梯模拟程序 v2.0.rar Java 组播组中发送和接受数据实例 Java 飞机订票.rar Java 高考信息管理系统 SQL...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
总之,UrlRewriter Java v2.0 RC1是一个功能强大、易于使用的URL重写过滤器,可以帮助开发人员优化Java Web应用程序的URL结构,提高用户体验和搜索引擎优化效果。对于需要实现URL友好化和优化的Java Web应用程序项目...
每个项目都从软件工程的角度出发,从开发背景、需求分析、系统功能分析、数据库分析、数据库结构、系统开发到系统的编译发行,每一过程都进行了详细的讲解。 环境搭建篇包括JDK的下载与安装、Eclipse的下载与使用、...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情。建立搜索引擎就是解决这个...本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人、索引引擎、Web服务器三个方面进行详细的说明
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
爬虫搜索,简单的搜索引擎,java爬虫,搜索引擎例子,爬虫demo,java实现互联网内容抓取,搜索引擎大揭密.java爬虫程序。web搜索。爬虫程序。sigar搜索,定时搜索互联网内容信息。
这是一个全栈Java Web应用程序。 与所有论坛一样,您可以在Java论坛中搜索,回复或发布主题。 并且,如果您以管理员身份登录,则还可以修改或删除该帖子。 我使用JSP,HTML和JavaScript在前端显示Web,并使用Java,...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
系统WEB合并 platform-gen 代码生成 platform-schedule 定时任务 platform-shiro 登陆权限相关 platform-shop 商城后台管理 wx-mall 微信小程序商城 实现功能 一:会员管理 会员管理 ...
零安装:用户只需通过微信扫一扫或搜索功能,即可打开和使用小程序,大大降低了用户的使用门槛和手机存储空间压力。 速度快:加载速度相较于传统的HTML5网页更快,依托于微信强大的基础设施,能够实现近乎原生应用...
这是一个web搜索的基本程序,从命令行输入搜索条件(起始的URL、处理url的最大数、要搜索的字符串), 它就会逐个对Internet上的URL进行实时搜索,查找并输出匹配搜索条件的页面。 这个程序的原型来自《java编程艺术》...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
Java Web 程序设计教程 300 页 </div> </div> </div> <jsp:include page="foot.jsp"></jsp:include> </body> </html> 14.5 图书查询 在 head.jsp 页面中,不只有登录、注销和注册功能,在它们的下面,还有图书查询...