http://playfish.iteye.com/blog/150126
这是一个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.*;
-
-
-
public class SearchCrawler implements Runnable{
-
-
-
-
-
-
-
-
-
-
-
-
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;
-
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);
- }
-
-
-
-
private URL verifyUrl(String url) {
-
-
if (!url.toLowerCase().startsWith("http://"))
-
return null;
-
-
URL verifiedUrl = null;
-
try {
-
verifiedUrl = new URL(url);
-
} catch (Exception e) {
-
return null;
- }
-
-
return verifiedUrl;
- }
-
-
-
private boolean isRobotAllowed(URL urlToCheck) {
-
String host = urlToCheck.getHost().toLowerCase();
-
-
-
- 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()));
-
-
- String line;
-
while ((line = reader.readLine()) != null) {
-
if (line.indexOf("Disallow:") == 0) {
-
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;
- }
- }
-
-
- String file = urlToCheck.getFile();
-
-
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 {
-
- BufferedReader reader =
-
new BufferedReader(new InputStreamReader(pageUrl.openStream()));
-
-
- String line;
-
StringBuffer pageBuffer = new StringBuffer();
-
while ((line = reader.readLine()) != null) {
- pageBuffer.append(line);
- }
-
-
return pageBuffer.toString();
-
} catch (Exception e) {
- }
-
-
return null;
- }
-
-
-
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;
- }
-
-
-
if (limitHost &&
- !pageUrl.getHost().toLowerCase().equals(
- verifiedLink.getHost().toLowerCase()))
- {
-
continue;
- }
-
-
-
if (crawledList.contains(link)) {
-
continue;
- }
-
- linkList.add(link);
- }
-
-
return (linkList);
- }
-
-
-
-
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;
- }
-
-
-
- startUrl = removeWwwFromUrl(startUrl);
-
-
- toCrawlList.add(startUrl);
-
while (toCrawlList.size() > 0) {
-
-
if (maxUrls != -1) {
-
if (crawledList.size() == maxUrls) {
-
break;
- }
- }
-
-
- String url = toCrawlList.iterator().next();
-
-
- toCrawlList.remove(url);
-
-
- URL verifiedUrl = verifyUrl(url);
-
-
-
if (!isRobotAllowed(verifiedUrl)) {
-
continue;
- }
-
-
-
- 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();
-
- }
- }
分享到:
相关推荐
总结来说,“ASP搜索引擎蜘蛛爬行日志生成程序”是ASP网站管理者的有力工具,它提供了一种途径来洞察搜索引擎如何看待和处理网站内容,进而提升网站的搜索引擎优化效果。通过细致的分析和持续的优化,网站可以实现更...
标题中的"C#仿搜索引擎爬行演示程序源码.RAR"是一个使用C#编程语言开发的项目,其目标是模仿搜索引擎的工作原理,实现对网站的爬行、数据抓取以及快照存储的功能。这个源码可以帮助开发者理解搜索引擎爬虫的实现过程...
"WEB漏洞爬行虫"很可能是一款集成了上述功能的工具,它可以自动搜索网站的SQL注入、XSS、CSRF等常见漏洞。使用此类工具时,需注意合法性和道德性,尊重网站的robots.txt文件,避免非法入侵和滥用。 总之,Web漏洞...
优盘爬行者搜索关键字并比较得分安装先决条件Java 8 玛文Tomcat 8.X IntelliJ Ultimate(首选)Primefaces的安装步骤搭建神器mvn安装MVN测试与tomcat和神器之战一起运行码头工人我们使用Docker简化开发。 运行docker...
Bing提供的是必应Web搜索API,可以通过调用HTTP接口来获取搜索结果。而百度则有百度开放搜索API,同样通过HTTP请求获取数据。但要注意,直接大量爬取可能违反服务条款,所以一般会设置合适的延迟和请求限制。 ...
【标题】:“Crowler:爬行者比爬行者更酷” 在IT行业中,"Crowler"这个名字似乎是对网络爬虫(通常拼写为“Crawler”)的一种独特诠释,暗示着它可能是一个专为JavaScript环境设计的高级爬虫工具。网络爬虫是一种...
"lolgirl:爬行者搜索大声笑的女孩"这个项目标题暗示我们,它可能是一个利用JavaScript实现的网络爬虫,目标是抓取互联网上与“大声笑的女孩”相关的内容,可能是图片、视频或者文章等。 首先,我们需要理解什么是...
在提供的代码中,`get_naps_bot()` 函数用于检测用户代理(User-Agent)字符串,从而判断访问者是否为搜索引擎的爬虫。这个函数检查了Googlebot、Baiduspider、msnbot、slurp、sosospider、sogou spider 和 yodaobot...
IIS(Internet Information Services)是微软提供的一个强大的Web服务器,用于托管网站和应用程序。IIS日志记录了服务器上所有HTTP交互的详细信息,对于网站管理员来说,这些日志是评估网站性能、诊断问题和理解用户...
Paco Hope,是Cigital公司的一名技术经理,《Mastering FreeBsD and 0penBsDsecurity》 (由O’Reilly出版)的合著者之一。他也发表过有关误用、滥用案例和PKI的文章。他曾被邀请到会议就软件安全需求、Web应用...
综合以上,此压缩包提供了一个基于ASP的网站蜘蛛爬行统计系统源码,对于学习ASP编程、了解搜索引擎爬虫行为以及网站优化的实践者来说,这是一个宝贵的资源。通过分析和修改源码,用户可以深入理解如何构建这样的系统...
为了验证E-FFC的有效性,研究者们在一系列代表性的领域中对真实Web页面进行了实验。实验结果表明,与现有的特定领域深层网络聚焦表单爬虫相比,E-FFC在收获率、覆盖率以及爬行稳健性方面表现更为出色。 #### 结论与...
10. SEO优化:对于一个公开的Web应用,考虑搜索引擎优化(SEO)也是必要的,这涉及到合适的元标签、可爬行的链接结构和优化的页面速度。 综上所述,"web前端校园兼职项目:兼职宝"是一个全面锻炼前端开发技能的实践...
随着World Wide Web的兴起,这类工具逐渐演变为能够索引和检索网页的搜索引擎。"蜘蛛"这一术语源于它们在网络中爬行的特性,就像蜘蛛在蜘蛛网上移动一样,它们沿着网页之间的链接不断探索。 网络蜘蛛的工作流程通常...
【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或...
搜索引擎优化行业术语大全(六) 本篇文章是搜索引擎优化行业术语大全的第六篇,涵盖了从T到X的搜索引擎...本篇文章涵盖了搜索引擎优化领域的多个重要术语,对于搜索引擎优化从业者和网站编辑者具有重要的参考价值。