当前位置: 首页 > news >正文

绍兴网站关键词推广营销技巧美剧

绍兴网站关键词推广,营销技巧美剧,潮安区建设局网站,青岛手机建站价格以前开发过数据采集的程序,这段时间重新翻出来重构了一下代码,程序还有很多需要改进的地方 web数据采集从http提交方式可分为get方式和post方式(其实还有其他方式,不过目前浏览器不支持),针对这两种方式的数…

以前开发过数据采集的程序,这段时间重新翻出来重构了一下代码,程序还有很多需要改进的地方

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 nodeif (ret instanceof Tag){tag = (Tag)ret;if (!tag.isEndTag ()){// now recurse if there is a scanner for this type of tagscanner = 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;//解析分页参数结束
        }@Overridepublic boolean hasMoreParams() {// TODO Auto-generated method stub
//            if(step>0)
//             {
//                return currentIndex<=end;                              
//             }
//             if(step<0)
//             {
//                 return currentIndex>=end;                  
//             }            return false;}@Overridepublic Param nextParam() {// TODO Auto-generated method stubParam 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

本文版权归作者所有,未经作者同意,严禁转载及用作商业传播,否则将追究法律责任。

http://www.lbrq.cn/news/2676907.html

相关文章:

  • 荔湾区做网站公司做公司网站的公司
  • 建设个人网银网站南京疫情最新消息
  • 58网站模板广州网站优化公司
  • 网站建设费一般摊销几年产品推广营销方案
  • 多视频网站建设网络广告人社区
  • 可以做动感影集的网站百度收录情况查询
  • 宣城有木有专业做网站的福州网站建设
  • 手机优化怎么关闭惠州seo推广外包
  • 建网站网络推广优势百度seo2022新算法更新
  • 网页传奇网址湖北网站seo
  • 为什么做网站结构优化域名估价
  • 法律行业网站建设谷歌搜索优化seo
  • 不正规网站制作sem优化技巧
  • app界面设计说明aso优化前景
  • 打字建站宝百度指数数据分析平台官网
  • 网站的策划和建设百度推广一年多少钱
  • 装饰公司怎样做网站北京互联网公司有哪些
  • wordpress 内链引用重庆seo推广外包
  • 邢台网站设计怎么做可以免费发布广告的平台有哪些
  • 钱网站制作百度快照优化seo
  • 百度权重3的网站值多少怎么做自媒体
  • 关于电影网站的论文摘要找广告商的平台
  • 制作网站的公司哪家比较好论坛推广怎么做
  • 网络空间安全考研院校windows优化大师是哪个公司的
  • 重庆工程建设信息查询网站优化方案
  • 新乡个人网站建设哪家好资源搜索引擎搜索神器网
  • 沈阳网站关键词优化服务好常熟seo网站优化软件
  • 公司接软件开发平台seo营销工具
  • 在线视频网站a做免费下载北京seo优化哪家公司好
  • 网站建设好后怎么制作网页网络营销内容
  • ChatML vs Harmony:深度解析OpenAI全新对话结构格式的变化
  • 《解锁 C++ 进阶密码:引用补充与内联函数、nullptr 核心用法》
  • 机器学习——多元线性回归
  • ubuntu22.04安装autoware.universe
  • 【C++详解】红黑树规则讲解与模拟实现(内附红黑树插入操作思维导图)
  • Spring学习笔记:Spring AOP入门以及基于Spring AOP配置的深入学习与使用