?? parser.java
字號(hào):
/*
* *****************************************************
* Copyright (c) 2005 IIM Lab. All Rights Reserved.
* Created by xuehao at 2005-10-12
* Contact: zxuehao@mail.ustc.edu.cn
* *****************************************************
*/
package org.indigo.parser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.NameValuePair;
import org.indigo.util.MainConfig;
/**
* 解析通過URL指定的頁面類。
* @author wbz
*
*/
public class Parser
{
private URL itsUrl=null;
private HttpURLConnection itsConn = null;
// private NavigateController itsNav=null;
private String itsEncoding=null;
private final String DEFAULT_ENCODING = "gb2312";
private String itsPageStr=null;
private boolean IsByPost=false;
private NameValuePair data[]=null;
private String itsFormUrl=null;
private boolean IsByLogin=false;
private String itsOtherUrl=null;
public Parser()
{
}
/**
* 此方法通過指定開始和結(jié)束標(biāo)記來獲取有用的信息,這樣可以去掉一些不需要信息的干擾。
* add by wbz for getting a userful infomation body from a homepage;
* setItsPageStr
* @param startStr
* @param endStr
*/
public void setItsPageStr(String startStr, String endStr)
{
itsPageStr=parseWith(startStr, endStr);
}
/**
* 設(shè)置是否需要登錄的參數(shù)。
* @param IsByLogin
*/
public void setIsByLogin(boolean IsByLogin)
{
this.IsByLogin=IsByLogin;
}
/**
* 設(shè)置在提交表單時(shí),需要的參數(shù)。
* @param data
*/
public void setJSValuePairs(NameValuePair data[])
{
this.data=data;
}
/**
* 根據(jù)指定的開始標(biāo)記和結(jié)束標(biāo)記,獲取開始和結(jié)束標(biāo)記中間的內(nèi)容。
* @param startStr 開始標(biāo)記
* @param endStr 結(jié)束標(biāo)記
* @return
*/
public String parseWith(String startStr, String endStr)
{
// System.out.println( itsUrl );
startStr = startStr.trim();
endStr = endStr.trim();
String midStr=null;
int i;
if( itsPageStr==null )
return null;
i = itsPageStr.indexOf( startStr );
if( i==-1 )
return null;
itsPageStr = itsPageStr.substring( i+startStr.length() );
i = itsPageStr.indexOf( endStr );
if( i==-1 )
midStr = itsPageStr.substring( 0, i );
return midStr;
}
/**
* 當(dāng)采集規(guī)則中用到正則表達(dá)式時(shí),需要調(diào)用此方法。
* 此方法中的前后標(biāo)識(shí)是用正則表達(dá)式表示的。
* @param startRex 含有正則表達(dá)式的前標(biāo)識(shí)。
* @param endRex 含有正則表達(dá)式的后標(biāo)識(shí)。
* @return
*/
public String parserWithRegex(String startRex,String endRex)
{
Pattern spattern = Pattern.compile(startRex);//("<td align=\"center\" bgcolor=\"[0-9a-fA-F]{6}\">");//\\s*.*([\u4e00-\u9fa5]+)</td>");
Pattern bpattern=Pattern.compile(endRex);
Matcher m=spattern.matcher(itsPageStr);
int s=-1;
String midStr=null;
if(m.find())
{
// System.out.println(m.group());
s=m.start()+m.group().length();
itsPageStr=itsPageStr.substring(s);
m=bpattern.matcher(itsPageStr);
if(m.find())
{
midStr=itsPageStr.substring(0, m.start());//m.group(1);
itsPageStr=itsPageStr.substring(midStr.length()+m.group().length());
}
// System.out.println(midStr);
}
return midStr;
}
/**
* 設(shè)置在通過提交表單的形式訪問頁面時(shí)需要指定的處理頁面的URL。
* @param url
*/
public void setFromUrl(String url)
{
//setUrl(url);
itsFormUrl=url;
}
/**
* 設(shè)置需要采集的URL。
* @param url
*/
public void setUrl(String url)
{
if(IsByPost)//通過提交的形式訪問頁面時(shí)。
{
url=url.replaceAll(" ", "");
itsFormUrl=url;
return;
}else if(IsByLogin)//通過登錄的方式訪問頁面時(shí)。
{
url=url.replace(" ", "");
itsOtherUrl=url;
return;
}
url=url.replaceAll(" ", "");
itsUrl = null;
/**
* 和指定的URL建立連接。
*/
try
{
itsUrl = new URL( url );
itsConn = (HttpURLConnection)itsUrl.openConnection();
// System.out.println( "Parser with: " + url );
} catch (MalformedURLException e)
{
e.printStackTrace();
}catch (IOException e1)
{
e1.printStackTrace();
}
return;
}
/**
* 打開指定URL的連接。
* @return
*/
public boolean open()
{
if(IsByPost)//當(dāng)通過提交的方式訪問URL時(shí),通過此代碼段獲取源文件。
{
itsPageStr=Login.getHtmlByPost(itsFormUrl,data);
}
else if(IsByLogin)//當(dāng)通過登錄的方式訪問URL時(shí),通過此代碼段獲取源文件。
{
itsPageStr=Login.getHtmlByLogin(itsFormUrl, data, itsOtherUrl);
}
else//一般情況下,通過下面的代碼段獲取源文件。
itsPageStr = parseAll();
if( itsPageStr==null )
return false;
return true;
}
/**
* 使獲取的源文件置null
*
*/
public void close()
{
itsPageStr = null;
}
/**
* 設(shè)置是否通過提交獲取頁面。
* @param IsByPost
*/
public void setIsByPost(boolean IsByPost)
{
this.IsByPost=IsByPost;
}
public String OtherParserAll(String classname)
{
return null;
}
/**
* 在一般的情況下,獲取指定頁面的源代碼。
* @return
*/
public String parseAll()
{
if( itsUrl==null || itsConn==null )
return null;
int retryCount=1;
//當(dāng)指定頁面訪問無法連接時(shí),需要再次嘗試,此參數(shù)是指定重新嘗試次數(shù)。
String retryStr = MainConfig.getInstance().getProperty("RetryCount");
if( retryStr==null || retryStr.equals("") )
{
retryCount = 1;
}else
retryCount = Integer.parseInt( retryStr );
int m = retryCount;
BufferedReader rd = null;
boolean retryFlag = false;
while( k<retryCount )
{
try
{
if( itsEncoding==null )
itsEncoding = DEFAULT_ENCODING;
itsConn.disconnect();
itsConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
itsConn.connect(); //建立連接。
//System.out.println( itsConn.getContentEncoding() );
// Map map=itsConn.getHeaderFields();
// Iterator it=map.keySet().iterator();
// while (it.hasNext())
// System.out.println(itsConn.getHeaderField((String)it.next()));
String charset=itsConn.getHeaderField("Content-Type");
int kk=-1;
if(charset!=null&&(kk=charset.indexOf("charset="))!=-1)
{
charset=charset.substring(kk+8);
itsEncoding=charset;
}
rd = new BufferedReader( new InputStreamReader( itsConn.getInputStream(), itsEncoding ) );
{
break;
// retryCount = 0;
}
} catch (IOException e)
{
// TODO Auto-generated catch block
// e.printStackTrace();
retryFlag = true;
retryCount--;
// System.out.println("");
System.out.println( itsUrl + " [left retry " + retryCount + "]" );
}
}
if( retryFlag )
{
System.out.println( itsUrl + " [ get at retry" + (m-retryCount) + "]" );
}
if( rd==null )
{
System.out.println( "donot get the page." );
return null;
}
String str;
StringBuffer pageStr=new StringBuffer();
int i=0;
try
{
while( (str=rd.readLine())!=null )
{
i++;
// System.out.print( "." );
pageStr.append( str.trim() );
}
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
// System.out.println( "\nline=" + i );
try
{
rd.close();
} catch (IOException e2)
{
// TODO Auto-generated catch block
e2.printStackTrace();
}
itsConn.disconnect();//源代碼成功獲取,斷開連接。
itsPageStr = pageStr.toString();
// System.out.println( itsPageStr );
// System.out.println( "parse all over" );
return itsPageStr;
}
public void setItsEncoding(String itsEncoding) {
this.itsEncoding = itsEncoding;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -