⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itemparser.java

📁 用来为垂直搜索引擎抓取数据的采集系统
💻 JAVA
字号:
/*
 * *****************************************************
 * 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.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import org.apache.commons.httpclient.NameValuePair;
import org.indigo.filters.FiltEnter;
import org.indigo.filters.FiltFirstColon;
import org.indigo.filters.FiltFrontBack;
import org.indigo.filters.FiltGtLt;
import org.indigo.filters.FiltSpace;
import org.indigo.filters.FiltUntil;
import org.indigo.filters.Filter;

import org.indigo.xml.FiltPair;
/**
 * 此类主要完成对所采集到的一条数据的封装。
 * @author wbz
 *
 */
public class ItemParser
{
    protected ArrayList itsPairs=null;
    private boolean itsFilterFlag=true;
    private String itsUrl;
    public static final String GAP_TOKEN="`";
    private Parser itsParser=null;
    private Filter [] filters = null;    
    private String emailUrl="http://www.damabang.com/buyandsale/";
    public  int errorMark=0;
    public  String errorField=null;
    public boolean IsByPost=false;
    public String formUrl;
    public NameValuePair data[]=null;
    private Hashtable<String, String> defaultValue=null;
    /**
     * 无参构造函数,主要完成对于一条数据中的每个数据项的过滤。
     *
     */
    public ItemParser()
    {
        filters = new Filter[6];
        filters[0] = new FiltUntil( ">" );
        filters[1] = new FiltFrontBack();
        filters[2] = new FiltSpace();
        filters[3] = new FiltEnter();
        filters[4] = new FiltFirstColon();
        filters[5] = new FiltGtLt();
        defaultValue=new Hashtable<String, String>();
    }
    public ItemParser(String s)
    {
    	
    }
/**
 * 当采集时需要动态默认值时,用到此方法。
 * @param name
 * @param value
 */
    public void setDefaultValue(String name,String value)
    {
    	defaultValue.put(name, value);
    }
    /**
     * 清除存放在table中所有值。
     *
     */
    public void clearTable()
    {
    	defaultValue.clear();
    }
    /**
     * 设置解析器。
     * @param parser
     */
    public void setParser( Parser parser )
    {
        itsParser = parser;
    }
    /**
     * 设置是否需要登陆。
     * @param IsByLogin
     */
    public void setIsByLogin(boolean IsByLogin)
    {
    	itsParser.setIsByLogin(IsByLogin);
    	
    }
    /**
     * 设置是否通过post方法登陆。
     * @param IsByPost
     */
    public void setIsByPost(boolean IsByPost)
    {
    	itsParser.setIsByPost(IsByPost);
    }
    /**
     * 当采集中遇到js时,可以通过此方法设置参数值。
     * @param data
     */
    public void setValuePair(NameValuePair data[])
    {
    	itsParser.setJSValuePairs(data);
    }
    public void setEncoding(String encoding)
    {
        return;
    }
    /**
     * add by wbz for useful information;
     * @param startStr
     * @param endStr
     */
    /**
     * 设置采集的前后标识字符串。
     */
    public void setItsPageStr(String startStr, String endStr)
    {
    	itsParser.setItsPageStr(startStr, endStr);
    }
    /**
     * 当需要登陆或采集中遇到表单时,设置处理页面。
     * @param url
     */
    public void setFromUrl(String url)
    {
    	formUrl=url;
    	itsParser.setFromUrl(url);
    }
    /**
     * 设置采集页面的URL。
     * @param url
     */
    public void setUrl( String url )
    {
        itsUrl = url;
        itsParser.setUrl( url );
    }
    /**
     * 此方法完成了主要的采集工作,
     * 首先是读取采集规则,然后把采集规则应用到实际的网页源代码中,抽取其中的信息。
     * @return
     */
    public String getAItem()
    {
        int sz=itsPairs.size();
        String str = "", startStr, endStr, tmpstr=null,isRegex=null,defaultValue=null;
        String isVarDef=null;
        String varDefName=null;
        
        int p;
        FiltPair pair=null;
        FiltPair temp=null;
        int parent=-1;
        int iii=-1;
        for( int i=0; i<sz; i++ )
        {
        	 pair = (FiltPair) itsPairs.get( i );
        	 p=pair.getPp();
        	 if(p!=-1)
        	 {
        		 parent=p;
        		 iii=i;
        	 }
        }
        /**
         * 循环读取抽取规则,根据抽取规则的前后标识提取中间信息。
         */
        for( int i=0; i<sz; i++ )
        {
            pair = (FiltPair) itsPairs.get( i );
            startStr = pair.getStart();
            endStr = pair.getEnd();
            isRegex=pair.getIsRegex();
            defaultValue=pair.getDefaultValue();
            varDefName=pair.getVarDefaultName();
            isVarDef=pair.getIsVarDefault();
            p=pair.getPp();
            if(i==iii)
            	continue;
            /**
             * modified by wbz for Regex;
             */
            if(isRegex!=null&&isRegex.trim().equals("true"))
            	tmpstr=itsParser.parserWithRegex(startStr, endStr);//当采集规则中用到正则表达式时。
            else if(isVarDef!=null&&isVarDef.trim().equalsIgnoreCase("true"))//当采集时需要动态默认值时。
            {
            	tmpstr=this.defaultValue.get(varDefName);
            	if(tmpstr==null)
            		{
            		tmpstr=itsParser.parseWith(startStr, endStr);
            		this.defaultValue.put(varDefName, tmpstr);
            		}
            	//this.defaultValue.remove(varDefaultValue);
            }
            else// added by wbz for defaultValue;当采集中用到静态默认值时。
            {
            	
            	if(defaultValue==null)
               tmpstr = itsParser.parseWith( startStr, endStr );
            	else
            		{
            		if(defaultValue.indexOf("###")!=-1)
            		{
            			tmpstr = itsParser.parseWith( startStr, endStr );
            			if(tmpstr!=null)
            			tmpstr=defaultValue.replaceAll("###", tmpstr);
            			
            		}else
            			tmpstr=defaultValue;
            		
            		}
            
            }
//             if(p==-1&&parent==i)
//            {
//            	temp = (FiltPair) itsPairs.get( iii );
//            }
            
            if( tmpstr==null&&p==-1 )//判断采集时是否遇到错误。
            {
            	if(errorMark>=0&&errorMark<sz)//判断出错位置。
            	{
            		errorField=startStr+" and "+endStr+" 出错";
            	    errorMark=i+1;
            	 
            	}
                return null;
                
            }
            
            String backup=null;
            backup = tmpstr;
            String email=null;
/**
 * modified by wbz
 * 当需要进入第三级链接时,执行下面的语句。
 * 从第三级页面中获得所需信息。
 */          
            if( p==-1&&parent==i)
            {
            	temp = (FiltPair) itsPairs.get( iii );
                String begin,end;
                begin = temp.getStart();
                end =temp.getEnd(); 
                int ii,jj;
                ii = tmpstr.indexOf( begin );
                jj = tmpstr.indexOf( end, ii+begin.length() );
                String thirdurl = null;
                thirdurl = tmpstr.substring( ii+begin.length(), jj );
                
                
                thirdurl = emailUrl + thirdurl;
//                System.out.println( thirdurl );
                Parser parser = new Parser();
                parser.setUrl( thirdurl );
                String pageStr = null;
//                parser.open();
                
                pageStr = parser.parseAll();
                String beginemail, endemail;
                beginemail =temp.getPair().getItsStart();
                endemail = temp.getPair().getItsEnd();
                
                email = parser.parseWith( beginemail, endemail );
//                System.out.println( email );
                tmpstr = email;
                
                if( itsFilterFlag &&tmpstr!=null)
                	tmpstr = filt( tmpstr );
//                ii = str.lastIndexOf( "`", str.length() );
//                ii = str.lastIndexOf( "`", ii-1 );
//                str = str.substring( 0, ii );
//                str += ItemParser.GAP_TOKEN;
              
 //               str += ItemParser.GAP_TOKEN;
            }
            tmpstr = backup;
            tmpstr.replaceAll("`", "");
            if( itsFilterFlag )//过滤一些标签。
            	tmpstr = filt( tmpstr );
            
            str += tmpstr.trim();
            
            if(email!=null)
            {str += ItemParser.GAP_TOKEN;
            	  str += email;}
            str += ItemParser.GAP_TOKEN;
        }
        //把采集到的每个字段组成字符串通过`分隔。
        str = str.substring( 0, str.length()-1 );
        str = str.trim()+ItemParser.GAP_TOKEN+itsUrl;
//        System.out.println( str );
        return str;
    }
/**
 * 设置此次任务的采集规则。
 * @param list
 */
    public void setPairList( ArrayList list )
    {
        itsPairs = list;
    }
/**
 * 打开和指定页面的链接。
 * @return
 */
    public boolean open()
    {
        return itsParser.open();
    }
    /**
     * 关闭和指定页面建立的流。
     *
     */
    public void close()
    {
        itsParser.close();
    }
    /**
     * 把指定的字符串过滤。
     * @param str
     * @return
     */
    public String filt( String str )
    {
        int tmpsz,j;
        tmpsz = filters.length;
        for( j=0; j<tmpsz; j++ )
            str = filters[j].filt( str );
        return str;
    }
    /**
     * 设置是否需要过滤参数。
     * @param f
     */
	public void setFilterFlag(boolean f) 
	{
    	itsFilterFlag = f;
	}
// add by wbz
	/**
	 * 获取错误标记。
	 */
	public int getErrorMark() {
		return errorMark;
	}
//	 add by wbz
	/**
	 * 获取错误字段。
	 */
	public String getErrorField() {
		return errorField;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -