日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

WEB数据挖掘(四)——数据采集

發布時間:2023/12/13 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 WEB数据挖掘(四)——数据采集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以前開發過數據采集的程序,這段時間重新翻出來重構了一下代碼,程序還有很多需要改進的地方

web數據采集從http提交方式可分為get方式和post方式(其實還有其他方式,不過目前瀏覽器不支持),針對這兩種方式的數據采集,當時本人通過繼承抽象父類的方式來實現這兩種采集方式的請求參數封裝類,post方式的參數封裝類添加了post提交的參數(通過map成員變量保存post參數)

原來針對某指定站點或站點欄目的多頁請求時通過一次性的構造這些請求參數類的集合,然后在執行http請求時通過遍歷該集合來抓取web數據

后來本人發現,這種預先初始化請求參數類集合的處理方式在頁數比較大的時候,比如成千上萬的列表頁時初始化比較慢,并且性能也不理想

面對這種應用場景,本人想到了要采用Iterator模式來重構,在需要提交當前web請求時,才將它的請求參數對象構造出來

Iterator模式的原型如下

public interface NodeIterator {
    /**
     * Check if more nodes are available.
     * @return <code>true</code> if a call to <code>nextHTMLNode()</code> will succeed.
     */
    public boolean hasMoreNodes() throws ParserException;

    /**
     * Get the next node.
     * @return The next node in the HTML stream, or null if there are no more nodes.
     */
    public Node nextNode() throws ParserException;

}

通過實現該接口梯次構造返回對象,而不是預先初始化List集合,參考實現類如下

public class IteratorImpl implements NodeIterator
{
    Lexer mLexer;
    ParserFeedback mFeedback;
    Cursor mCursor;

    public IteratorImpl (Lexer lexer, ParserFeedback fb)
    {
        mLexer = lexer;
        mFeedback = fb;
        mCursor = new Cursor (mLexer.getPage (), 0);
    }

    /**
     * Check if more nodes are available.
     * @return <code>true</code> if a call to <code>nextNode()</code> will succeed.
     */
    public boolean hasMoreNodes() throws ParserException
    {
        boolean ret;

        mCursor.setPosition (mLexer.getPosition ());
        ret = Page.EOF != mLexer.getPage ().getCharacter (mCursor); // more characters?

        return (ret);
    }

    /**
     * Get the next node.
     * @return The next node in the HTML stream, or null if there are no more nodes.
     * @exception ParserException If an unrecoverable error occurs.
     */
    public Node nextNode () throws ParserException
    {
        Tag tag;
        Scanner scanner;
        NodeList stack;
        Node ret;

        try
        {
            ret = mLexer.nextNode ();
            if (null != ret)
            {
                // kick off recursion for the top level node
                if (ret instanceof Tag)
                {
                    tag = (Tag)ret;
                    if (!tag.isEndTag ())
                    {
                        // now recurse if there is a scanner for this type of tag
                        scanner = tag.getThisScanner ();
                        if (null != scanner)
                        {
                            stack = new NodeList ();
                            ret = scanner.scan (tag, mLexer, stack);
                        }
                    }
                }
            }
        }
        catch (ParserException pe)
        {
            throw pe; // no need to wrap an existing ParserException
        }
        catch (Exception e)
        {
            StringBuffer msgBuffer = new StringBuffer ();
            msgBuffer.append ("Unexpected Exception occurred while reading ");
            msgBuffer.append (mLexer.getPage ().getUrl ());
            msgBuffer.append (", in nextNode");
            // TODO: appendLineDetails (msgBuffer);
            ParserException ex = new ParserException (msgBuffer.toString (), e);
            mFeedback.error (msgBuffer.toString (), ex);
            throw ex;
        }
        
        return (ret);
    }
}

上面的代碼來自htmlparser組件的源碼,通過移動當前游標的方式來構造Node節點對象

本人參考以上的處理方式首先聲明接口

public interface ParamIterator
    {
        public boolean hasMoreParams();
        public Param nextParam();
    }    

具體實現類如下(該類為內部類,即內稟迭代子)

private class ConcreteIterator implements ParamIterator
    {
        private int currentIndex=0;
        private int start = 0;
        private int end = 0;
        private int step = 0;
        private StringTokenizer st = new StringTokenizer(WebCate.this.single_links.trim());
        private String urlexp=WebCate.this.expression.trim();
        public ConcreteIterator()
        {        
            //解析分頁表達式開始
            if(StringUtils.hasLength(urlexp))
            {
                //解析分頁參數開始                
                //initpageparam(this.pageparam,start,end,step);
                String pageparamstr=WebCate.this.pageparam.trim();
                 if(StringUtils.hasLength(pageparamstr))
                    {
                        if(pageparamstr.indexOf(",")>-1)
                        {
                            String[] arr=pageparamstr.split(",");
                            if(arr.length==2)
                            {
                                start=Integer.valueOf(arr[0]);
                                String endstr=arr[1];
                                step=1;
                                if(endstr.contains(":"))
                                {
                                    String[] arr2=endstr.split(":");
                                    end=Integer.valueOf(arr2[0]);
                                    step=Integer.valueOf(arr2[1]);                                    
                                }
                                else
                                {
                                    end=Integer.valueOf(endstr);
                                }                
                            }                
                        }                                    
                    }
            }
            currentIndex=start;
            //解析分頁參數結束
        }
        @Override
        public boolean hasMoreParams() {
            // TODO Auto-generated method stub
//            if(step>0)
//             {
//                return currentIndex<=end;                              
//             }
//             if(step<0)
//             {
//                 return currentIndex>=end;                  
//             }            
            return false;
        }

        @Override
        public Param nextParam() {
            // TODO Auto-generated method stub
            Param param=null;
            boolean single=true;
            if(WebCate.this.httpmethod==0)
            {
                //解析單頁集合
                if(StringUtils.hasLength(WebCate.this.single_links))
                {                    
                    String str=null;                    
                     if(st.hasMoreElements() )
                     { 
                         str=st.nextToken().trim();
                         
                         if(StringUtils.hasLength(str))
                         {
                             param=new GetParam(str);                             
                         }                         
                     }
                     else
                     {
                         single=false;
                     }                    
                }                
            }
            if(StringUtils.hasLength(urlexp))
            {
                urlexp=transfer(urlexp,currentIndex);                
                if(WebCate.this.httpmethod==0)
                {
                    if(!single)
                    {
                        if(step>0&&currentIndex<=end)
                        {
                            param=new GetParam(urlexp.replace("{*}", String.valueOf(currentIndex)));
                        }
                        if(step<0&&currentIndex>=end)
                        {
                            param=new GetParam(urlexp.replace("{*}", String.valueOf(currentIndex)));
                        }                        
                    }                    
                }
                else 
                {
                    if(step>0&&currentIndex<=end)
                    {
                        param=new PostParam(urlexp,buildmap(WebCate.this.postparam.trim(),currentIndex));
                    }
                    if(step<0&&currentIndex>=end)
                    {
                        param=new PostParam(urlexp,buildmap(WebCate.this.postparam.trim(),currentIndex));
                    }                    
                }                
                currentIndex=currentIndex+step;                
            }            
            return param;
        }        
    }

通過改變當前索引的方式(int currentIndex)獲取下一個請求的參數對象(Param)

然后在請求參數類里面返回該對象

public ParamIterator elements()
    {
        return new ConcreteIterator();
    }

然后我們在執行Http請求時就可以通過迭代來獲取請求參數Param對象了

最終的采集效果如下

原型頁面如下

勘誤:

通過改變當前索引的方式(int currentIndex)獲取下一個請求的參數對象(Param)

應該是 改變當前頁碼的方式 currentIndex命名為currentPage更合適

---------------------------------------------------------------------------

本系列WEB數據挖掘系本人原創

作者博客園刺猬的溫馴

本文鏈接http://www.cnblogs.com/chenying99/archive/2013/05/27/3100883.html

本文版權歸作者所有,未經作者同意,嚴禁轉載及用作商業傳播,否則將追究法律責任。

總結

以上是生活随笔為你收集整理的WEB数据挖掘(四)——数据采集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.youjizz.com视频| 亚洲视频精品一区 | 俄罗斯av片| 日本国产精品视频 | 玖玖999 | aa一级片 | 久久亚洲精品中文字幕 | 国产免费不卡 | 久久妇女 | 成人国产一区 | 麻豆视频在线免费观看 | 日韩一区二区免费视频 | 国产一区二区三区黄 | 嫩草在线观看 | 国产久视频 | 神马午夜我不卡 | 激情三区| 亚洲成av人片一区二区梦乃 | 五月婷婷影院 | 最近最新mv字幕观看 | 亚洲调教欧美在线 | 成人av第一页 | 久久精品网 | 蜜桃久久av一区 | 综合伊人 | 国产真实交换夫妇视频 | 人人妻人人澡人人爽久久av | 特级西西444www大精品视频免费看 | 亚洲天堂免费观看 | 黄色小视频链接 | 久草视频免费在线观看 | 奇米二区| 99国产精品久久久久99打野战 | 欧美偷拍第一页 | 自拍偷拍第1页 | 亚洲AV无码一区二区三区蜜桃 | 中国在线观看视频高清免费 | 亚洲精品白浆 | 国产视频二区三区 | 天堂bt在线 | 在线免费观看av片 | 亚洲国产精品激情在线观看 | 狠狠老司机 | 久久亚洲精少妇毛片午夜无码 | 国产欧美一区二区三区国产幕精品 | 国产欧美日韩一区二区三区 | 色丁香婷婷综合久久 | 91大神福利视频 | 小罗莉极品一线天在线 | 国产一二三区在线视频 | 98av视频| 粗暴video蹂躏hd| 奇米影视狠狠 | 久久久国产精 | 国产精品一区av | 福利一二区 | 成人爽爽视频 | 奇米网久久 | 呦呦av| 最新91视频 | 久久网站视频 | 色婷五月天 | 亚洲人妖在线 | 手机av免费在线 | 色欲久久久天天天综合网 | 亚洲精品视频在线 | 不卡在线视频 | 国产欧美日韩精品区一区二污污污 | 四虎精品一区二区 | 一级a毛片| 国产精品视频在线看 | 久草热线 | 国产一级在线观看视频 | 日产国产亚洲精品系列 | 色干干 | 性调教学院高h学校 | 日本视频在线观看 | 九九热视频免费 | 超碰人人人人 | 国产偷v国产偷v亚洲高清 | 国产喷水吹潮视频www | 精品国产视频一区二区 | 久久久久久国产精品 | 男女视频久久 | 灌满闺乖女h高h调教尿h | 亲子乱对白乱都乱了 | 中国国产毛片 | 老公吃小头头视频免费观看 | 粉嫩av一区二区三区 | caoporm超碰 | jjzzjjzz欧美69巨大 | www.av小说| 91国产中文字幕 | 欧美色图在线播放 | 精品久久中文字幕 | 一极黄色大片 | av免费资源 | 美女啪啪一区二区 | 日韩精品免费一区 |