欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

單線程蜘蛛查找死鏈接

系統(tǒng) 2178 0

截圖效果:

單線程蜘蛛查找死鏈接 ?

源程序分別有四個文件:
CheckLinks.java

package org.qyclass;
import java.awt.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
public class CheckLinks extends javax.swing.JFrame implements Runnable, ISpiderReportable {
public CheckLinks() {
//{{INIT_CONTROLS
setTitle("找到死鏈接");
getContentPane().setLayout(null);
setSize(405, 288);
setVisible(false);
label1.setText("輸入一個URL:");
getContentPane().add(label1);
label1.setBounds(12, 12, 84, 12);
begin.setText("Begin");
begin.setActionCommand("Begin");
getContentPane().add(begin);
begin.setBounds(12, 36, 84, 24);
getContentPane().add(url);
url.setBounds(108, 36, 288, 24);
errorScroll.setAutoscrolls(true);
errorScroll.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneC*****tants.HORIZONTAL_SCROLLBAR_ALWAYS);
errorScroll.setVerticalScrollBarPolicy(javax.swing.ScrollPaneC*****tants.VERTICAL_SCROLLBAR_ALWAYS);
errorScroll.setOpaque(true);
getContentPane().add(errorScroll);
errorScroll.setBounds(12, 120, 384, 156);
errors.setEditable(false);
errorScroll.getViewport().add(errors);
errors.setBounds(0, 0, 366, 138);
current.setText("當(dāng)前處理進度:");
getContentPane().add(current);
current.setBounds(12, 72, 384, 12);
goodLinksLabel.setText("正常鏈接:0");
getContentPane().add(goodLinksLabel);
goodLinksLabel.setBounds(12, 96, 192, 12);
badLinksLabel.setText("死鏈接:0");
getContentPane().add(badLinksLabel);
badLinksLabel.setBounds(216, 96, 96, 12);
//}}
//{{INIT_MENUS
//}}
//{{REGISTER_LISTENERS
SymAction lSymAction = new SymAction();
begin.addActionListener(lSymAction);
//}}
}
/**
*參數(shù)args未使用
*/
static public void main(String args[]) {
(new CheckLinks()).setVisible(true);
}
/**
*添加通知
*/
@Override
public void addNotify() {
//記錄窗口尺寸并調(diào)用父類的addNotify.
Dimension size = getSize();
super.addNotify();
if (frameSizeAdjusted) {
return;
}
frameSizeAdjusted = true;
//根據(jù)菜單欄等調(diào)整Frame尺寸
Insets insets = getInsets();
javax.swing.JMenuBar menuBar = getRootPane().getJMenuBar();
int menuBarHeight = 0;
if (menuBar != null) {
menuBarHeight = menuBar.getPreferredSize().height;
}
setSize(insets.left + insets.right + size.width, insets.top +
insets.bottom + size.height +
menuBarHeight);
}
boolean frameSizeAdjusted = false;
//{{
javax.swing.JLabel label1 = new javax.swing.JLabel();
javax.swing.JButton begin = new javax.swing.JButton();
javax.swing.JTextField url = new javax.swing.JTextField();
javax.swing.JScrollPane errorScroll = new javax.swing.JScrollPane();
/**
*存儲錯誤信息
*/
javax.swing.JTextArea errors = new javax.swing.JTextArea();
javax.swing.JLabel current = new javax.swing.JLabel();
javax.swing.JLabel goodLinksLabel = new javax.swing.JLabel();
javax.swing.JLabel badLinksLabel = new javax.swing.JLabel();
//}}
//{{
//
/**
*后臺蜘蛛線程
*/
protected Thread backgroundThread;
protected Spider spider;
protected URL base;
protected int badLinksCount = 0;
protected int goodLinksCount = 0;
/**
*用于分發(fā)事件的內(nèi)部類
*/
class SymAction implements java.awt.event.ActionListener {
public void actionPerformed(java.awt.event.ActionEvent event) {
Object object = event.getSource();
if (object == begin) {
begin_actionPerformed(event);
}
}
}
/**
*當(dāng)begin或cancel按鈕被點擊時調(diào)用
*
*參數(shù)event與按鈕相連
*/
void begin_actionPerformed(java.awt.event.ActionEvent event) {
if (backgroundThread == null) {
begin.setLabel("Cancel");
backgroundThread = new Thread(this);
backgroundThread.start();
goodLinksCount = 0;
badLinksCount = 0;
} else {
spider.cancel();
}
}
/**
*執(zhí)行后臺線程操作
*/
public void run() {
try {
errors.setText("");
spider = new Spider(this);
spider.clear();
base = new URL(url.getText());
spider.addURL(base);
spider.begin();
Runnable doLater = new Runnable() {
public void run() {
begin.setText("Begin");
}
};
SwingUtilities.invokeLater(doLater);
backgroundThread = null;
} catch (MalformedURLException e) {
UpdateErrors err = new UpdateErrors();
err.msg = "錯誤地址。";
SwingUtilities.invokeLater(err);
}
}
/**
*當(dāng)找到某一URL時由蜘蛛調(diào)用,在此驗證鏈接。
*
*參數(shù)base是找到鏈接時的頁面
*參數(shù)url是鏈接地址
*/
public boolean spiderFoundURL(URL base, URL url) {
UpdateCurrentStats cs = new UpdateCurrentStats();
cs.msg = url.toString();
SwingUtilities.invokeLater(cs);
if (!checkLink(url)) {
UpdateErrors err = new UpdateErrors();
err.msg = url + "(on page " + base + ")\n";
SwingUtilities.invokeLater(err);
badLinksCount++;
return false;
}
UpdateErrors err = new UpdateErrors();
err.msg = url.toString()+"\n";
SwingUtilities.invokeLater(err);
goodLinksCount++;
if (!url.getHost().equalsIgnoreCase(base.getHost())) {
return false;
} else {
return true;
}
}
/**
*當(dāng)發(fā)現(xiàn)URL錯誤時調(diào)用
*
*參數(shù)url是導(dǎo)致錯誤的URL
*/
public void spiderURLError(URL url) {
}
/**
*由內(nèi)部調(diào)用檢查鏈接是否有效
*
*參數(shù)url是被檢查的鏈接
*返回True表示鏈接正常有效
*/
protected boolean checkLink(URL url) {
try {
URLConnection connection = url.openConnection();
connection.connect();
return true;
} catch (IOException e) {
return false;
}
}
/**
*當(dāng)蜘蛛找到電子郵件地址時調(diào)用
*
*參數(shù)email為找到的電子郵件地址
*/
public void spiderFoundEMail(String email) {
}
/**
*以線程安全方式更新錯誤信息的內(nèi)部類
*/
class UpdateErrors implements Runnable {
public String msg;
public void run() {
errors.append(msg);
}
}
/**
*以線程安全方式更新當(dāng)前狀態(tài)信息
*/
class UpdateCurrentStats implements Runnable {
public String msg;
public void run() {
current.setText("當(dāng)前進度:" + msg);
goodLinksLabel.setText("正常鏈接:" + goodLinksCount);
badLinksLabel.setText("死鏈接:" + badLinksCount);
}
}
}


HTMLParse.java


/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package org.qyclass;

import javax.swing.text.html.*;

public class HTMLParse extends HTMLEditorKit {

public HTMLEditorKit.Parser getParser()

{

return super.getParser();

}

}
復(fù)制代碼
ISpiderReportable.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package org.qyclass;

import java.net.*;

interface ISpiderReportable {

public boolean spiderFoundURL(URL base,URL url);

public void spiderURLError(URL url);

public void spiderFoundEMail(String email);

}
復(fù)制代碼
Spider.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package org.qyclass;

import java.util.*;

import java.net.*;

import java.io.*;

import javax.swing.text.*;

import javax.swing.text.html.*;

?

public class Spider {

/**

?? *導(dǎo)致錯誤的URL集合

&

nbsp;? */

protected Collection workloadError = new ArrayList(3);

/**

?? *等待區(qū)URL集合

?? */

protected Collection workloadWaiting = new ArrayList(3);

/**

?? *處理過的URL集合

?? */

protected Collection workloadProcessed = new ArrayList(3);

protected ISpiderReportable report;

/**

?? *表明處理過程是否應(yīng)取消的標(biāo)志

?? */

protected boolean cancel = false;

/**

?? *構(gòu)造函數(shù)

?? *

?? *參數(shù)report為實現(xiàn)了ISpiderReportable接口的類

?? */

public Spider(ISpiderReportable report)

{

??? this.report = report;

}

/**

?? *獲取導(dǎo)致錯誤的URL

?? */

public Collection getWorkloadError()

{

??? return workloadError;

}

/**

?? *獲取在等待的URL

?? *應(yīng)添加至少一個URL到此集合以啟動蜘蛛

?? */

public Collection getWorkloadWaiting()

{

??? return workloadWaiting;

}

/**

?? *獲取被處理過的URL

?? */

public Collection getWorkloadProcessed()

{

??? return workloadProcessed;

}

/**

?? *清空所有

?? */

public void clear()

{

??? getWorkloadError().clear();

??? getWorkloadWaiting().clear();

??? getWorkloadProcessed().clear();

}

/**

?? *設(shè)置一標(biāo)志,使begin方法在完成之前返回

?? */

public void cancel()

{

??? cancel = true;

}

?

public void addURL(URL url)

{

??? if ( getWorkloadWaiting().contains(url) )

????? return;

??? if ( getWorkloadError().contains(url) )

????? return;

??? if ( getWorkloadProcessed().contains(url) )

????? return;

??? log("正添加到工作區(qū):" + url );

??? getWorkloadWaiting().add(url);

}

?

public void processURL(URL url)

{

??? try {

????? log("正在處理:" + url );

????? //獲取URL的內(nèi)容

????? URLConnection connection = url.openConnection();

????? if ( (connection.getContentType()!=null) &&

?????????? !connection.getContentType().toLowerCase().startsWith("text/") ) {

??????? getWorkloadWaiting().remove(url);

??????? getWorkloadProcessed().add(url);

??????? log("不會進行正理,因為類型為:" +

???????????? connection.getContentType() );

??????? return;

????? }

????? //讀取URL

????? InputStream is = connection.getInputStream();

????? Reader r = new InputStreamReader(is);

????? //解析URL

????? HTMLEditorKit.Parser parse = new HTMLParse().getParser();

????? parse.parse(r,new Parser(url),true);

??? } catch ( IOException e ) {

????? getWorkloadWaiting().remove(url);

????? getWorkloadError().add(url);

????? log("錯誤:" + url );

????? report.spiderURLError(url);

????? return;

??? }

??? //標(biāo)記此URL已完成

??? getWorkloadWaiting().remove(url);

??? getWorkloadProcessed().add(url);

??? log("已完成:" + url );

? }

?

public void begin()

{

??? cancel = false;

??? while ( !getWorkloadWaiting().isEmpty() && !cancel ) {

????? Object list[] = getWorkloadWaiting().toArray();

????? for ( int i=0;(i<list.length)&&!cancel;i++ )

??????? processURL((URL)list[i]);

??? }

}

/**

*HTML解析器回調(diào)函數(shù)

*/

protected class Parser

extends HTMLEditorKit.ParserCallback {

??? protected URL base;

??? public Parser(URL base)

??? {

????? this.base = base;

??? }

??? public void handleSimpleTag(HTML.Tag t,

??????????????????????????????? MutableAttributeSet a,int pos)

??? {

????? String href = (String)a.getAttribute(HTML.Attribute.HREF);

????? if( (href==null) && (t==HTML.Tag.FRAME) )

??????? href = (String)a.getAttribute(HTML.Attribute.SRC);

????? if ( href==null )

????????? return;

????? int i = href.indexOf("#");

????? if ( i!=-1 )

??????? href = href.substring(0,i);

????? if ( href.toLowerCase().startsWith("mailto:") ) {

??????? report.spiderFoundEMail(href);

????? return;

????? }

????? handleLink(base,href);

??? }

??? public void handleStartTag(HTML.Tag t,

?????????????????????????????? MutableAttributeSet a,int pos)

??? {

????? handleSimpleTag(t,a,pos);//以同樣的方式處理

??? }

??? protected void handleLink(URL base,String str)

??? {

????? try {

??????? URL url = new URL(base,str);

??????? if ( report.spiderFoundURL(base,url) )

????????? addURL(url);

????? } catch ( MalformedURLException e ) {

??????? log("找到畸形URL:" + str );

????? }

??? }

}

/**

?? *由內(nèi)部調(diào)用來記錄信息

?? *僅是把日志寫到標(biāo)準(zhǔn)輸出

?? *

?? *參數(shù)entry為寫到日志的信息

?? */

public void log(String entry)

{

??? System.out.println( (new Date()) + ":" + entry );

}

}
原帖地址: http://www.phpjava.org/thread-81-1-1.html

本文來自: PJDN--php&Java論壇|技術(shù)交流社區(qū),打造中國php&java開發(fā)者社區(qū)[www.phpjava.org]

單線程蜘蛛查找死鏈接


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品丝袜视频 | 久草中文在线观看 | 精品久久久中文字幕一区 | 亚洲欧美中文日韩二区一区 | 国产精品1区2区3区 另类视频综合 | 欧美日韩国产在线播放 | 久久久久高清 | 国产一区二区不卡 | 嗯啊你轻点好深啊hh在线播放 | 日韩在线免费观看视频 | 亚洲成人中文 | 夜夜操狠狠操 | 亚洲精品美女久久久 | 久青青| 国产萝控精品福利视频免费观看 | 99久久久久久 | 91免费看 | 99草在线| 久久精品国产视频 | 2019中文字幕在线视频 | 婷婷玖玖| 日韩另类| 一级一片免费看 | 久热中文字幕在线精品首页 | 久久亚| 国产噜噜噜精品免费 | 日韩欧美一区二区三区视频 | 日本久久久久久久 | 日日操夜夜 | 久久精品视频免费 | 精品免费国产一区二区三区四区介绍 | 欧美一区二区免费电影 | 天天色综合影视 | 天天操天天摸天天爽 | 精品热99 | 奇米影音先锋 | 超碰在线97国产 | 成年人免费看 | 精品国产91 | 国产精品久久久久秋霞影视 | 九九九九九九精品任你躁 |