)
3.能创建非常可靠的Html文档结构(比如:html标签包含head 和 body,在head只出现恰当的元素)
爬虫系统的爬取对象分别选择了凤凰网新闻、网易新闻、搜狐新闻,因为这些新闻都开放了点击数量查询,且这三大媒体无论是影响上,还是覆盖面上,都是非常巨大非常广泛的,非常适合作为爬取对象,爬取过程中也没有复杂的Ajax需要处理,而且这些新闻的访问数据都是每天更新的。
爬虫程序需要以循环定时运行在响应的服务器上,每天定时爬取以上网站的新闻内容,并存入数据库,数据库采用了Mysql,因为Mysql比较轻量级,有免费的学术研究的版本,而且比较适合当前场景。Mysql数据库引擎采用了MyIASM,按理来说,MyIASM是比较古老的引擎,但是MyIASM存储引擎在曲度方面的性能要好于INNODB,虽然不支持事务,但是爬虫存储暂时不涉及事务的使用,再加上MyIASM优秀的插入查询速度,使得爬虫数据的存取非常快捷、迅速,所以这里选择了MyIASM作为Mysql的存储引擎。
数据采集系统的爬虫在爬取网站是采用多线程并发爬取的,所以多线程的爬虫对数据库的并发操作会有很多很多,在进行数据库操作的时候,第一步是建立数据库连接,在多线程的环境下,这些操作会进行得非常频繁,但是这些操作又非常的耗费网络、内存空间等,这些操作会对系统资源、系统运行效率有很大的负面影响,所以必须采用数据库连接池。网上有很多开源而且优秀的数据库连接池,比如Apache开源的dbcp,平时tomcat使用DateSource配置连接池的时候就是使用了tomcat内置的dbcp连接池,此外还有c3p0数据库连接池,也是非常优秀的连接池,SSH三大框架之一的Hibernate就采用了c3p0作为其内置连接池,其优秀性能可见一斑,不过这些连接池相对来说都比较重量级,所以自己在这里写了一个相对比较轻量级的连接池MF_DBCP,下面会介绍下自定义连接池相关内容。
省略
监视器初始化后开启两个线程: 1.号线程根据配置文件中的 status_checktime 字段来周期性运行实现扫描连接池中的坏链接并修复 2.号线程根据配置文件中的 num_checktime 字段来周期行创建连接池使用状态的快照,当足够三个状态时,根据三点画出的曲线来确定数据库连接池中到底需要保存多少连接,并保证连接数不小于最小连接数。 以下用 + 表示当前快照连接数大于前一快照,–表示当前快照连接数小于前一快照: +++ 监视器不做任何动作,因为连接数在稳步增加; -± 监视器末尾保留最后两个连接快照的平均连接数,剩下的多余连接回收; — 监视器保留三个快照平均连接数作为当前连接,剩下的多余连接回收; 自定义数据库连接池的相关API如下: addNew() 方法为连接池增加新的连接; addLast() 方法为未开启事务从而可以共享的连接提供”负载均衡”的策略(当一个连接被使用一次,则将他放入队列末尾,试想这样可以循环队列); deleteFirst() 方法循环调用可以清空连接池队列; delete() 方法提供了从连接池中移除某个连接的方法; getFirst() 方法提供了获取负载最轻即队首的连接; getLoad() 方法提供了获取指定连接负载大小的方法; getConnectionContainer() 方法提供了获取某个连接所在的连接容器(从而操作连接池中的连接池容器队列); remove() 方法提供了从连接池中移除某个开启了事务的连接,deleteLater() 方法提供了获取数据库中可以清除(负载等于0)的连接; getMinLoadConnection() 方法提供了获取连接池中负载最低的连接以便创造专用的事务连接; getConnectionContainers() 方法为外界提供了获取数据库连接池队列的方法; isFullFree() 方法判断当前连接池是否完全处于空闲状态(关闭连接池判断); size() 方法提供获取连接池除去事务连接剩余连接的数量; createConnection() 方法为连接池提供创造新连接的方法; destoryConnection() 方法指定关闭某个连接; repairPool() 方法提供了修复连接池中坏连接的方法,并用新的可用的连接替换; releasePool() 方法提供了连接池收缩大小的方法,确保保留的连接数是最合适的; revokeConnection() 方法提供了回收连接,将其重新加入连接池队列的方法; getConnection() 当用户需要连接时调用; getPoolStatus() 返回当前连接池的使用情况; close() 关闭数据库连接池;
4.1.2 中文分词模块 首先简单地介绍下中文分词的概念,中文分词也就是经过相关的算法,把原来的汉语句子或者更长的汉语语料正确分割成为一个一个的汉语词语的过程。
说到中文分词,先来介绍下英文的分词,计算机由欧美人发明,所以他们很早就进行了有关英文分词的研究,本文从简到繁进行介绍,英文分词很简单,人们平时阅读到的英文文章,英文单词与单词之间都有一个空格,利用这个特点,程序可以非常迅速的将英文文章进行英文分词。这时候回过头来看看汉语,发现问题来了,除了语句中的标点符号,基本上所有的汉语都是连续的,并没有非常明显的分割的特征。这时候原来用于英文分词的那一套工具在汉语语料的分词方面完全没有一点作用了,当然,也不能要求在汉语写作中学习英文的方式,在词语与词语之间用空格作为间隔,所以需要专门研究下汉语的分词策略。
这时候,再回到英文分词的思路上,从小到大,可没少学过英语短语,是不是发现了什么?英文短语与短语之间的分词也不能单纯的用空格作为判断了。但是英文单词之间的组合以及规律要明显比汉语强很多很多,但是汉语拥有世界上最大的使用群体,研究汉语中文分词技术还是非常非常有必要的。到底怎么进行汉语中文分词呢?所以首先得研究研究汉语的语法。
在这里声明下,汉语中文分词目前并不涉及到汉语古文的分词,具体的原因是因为古文的分词难度泰国巨大,基本上无规律可言。
经过这些年大量计算机爱好者和学术工作者的研究探索,逐渐推出了一些半成熟的中文分词的算法,中文分词的路上举步维艰,还需要各位加油研究。在这里本文先介绍下几种比较常见中文分词的算法: (1)字符匹配的中文分词方法 字符匹配的中文分词方法时基于语料词典的分词算法,分词结果的准确性很是依赖是否有一个好的分词词典,算法的具体内容是,首先将分词词典以某种数据结构的形式载入内存,一般都是Hash散列存储的方式,因为这个方式有极快的查找速度,然后根据分词词典中的词语去匹配要分词的中文语料字符串,经过一些比较细腻的匹配规则,最终能够成功将该汉语语料字符串拆分成不重复的若干汉语词语,即匹配完成。
再拆分要分词的汉语语料时候,应该结合多种多样的拆分方法,因为不同的拆分方法可能会带来完全不同的分词结果。面对一个随机的符合规范的汉语语料,如果它具有足够的长度,足够清晰而且不存在理解歧义的情况下,从不同的拆分方法出发,最终得到的分词结果一定是一致的。
利用计算机分词的话,必定存在着很多奇奇怪怪的分词结果,完全可以采用统计学的方法来提高最终的分词结果集的正确命中率。具体的做法是,定制多个拆分汉语语料的算法,然后分别计算其最终的分词结果,然后统计最终的结果集,哪一部分分词结果在最终分词的结果集中出现的次数最多,则就取该分词作为最终的分词结果。
本文最终采用的分词方法即为本分词方法的改进版本,结合了IK分词和Lucene的一些特性。字符匹配的中文分词算法对一个合适的分词词典依赖非常大,那么如何得到这个分词词典呢?最笨的办法就是人工审阅新闻资料,或者下载汉语字典,提取其中的词语作为分词词典,其次,分词词典还需要进行不断进化。层出不穷的网络新词,对分词结果造成了巨大的挑战,这里就不讨论程序自学习以及词典的自动扩展算法了。常用的中文分词算法有下面几种:
(2)语义分析理解的中文分词方法 这种中文语料的分词方法时首先要分析得出汉语的语义、语法、句法等,得出这些规律目标是能利用这些规律来让计算机能理解汉语语句的意义,但是这种方法看似完美,但是有很遥远。首先想要彻底能总结出这些规律本身就是非常复杂的,因为汉语整个语法体系的复杂性,还有就是汉语的灵活组合性,不同的组合就是不同的意思,例如“我还欠了他的钱”,这句话如果把“还”念作“hai”,整个句子的意思是“我现在还欠着他的钱”,但如果把“还”念作“huai”,那整个句子的意思就变成“我还钱了,把欠他的钱都还给他了”,这种情况识别就一定会出现问题。再者就是如果得出了这些规律,也要把这些规律以编程的方式实现出来,这个过程也是非常困难的。语义分析理解的中文分词方法是跟人工智能的发展息息相关的,如果能实现基于语义分析的中文语料的分词,那么人工智能也能获得长足的发展。 因为本算法的研制工程周期长,且困难,目前在国际上都还处于概念阶段。就算实现了对汉语的语义语法理解,世界上还有其他语言:英语、俄语、法语、阿拉伯语等等语言,发展历程必然艰难。本文在此提及此方法仅作为一种思路,目前没有实现的思路。
(3)统计的中文分词方法 如果从汉语词语的角度出发去研究词语的规律,很快就可以得到一个结论,那就是相互组成一个词语的两个汉字顺序出现在一起的频率会很高。可以利用这个特点来判定任意相邻的汉字是否组成了一个词,但是很明显存在一个问题,到底多高的频率才能证明这几个字组成了一个词?从数学的角度来看,这不是单一系数就能解决的问题,也绝对不是单一的函数关系,因为变量太多了,可能不同的汉字本身达到可以判定它跟某个汉字组合成词的阈值是不同的,比如一些生僻的字,本文在这块献丑举个例子:“好”这个字,它可以组成“好人”,“美好”,“刚好”,“恰好”,“好运”,“好奇”,“合好”,“友好”,“问好”,“讨好”……等等词语,在百度上搜到的结果有7500条之多;举另外一个字“驭”,用“驭”组词,有“驾驭”,“驭风”……等词语,仅仅只有120条左右,明显“好”跟“驭”两个字不能用一样的判定标准,它们出现的频率差异太大,是不能共用一套判定方案来判断它们是否组字成词的。
其次,还有一个问题,有一些特殊的汉字,他们也会对整个中文分词结果产生不可忽视的干扰作用,例如“了”,“的”,“着”,这些词语各自可以组字成词,例如“了解”,“目的”,“着手”等等,但是他们在整个中文语料中更多的形式是类似于这样的形式:“走了”,“累了”,“掉了”,“好的”,“你的”,“他的”,“走着”,“跑着”,“着了”等等形式,这样的形式明显不是词语,这些字经常作为结束语出现,可能对整个基于词频的汉语分词算法产生巨大的干扰作用,而在中文语料中,列举出来的这几个词还仅仅是冰山一角。所以这种方法仅仅单靠词频是完全不够的。 不过,到目前,人工智能越来越热,发展也变得迅速起来,不得不说这种方法是具有一定的前瞻性的,如果事先能给出大量的汉语语料的训练集,再辅以人工纠错与修正操作,是这种统计的中文分词算法越来越准确,相信这种方法在不久的未来会替代其他的分词算法。在处理自然语言上,去理解语义、语法这才是正道。通过建立相关的语法模型,不断地进行统计分词的训练,后期算法一定会有非常不错的分词成果,不过本文研究仅仅是借用中文分词的工具,也不会在这方面进行太过深入的讨论。顺便提下,作为训练集的语料完全可以采用类似本文的爬虫系统从网络上每天搜集到最新的新闻情报进行训练,人工纠错,因为没有比新闻更有实效性的汉语语料训练集了,这样“网络新词”也能得到及时的补充与学习,后期需要人工参与纠正的次数会越来越少,分词结果也会越来越准确。
本文使用了IK Analyzer作为汉语分词的工具。IK Analyzer是一个完全免费开源的中文分词的工具,基于Java开发的非常优秀、快速的中文分词的工具包。国内还有一个较为著名的中文分词工具Ansj,号称能很好的识别人名与地名,而且处理速度方面完全超越IK分词,不过由于IK分词基于Lucene,最近自己又在研究Lucene的原因,况且对IK的分词结果也还算满意。
本系统使用的IK Analyzer的版本为2012u6,作者林良益是一名自身的Java程序开发工程师。在IK Analyzer中能看到很多Lucene的影子,比如IK分词的核心就是基于Lucene的,其中大量的导包也能看出来源于Apache Lucene。现在有空也在研究IK分词的算法以及原理,希望能给许久未更新的IK分词加入自己的贡献,IK分词系统结构图如图4-1所示。
图4-1 IK分词的设计结构图 4.1.3 相似度匹配模块 利用中文分词工具将爬虫系统采集回来的数据进行中文分词之后,则需要分析文章的相似度,之后再将相似的文章的数据整合到一起,为之后可视化展示同一条新闻的变化趋势打下基础,其中计算文章相似度的算法有很多,主要来说是有两种,一种是余弦定理,另一种是计算杰卡德距离的方法。
1.余弦定理相似度计算法 余弦定理是怎么能应用到计算文章的相似度呢?先想想余弦定理的概念,如果能将两篇文章转换为数学中的两条向量,那么可以用过余弦定理来计算这两条向量之间的夹角。具体应该怎么能将文章转换为数学中的向量呢?这里就用到了中文分词,然后可以将带分析的汉语语料进行中文分词,并保存各自的分词结果集A,B。分词结束后再另外设置一个集合S,令S = A ∪ B,那么分别计算A,B两个集合中的词语在原始预料中的词频,然后建立A、B到S的映射,如果S中有而A或者B中没有,那么记该词语的词频为0,那么就能得到两条维度相同的向量,这样就可以用余弦定理来计算相似度了。 第一步,进行中文语料的分词。 句子A:我/喜欢/看/电视,不/喜欢/看/电影。 句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。 第二步,列出所有汉语词语的集合。 我,喜欢,看,电视,电影,不,也。 第三步,计算集合中每个词语的词频。 句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。 句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。 第四步,写出每句话的词频向量。 句子A:[1, 2, 2, 1, 1, 1, 0]。 句子B:[1, 2, 2, 1, 1, 2, 1]。 有了词频向量,中文文章的相似度计算问题就简化了,变成了如何去计算这两个词频向量的离合程度。首先可以把这两条词频向量想象成存在于空间中的两条任意线段,这两条线段必然能组成类似于下图的夹角,再计算夹角的余弦值。 在这里讨论下最简单的维度,也就是二维空间,下图的a和b是两个字母分别代表两个不同的向量,需要计算它们夹角的余弦值COSθ,如图4-2所示。
图4-2 两向量形成夹角
向量a,b所构成的夹角如图4-3所示。
图4-3 向量a,b所构成的夹角 可以采用下列公式来计算出夹角θ的余弦值,计算公式如图4-4所示。
图4-4计算ab两向量的余弦值公式 如果是多维向量呢?如何计算多维向量在空间中的夹角的余弦值?经由数学推导,可以使用下面多维向量的余弦值计算公式如图4-5所示。
图4-5 多维向量的余弦值计算公式 两个汉语词组的词频向量的余弦值可以作为这两篇汉语语料整体相似度的度量,因为从数学上来讲,当两向量的余弦值越接近或完全等于0,则表明两个向量的夹角是两条方向完全垂直的,在中文语法的角度来解释向量垂直,就是两篇语料的分词结果是完全没有一样的,这样有很大的可信度表明,这两篇文章内容是完全不相干的,反过来,如果俩向量的夹角的余弦接近或完全等于1,则表明这两条向量几乎可以看做成同一条向量,从中文语法的角度来解释,也就是两篇中文语料的分词结果基本上是一致的,有很大的可信度表明,这两篇文章的内容是完全类似的。
由此,就得到了“找出相似文章”的一种算法: (1)使用中文分词算法,首先需要找出这两篇带分析文章的重要关键词。 (2)从每篇文章分别取出所有的关键词,将其合并成为一个集合,然后来计算这两篇文章相对于关键词集合的词频,这样就生成了这两篇文章两条待分析的词频向量。 (3)最后计算这两个词频向量的余弦值,余弦值越接近于1则文章越相似。 “余弦相似度”是一种非常有用的算法,凡事想要知道任意两个向量的相似程度,都可以使用余弦定理。
4.1.4 数据展示模块 经过相似度匹配算法匹配为相似文章的算法则存储到同一条数据记录之中存入数据库,然后将相似数据读取出来,将数据以可视化的形式展示出来,步骤如下: (1)将POJO对象转换为JSON: JSON(JavaScript Object Notation) 是一种非常轻量级的类似而又超越可扩展标记语言的数据交换的格式。JSON是基于ECMAScript的一个子集。 JSON采用了完全独立于任何编程语言的书写格式,但也使用了非常类似C语言家族的一些语法习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。
JSON一经推出,直到现在,在数据交换载体的选择上完全有替代XML的趋势。最近在公司写的一个金融项目,是为财新网写的债券实时行情的金融项目,项目中后台数据传送到前台用的是Servlet,Servlet中是将从Service层中得到的数据对象(一般都是List、Map、或者其他的POJO对象),经过fastjson转换成为JSON字符串,最终输出在Servlet上。然后前台js用ajax异步加载的方式调用Servlet,可以很容易的将获取到的JSON字符串转化为相关的对象。
此外,有大量的测试表明,同样字节数同样大小的JSON可以装载的数据信息量要比XML多出很多,这样就表明,JSON的压缩性更好,自身的负载效率高,所以,如今越来越多的网站数据交互、以及企业级的信息交互、经典的C-S模式都逐渐改用了JSON作为数据传递的载体。
从JavaScript语言层来看,JSON俨然就是JavaScript中的数组类型与对象类型之间的组合体,有点类似与C语言中结构体strut的语法定义模式,很明显,strut能通过对不同数据结构的组合,再添加各种各样的数据嵌套,可以表示世界上任意一种信息格式,JSON非常类似于这种结构体,正因为JSON作为一种高效的数据载体来说可谓是“无所不能”,近些年,有关JSON的发展飞速而且迅猛。下面分别简单介绍下JavaScript中的对象与数组:
对象: JSON对象在js中表示为用“{}”括起来的内容,其数据结构为 {key:value,key:value,…}的键值对的结构,在绝大多数的面向对象的编程语言中,key即键是对象属性的名字,而value即值则是对象的属性值。在C语言、Java、Python等语言中通过Object.key来取得value的具体的值。
数组: 数组在js中是中用括号“[]”符号包含起来的内容,js数组的数据结构如 [“this”,“a”,“test”,…],使用数组的索引可以来获取数据相应位置的数值,数值的数据类型包括各种各样的数据类型:对象、字符串、数字、数组等等。实验证明经过对象、数组2种数据结构是可以组合成各种各样任意复杂度的数据结构。
现如今,可以把POJO对象转换为JSON的工具有很多,比如谷歌的Gson工具包,比如阿里贡献的开源JSON转换工具fastjson,本文使用了阿里巴巴的fastjson。Fastjson提供了包括JSON数据的“序列化”和“反序列化”两部分的JSON相关的功能,其优势有:号称对JSON数据的解析与反解析速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser,包括自称最快的JackJson。FastJson功能强大,完全支持Date、Enum、Java Bean、Set、Map、等常见的数据模式与类型,并且原生,能在所有Java能运行的地方运行。Java对象转换为JSON格式,一般有以下几种情况: Java普通单节点对象转换为JSON的原理: 通过对象的get()方法来获取对象的属性的值即JSON数据的值,然后通过get()方法的函数名得出具体是get的哪个成员变量,于是这样就能得出了JSON数据的键,然后经过复合JSON语法的拼接与组合,就成功将对象转换为了JSON。但如果对象没有提供响应的get()方法呢?那么就需要通过Java的反射机制来拿出要转换成JSON的对象的字段,然后判定哪些字段是必须的,同时抛弃掉“垃圾数据”的字段,最终将字段组合成JSON。组合成JSON的时候,其字段名称作为String类型的key存在,其属性值作为相对应数据类型的key存在,如图4-6所示。
图4-6 对象转换为JSON原理图 Java普通单节点数组转换为JSON的原理: Java普通单节点数组转换为JSON可以由单节点转换JSON拓展而来,如图4-7所示。
图4-7 对象数组转换为JSON原理 Java复合对象转换为JSON的原理: Java符合对象转换为JSON其实就是Java普通单节点对象转换为JSON的原理的拓展,获取了字段名字之后,获取字段对应的属性的时候,需要判定该属性具体的数据类型,如果该属性的具体数据类型是基本数据类型中的一种,就必须使用该数据类型对应的JSON表示方法表示出来(例如有没有引号之分就是区别字符串变量与其他变量之间的区别的),如图4-8所示。
图4-8 复合对象转换为JSON原理 (2)将Json数据以可视化的形式展示出来 显示相似新闻数据使用了开放的图表绘制类库JfreeChart,JfreeChart工具使用纯Java语言编写而来,完全是为applications, applets, servlets 以及JSP等的使用而设计。JFreeChart可以生成例如散点图(scatter plots)、柱状图(bar charts)、饼图(pie charts)、甘特图(Gantt charts)、时序图(time series)等等多种图表,此外还可以生成PNG和JPEG格式进行输出,也可以和PDF和EXCEL等工具关联。
到目前为止,在Java中JFreeChart是非常不错的统计图形解决方案,JFreeChart基本上能够满足目前的Java在统计绘图方面的各种需求。 JFreeChart的优秀特性包括以下几点: 一致的和清晰明确的API,而且支持多种图表类型。 设计非常灵活,对各种应用程序来说非常容易扩展。 支持多种多样的输出类型,包括Swing组件、图像文件(PNG、JPEG)、矢量图形文件(PDF、EPS、SVG)。 JFreeChart是完全“开源”的,或者更具体地说, 自由软件。它是遵循GNU协议的。 JfreeChart优点如下: 稳定、轻量级且功能非常强大。 免费开源,但是开发手册和示例要花钱购买。 其API学习起来非常简单,整个工具容易上手。 生成的图表运行非常地顺畅。
4.2 系统异常处理 系统在运行过程中因为复杂的运行环境,可能会产生种种异常问题。 4.2.1 爬虫异常总体概况 省略
4.2.2 爬虫访问网页被拒绝 爬虫大量爬取网站时,会对网站资源占用严重,所以很多网站加入了反爬虫机制,大量爬取网站数据时,会出现Access Denied一类的错误,网页服务器直接拒绝了访问,这时候爬虫就得需要能伪装的像一个真正的浏览器一样,有如下方法: (1)伪装User-Agent User-Agent标明了浏览器的类型,以便Web网站服务器能识别不同类型的浏览器。为什么要识别不同类型的浏览器呢?现在主流的优秀浏览器有windows10的Edge浏览器、微软的IE系列浏览器、谷歌的Chrome浏览器、Mozilla的FireFox浏览器,还有来自挪威的Opera浏览器,这些浏览器五花八门,分别出自各自的厂家,所以面对同样的html元素,他们的解析效果有可能是非常不同的,甚至会出现无法解析一些Html元素的情况,正式因为如此,所以Web网站服务器要判断不同的浏览器以便提供不同支持方案(例如CSS中针对不同的浏览器可能需要不同的标注)。
所以现在绝大部分的爬虫为了能够及时获取网站的数据,通常会设置一个某种浏览器的User-Agent以此来“欺骗”网站,告诉Web网站服务器自己是某一种浏览器,然后网站Web服务器才会返回真实的网页数据,一般比较常见几个浏览器的User-Agent如下: Chrome的User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 火狐的User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0 IE的User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko
HttpClient设置User Agent的方法如下: HttpGet getMethod = new HttpGet(“URL”); getMethod.setHeader(“User-Agent”, “user agent内容”);
(2)需要登录后才能访问网页数据 虽然绝大部分网站不登陆就能访问各个页面的内容,随着各个研究机构对互联网数据的需求越来越多的情况下,各种各样的爬虫随之诞生,但是一部分爬虫会无节制的爬取网站,大大地消耗了网站的带宽,导致正常的用户都无法访问网站,所以现在的绝大部分网站都相应推出了一些防护“恶意爬虫”的策略,例如网站一旦检测到某个IP的访问量有异常,就会要求这个IP访问的时候必须登录后才能访问。不过这样也有解决方法,可以直接在该IP所在主机上用浏览器登录,登录成功之后,如果浏览器是Chrome或者firefox那么可以直接查看浏览器的cookie,用HttpClient设置cookie即可访问即可。不过还有一些检测机制特别严格的网站,登录网站的时候必须填写随机验证码,这类网站的爬取难度可就大了,需要能识别网站随机扭曲的验证码,这些问题在本文不做讨论。
(3)使用代理IP访问 如果网站服务器维护人员用某段时间内某IP的访问次数来判定爬虫,然后将这些爬虫的IP都封掉的话,以上伪装就失效了。为了解决爬虫的IP被相关网站封停,仔细一想,如果爬虫能模拟出一批用户来访问该网站不就能解决这个问题吗?具体应该如何模拟呢?首先需要模拟出一个一个分散而又独立的用户,这就需要随机而又分散到全国各地的IP代理,爬虫运行的时候从这些IP代理中随机选取一部分IP作为代理使用,这样就能比较完美地解决单IP高频率高流量访问网站的问题了。
拥有了这些IP代理之后,应该如何去管理这些代理IP呢?这里可以做一个类似于数据库连接池的东西,当然这里存放的不是数据库连接,而是一个一个的代理IP,然后指定相关的代理IP分配策略。代理IP池做好之后,要做一个负载均衡,每次轮流使用代理IP池中可以正常使用的IP做循环访问,这样单一IP对网页服务器会迅速下降,非常明显。
5 软件测试 省略
5.1 白盒测试 白盒测试是一种基于软件逻辑结构设计的测试,在整个测试过程中,测试的参与者是完全熟知整个系统的逻辑分支的。白盒测试的盒子是指被测试的软件系统,白盒指的是程序结构与逻辑代码是已知的,非常清楚盒子内部的逻辑结构以及运行逻辑的。“白盒”法全面了解程序内部逻辑结构、对所有逻辑路径都进行相关测试。“白盒测试”会争取能够测试完软件系统中所有的可能的逻辑路径。使用白盒测试的方式时,一定要先画出软件所有的逻辑顺序结构与设计,然后再分别设计出合适而又全面的测试用例,最终完成白盒测试。 5.1.1 爬虫系统测试结果 因为爬虫系统逻辑设计相对来说是比较简单的,不涉及到基本路径法,因为整个正序只需要定时运行就行,不像其他软件系统那样,有较深的用户需求根基,需要相关人员配合使用。本次开发的爬虫系统是全自动的,所以百合测试结果与黑盒测试结果一致。 下图为爬虫系统的百合测试结果截图,测试方法即定时运行爬虫即可,下图中的条目为爬虫此次执行所爬取到结果中的一部分,爬取结果如图5-1所示。
图5-1 爬虫爬取结果 5.1.2 中文分词系统测试结果 中文分词系统测试也比较简单,没有复杂的业务逻辑,结果基本呈线程顺序,且执行路径唯一,下图为中文分词系统的白盒测试结果,首先是测试的语料的截图,如图5-2所示。
图5-2 中文分词原文 最终的分词结果如下,目前想要提高分词结果非常困难,需要加大词库的准确性,白盒测试结果如图5-3所示:
图5-3 中文分词结果 5.1.3 中文文章相似度匹配系统测试结果 中文文章相似度计算方法采用了余弦定理计算两篇文章所对应的汉语词语的词频向量的夹角的余弦值,在经过大量的试验后发现其准确率还是非常非常高的,测试结果如图5-4所示。
图5-4 余弦定理相似度匹配 可以看出,“国家专项计划引苏鄂家长担忧教育部回应”这篇新闻与“向中西部调剂生源致高考减招数万?湖北江苏连夜回应”两条新闻均是有关高考的,完美匹配到了一起,其次不排除有些极端的情况,导致匹配结果不正确,这个也会继续研究,提高准确率。
5.1.4 相似新闻趋势展示系统测试结果 相似新闻的展示采用了JfreeChart作为白盒测试的测试对象,测试结果如下图所示,精确显示了每一条新闻的关注度走势,如图5-5所示。
图5-5 JfreeChart测试图
5.2 黑盒测试 黑盒测试与白盒测试恰好相反,从名字就能看出,一黑一白,白盒测试者熟悉盒子中的内容,而黑盒测试者是完全不知道盒子中的内容的。黑盒测试主要是面向程序的功能实现而进行的测试,例如检验程序是否具有某一功能,而完全不必关心程序的逻辑设计。也就是说,整个黑盒测试关注的是软件系统的功能完整性,而不考虑程序逻辑上的BUG等问题。 5.2.1 爬虫系统测试结果 上面已经提到,本爬虫系统逻辑较为简单,白盒测试结果与黑盒测试结果一致,结果如图5-6所示。
图5-6 爬虫系统黑盒测试
5.2.2 中文文章相似度匹配系统测试结果 总体来说,黑盒测试的结果也是比较令人满意的,同样,瑕疵还是有的,这也是编程的挑战与乐趣所在之处,黑盒测试结果如图5-7所示。
图5-7 中文匹配黑盒测试 5.2.3 相似新闻趋势展示系统测试结果 黑盒测试相似新闻趋势展示系统测试了Echarts的效果,以便能跟白盒测试JfreeChart区别开来,测试结果如图5-8所示。
图5-8 黑盒测试新闻排行 点击上面的相关新闻会出现单个新闻的趋势发展图,如图5-9所示。
图5-9 echarts黑盒测试
6 结 论 省略
参考文献 [11] 于娟,刘强. 主题网络爬虫研究综述[J]. 计算机工程与科学, 2015, 37(02):231-237. [12] 张红云. 基于页面分析的主题网络爬虫的研究[D]. 武汉理工大学, 2010. [13] 张莹. 面向动态页面的网络爬虫系统的设计与实现[D]. 南开大学, 2012. [14] 张晓雷. 面向Web挖掘的主题网络爬虫的研究与实现[D]. 西安电子科技大学, 2012. [15] 奉国和,郑伟. 国内中文自动分词技术研究综述[J]. 图书情报工作, 2011, 55(2):41-45. [16] 许智宏,张月梅,王一. 一种改进的中文分词在主题搜索中的应用[J]. 郑州大学学报, 2014(5):44-48. [17] 欧振猛,余顺争. 中文分词算法在搜索引擎应用中的研究[J]. 计算机工程与应用, 2000, 36(08):80-82. [18] Batsakis.S, Petrakis E G M, Milios E. Improving the performance of focused web crawlers[J]. Data & knowledge engineering, 2009, 68(10):1001-1013. [19] Pant.G, Menczer F. MySpiders:Evolve Your Own Intelligent Web Crawlers[J]. Autonomous agents and multi-agent systems, 2002, 5(2):221-229. [20] Ahmadi-Abkenari F, Ali S. A Clickstream-based Focused Trend Parallel Web Crawler[J]. International Journal of Computer Applications, 2010, 9(5):24-28.
致 谢 省略
外文资料 省略
中文翻译 省略
5、资源下载
本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。
序号
毕业设计全套资源(点击下载)
本项目源码
基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(源码+文档)网络爬虫_数据挖掘.zip
你可能感兴趣的:(精选毕业设计完整源码+论文,爬虫,java,python)
理解Gunicorn:Python WSGI服务器的基石
范范0825
ipython linux 运维
理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico
Long类型前后端数据不一致
igotyback
前端
响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问
LocalDateTime 转 String
igotyback
java 开发语言
importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassMain{publicstaticvoidmain(String[]args){//获取当前时间LocalDateTimenow=LocalDateTime.now();//定义日期格式化器DateTimeFormatterformat
Linux下QT开发的动态库界面弹出操作(SDL2)
13jjyao
QT类 qt 开发语言 sdl2 linux
需求:操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序难点:调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的思路:1.调用方缺QApplication::exec(),那么我们在接口
店群合一模式下的社区团购新发展——结合链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序源码
说私域
人工智能 小程序
摘要:本文探讨了店群合一的社区团购平台在当今商业环境中的重要性和优势。通过分析店群合一模式如何将互联网社群与线下终端紧密结合,阐述了链动2+1模式、AI智能名片和S2B2C商城小程序源码在这一模式中的应用价值。这些创新元素的结合为社区团购带来了新的机遇,提升了用户信任感、拓展了营销渠道,并实现了线上线下的完美融合。一、引言随着互联网技术的不断发展,社区团购作为一种新兴的商业模式,在满足消费者日常需
Python数据分析与可视化实战指南
William数据分析
python python 数据
在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。一、环境准备1.1安装必要库在开始数据分析和可视化之前,我们需要安装一些常用的库。主要包括pandas、numpy、matplotlib和seaborn等。这些库分别用于数据处理、数学
python os.environ
江湖偌大
python 深度学习
os.environ['TF_CPP_MIN_LOG_LEVEL']='0'#默认值,输出所有信息os.environ['TF_CPP_MIN_LOG_LEVEL']='1'#屏蔽通知信息(INFO)os.environ['TF_CPP_MIN_LOG_LEVEL']='2'#屏蔽通知信息和警告信息(INFO\WARNING)os.environ['TF_CPP_MIN_LOG_LEVEL']='
Python中os.environ基本介绍及使用方法
鹤冲天Pro
# Python python 服务器 开发语言
文章目录python中os.environos.environ简介os.environ进行环境变量的增删改查python中os.environ的使用详解1.简介2.key字段详解2.1常见key字段3.os.environ.get()用法4.环境变量的增删改查和判断是否存在4.1新增环境变量4.2更新环境变量4.3获取环境变量4.4删除环境变量4.5判断环境变量是否存在python中os.envi
Pyecharts数据可视化大屏:打造沉浸式数据分析体验
我的运维人生
信息可视化 数据分析 数据挖掘 运维开发 技术共享
Pyecharts数据可视化大屏:打造沉浸式数据分析体验在当今这个数据驱动的时代,如何将海量数据以直观、生动的方式展现出来,成为了数据分析师和企业决策者关注的焦点。Pyecharts,作为一款基于Python的开源数据可视化库,凭借其丰富的图表类型、灵活的配置选项以及高度的定制化能力,成为了构建数据可视化大屏的理想选择。本文将深入探讨如何利用Pyecharts打造数据可视化大屏,并通过实际代码案例
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
python os.environ_python os.environ 读取和设置环境变量
weixin_39605414
python os.environ
>>>importos>>>os.environ.keys()['LC_NUMERIC','GOPATH','GOROOT','GOBIN','LESSOPEN','SSH_CLIENT','LOGNAME','USER','HOME','LC_PAPER','PATH','DISPLAY','LANG','TERM','SHELL','J2REDIR','LC_MONETARY','QT_QPA
四章-32-点要素的聚合
彩云飘过
本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers5.3.xapi。源码见1032.html,对应的官网示例https://openlayers.org/en/latest/examples/cluster.htmlhttps://openlayers.org/en/latest/examples/earthquake-clusters.
DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理
STU学生网页设计
网页设计 期末网页作业 html静态网页 html5期末大作业 网页设计 web大作业
️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程
【华为OD机试真题2023B卷 JAVA&JS】We Are A Team
若博豆
java 算法 华为 javascript
华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代
使用Faiss进行高效相似度搜索
llzwxh888
faiss python
在现代AI应用中,快速和高效的相似度搜索是至关重要的。Faiss(FacebookAISimilaritySearch)是一个专门用于快速相似度搜索和聚类的库,特别适用于高维向量。本文将介绍如何使用Faiss来进行相似度搜索,并结合Python代码演示其基本用法。什么是Faiss?Faiss是一个由FacebookAIResearch团队开发的开源库,主要用于高维向量的相似性搜索和聚类。Faiss
python是什么意思中文-在python中%是什么意思
编程大乐趣
Python中%有两种:1、数值运算:%代表取模,返回除法的余数。如:>>>7%212、%操作符(字符串格式化,stringformatting),说明如下:%[(name)][flags][width].[precision]typecode(name)为命名flags可以有+,-,''或0。+表示右对齐。-表示左对齐。''为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填
使用Apify加载Twitter消息以进行微调的完整指南
nseejrukjhad
twitter easyui 前端 python
#使用Apify加载Twitter消息以进行微调的完整指南##引言在自然语言处理领域,微调模型以适应特定任务是提升模型性能的常见方法。本文将介绍如何使用Apify从Twitter导出聊天信息,以便进一步进行微调。##主要内容###使用Apify导出推文首先,我们需要从Twitter导出推文。Apify可以帮助我们做到这一点。通过Apify的强大功能,我们可以批量抓取和导出数据,适用于各类应用场景。
关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript
二挡起步
web前端期末大作业 javascript html css 旅游 风景
⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip
HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动
二挡起步
web前端期末大作业 web设计网页规划与设计 html css javascript dreamweaver 前端
Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线
Day1笔记-Python简介&标识符和关键字&输入输出
~在杰难逃~
Python python 开发语言 大数据 数据分析 数据挖掘
大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程
python八股文面试题分享及解析(1)
Shawn________
python
#1.'''a=1b=2不用中间变量交换a和b'''#1.a=1b=2a,b=b,aprint(a)print(b)结果:21#2.ll=[]foriinrange(3):ll.append({'num':i})print(11)结果:#[{'num':0},{'num':1},{'num':2}]#3.kk=[]a={'num':0}foriinrange(3):#0,12#可变类型,不仅仅改变
每日算法&面试题,大厂特训二十八天——第二十天(树)
肥学
⚡算法题⚡面试题每日精进 java 算法 数据结构
目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章
Python快速入门 —— 第三节:类与对象
孤华暗香
Python快速入门 python 开发语言
第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name
libyuv之linux编译
jaronho
Linux linux 运维 服务器
文章目录一、下载源码二、编译源码三、注意事项1、银河麒麟系统(aarch64)(1)解决armv8-a+dotprod+i8mm指令集支持问题(2)解决armv9-a+sve2指令集支持问题一、下载源码到GitHub网站下载https://github.com/lemenkov/libyuv源码,或者用直接用git克隆到本地,如:gitclonehttps://github.com/lemenko
pyecharts——绘制柱形图折线图
2224070247
信息可视化 python java 数据可视化
一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据
node.js学习
小猿L
node.js node.js 学习 vim
node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行
Python 实现图片裁剪(附代码) | Python工具
剑客阿良_ALiang
前言本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章:windowsffmpeg安装部署_阿良的博客-CSDN博客本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。ffmpy安装:pipinstallffmpy-ihttps://pypi.douban.com/simple代码不废话了,上代码
【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
【华为OD技术面试真题 - 技术面】-测试八股文真题题库(1)
算法大师
华为od 面试 python 算法 前端
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选1.黑盒测试和白盒测试的区别2.假设我们公司现在开发一个类似于微信的软件1.0版本,现在要你测试这个功能:打开聊天窗口,输入文本,限制字数在200字以内。问你怎么提取测试点。功能测试性能测试安全性测试可用性测试跨平台兼容性测试网络环境测试3.接口测试的工具你了解哪些
数据仓库——维度表一致性
墨染丶eye
背诵 数据仓库
数据仓库基础笔记思维导图已经整理完毕,完整连接为:数据仓库基础知识笔记思维导图维度一致性问题从逻辑层面来看,当一系列星型模型共享一组公共维度时,所涉及的维度称为一致性维度。当维度表存在不一致时,短期的成功难以弥补长期的错误。维度时确保不同过程中信息集成起来实现横向钻取货活动的关键。造成横向钻取失败的原因维度结构的差别,因为维度的差别,分析工作涉及的领域从简单到复杂,但是都是通过复杂的报表来弥补设计
java Illegal overloaded getter method with ambiguous type for propert的解决
zwllxs
java jdk
好久不来iteye,今天又来看看,哈哈,今天碰到在编码时,反射中会抛出
Illegal overloaded getter method with ambiguous type for propert这么个东东,从字面意思看,是反射在获取getter时迷惑了,然后回想起java在boolean值在生成getter时,分别有is和getter,也许我们的反射对象中就有is开头的方法迷惑了jdk,
IT人应当知道的10个行业小内幕
beijingjava
工作 互联网
10. 虽然IT业的薪酬比其他很多行业要好,但有公司因此视你为其“佣人”。
尽管IT人士的薪水没有互联网泡沫之前要好,但和其他行业人士比较,IT人的薪资还算好点。在接下的几十年中,科技在商业和社会发展中所占分量会一直增加,所以我们完全有理由相信,IT专业人才的需求量也不会减少。
然而,正因为IT人士的薪水普遍较高,所以有些公司认为给了你这么多钱,就把你看成是公司的“佣人”,拥有你的支配
java 实现自定义链表
CrazyMizzz
java 数据结构
1.链表结构
链表是链式的结构
2.链表的组成
链表是由头节点,中间节点和尾节点组成
节点是由两个部分组成:
1.数据域
2.引用域
3.链表的实现
&nbs
web项目发布到服务器后图片过一会儿消失
麦田的设计者
struts2 上传图片 永久保存
作为一名学习了android和j2ee的程序员,我们必须要意识到,客服端和服务器端的交互是很有必要的,比如你用eclipse写了一个web工程,并且发布到了服务器(tomcat)上,这时你在webapps目录下看到了你发布的web工程,你可以打开电脑的浏览器输入http://localhost:8080/工程/路径访问里面的资源。但是,有时你会突然的发现之前用struts2上传的图片
CodeIgniter框架Cart类 name 不能设置中文的解决方法
IT独行者
CodeIgniter Cart 框架
今天试用了一下CodeIgniter的Cart类时遇到了个小问题,发现当name的值为中文时,就写入不了session。在这里特别提醒一下。 在CI手册里也有说明,如下:
$data = array(
'id' => 'sku_123ABC',
'qty' => 1,
'
linux回收站
_wy_
linux 回收站
今天一不小心在ubuntu下把一个文件移动到了回收站,我并不想删,手误了。我急忙到Nautilus下的回收站中准备恢复它,但是里面居然什么都没有。 后来我发现这是由于我删文件的地方不在HOME所在的分区,而是在另一个独立的Linux分区下,这是我专门用于开发的分区。而我删除的东东在分区根目录下的.Trash-1000/file目录下,相关的删除信息(删除时间和文件所在
jquery回到页面顶端
知了ing
html jquery css
html代码:
<h1 id="anchor">页面标题</h1>
<div id="container">页面内容</div>
<p><a href="#anchor" class="topLink">回到顶端</a><
B树、B-树、B+树、B*树
矮蛋蛋
B树
原文地址:
http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
B树
即二叉搜索树:
1.所有非叶子结点至多拥有两个儿子(Left和Right);
&nb
数据库连接池
alafqq
数据库连接池
http://www.cnblogs.com/xdp-gacl/p/4002804.html
@Anthor:孤傲苍狼
数据库连接池
用MySQLv5版本的数据库驱动没有问题,使用MySQLv6和Oracle的数据库驱动时候报如下错误:
java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connec
java泛型
百合不是茶
java泛型
泛型
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,任意化的缺点就是要实行强制转换,这种强制转换可能会带来不安全的隐患
泛型的特点:消除强制转换 确保类型安全 向后兼容
简单泛型的定义:
泛型:就是在类中将其模糊化,在创建对象的时候再具体定义
class fan
javascript闭包[两个小测试例子]
bijian1013
JavaScript JavaScript
一.程序一
<script>
var name = "The Window";
var Object_a = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
探索JUnit4扩展:假设机制(Assumption)
bijian1013
java Assumption JUnit 单元测试
一.假设机制(Assumption)概述 理想情况下,写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方,但是有的时候,这些导致测试用例不通过的地方并不是很容易的被发现,可能隐藏得很深,从而导致开发人员在写测试用例时很难预测到这些因素,而且往往这些因素并不是开发人员当初设计测试用例时真正目的,
【Gson四】范型POJO的反序列化
bit1129
POJO
在下面这个例子中,POJO(Data类)是一个范型类,在Tests中,指定范型类为PieceData,POJO初始化完成后,通过
String str = new Gson().toJson(data);
得到范型化的POJO序列化得到的JSON串,然后将这个JSON串反序列化为POJO
import com.google.gson.Gson;
import java.
【Spark八十五】Spark Streaming分析结果落地到MySQL
bit1129
Stream
几点总结:
1. DStream.foreachRDD是一个Output Operation,类似于RDD的action,会触发Job的提交。DStream.foreachRDD是数据落地很常用的方法
2. 获取MySQL Connection的操作应该放在foreachRDD的参数(是一个RDD[T]=>Unit的函数类型),这样,当foreachRDD方法在每个Worker上执行时,
NGINX + LUA实现复杂的控制
ronin47
nginx lua
安装lua_nginx_module 模块
lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty
Centos和debian的安装就简单了。。
这里说下freebsd的安装:
fetch http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
ma
java-递归判断数组是否升序
bylijinnan
java
public class IsAccendListRecursive {
/*递归判断数组是否升序
* if a Integer array is ascending,return true
* use recursion
*/
public static void main(String[] args){
IsAccendListRecursiv
Netty源码学习-DefaultChannelPipeline2
bylijinnan
java netty
Netty3的API
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelPipeline.html
里面提到ChannelPipeline的一个“pitfall”:
如果ChannelPipeline只有一个handler(假设为handlerA)且希望用另一handler(假设为handlerB)
来
Java工具之JPS
chinrui
java
JPS使用
熟悉Linux的朋友们都知道,Linux下有一个常用的命令叫做ps(Process Status),是用来查看Linux环境下进程信息的。同样的,在Java Virtual Machine里面也提供了类似的工具供广大Java开发人员使用,它就是jps(Java Process Status),它可以用来
window.print分页打印
ctrain
window
function init() {
var tt = document.getElementById("tt");
var childNodes = tt.childNodes[0].childNodes;
var level = 0;
for (var i = 0; i < childNodes.length; i++) {
安装hadoop时 执行jps命令Error occurred during initialization of VM
daizj
jdk hadoop jps
在安装hadoop时,执行JPS出现下面错误
[slave16]
[email protected] :/tmp/hsperfdata_hdfs# jps
Error occurred during initialization of VM
java.lang.Error: Properties init: Could not determine current working
PHP开发大型项目的一点经验
dcj3sjt126com
PHP 重构
一、变量 最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候。变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆。变量的命名尽量规范化,不要与PHP中的关键字相冲突。 二、函数 PHP自带了很多函数,这给我们程序的编写带来了很多的方便。当然,在大型程序中我们往往自己要定义许多个函数,几十
android笔记之--向网络发送GET/POST请求参数
dcj3sjt126com
android
使用GET方法发送请求
private static boolean sendGETRequest (String path,
Map<String, String> params) throws Exception{
//发送地http://192.168.100.91:8080/videoServi
linux复习笔记 之bash shell (3) 通配符
eksliang
linux 通配符 linux通配符
转载请出自出处:
http://eksliang.iteye.com/blog/2104387
在bash的操作环境中有一个非常有用的功能,那就是通配符。
下面列出一些常用的通配符,如下表所示 符号 意义 * 万用字符,代表0个到无穷个任意字符 ? 万用字符,代表一定有一个任意字符 [] 代表一定有一个在中括号内的字符。例如:[abcd]代表一定有一个字符,可能是a、b、c
Android关于短信加密
gqdy365
android
关于Android短信加密功能,我初步了解的如下(只在Android应用层试验):
1、因为Android有短信收发接口,可以调用接口完成短信收发;
发送过程:APP(基于短信应用修改)接受用户输入号码、内容——>APP对短信内容加密——>调用短信发送方法Sm
asp.net在网站根目录下创建文件夹
hvt
.net C# hovertree asp.net Web Forms
假设要在asp.net网站的根目录下建立文件夹hovertree,C#代码如下:
string m_keleyiFolderName = Server.MapPath("/hovertree");
if (Directory.Exists(m_keleyiFolderName))
{
//文件夹已经存在
return;
}
else
{
try
{
D
一个合格的程序员应该读过哪些书
justjavac
程序员 书籍
编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的?
“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西。”
很多程序员响应,他们在推荐时也写下自己的评语。 以前就有国内网友介绍这个程序员书单,不过都是推荐数
单实例实践
跑龙套_az
单例
1、内部类
public class Singleton {
private static class SingletonHolder {
public static Singleton singleton = new Singleton();
}
public Singleton getRes
PO VO BEAN 理解
q137681467
VO DTO po
PO:
全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录。 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
BO:
全称是 business object:业务对象 主要作用是把业务逻辑封装为一个对象。这个对
战胜惰性,暗自努力
金笛子
努力
偶然看到一句很贴近生活的话:“别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得吊儿郎当,和你一样会抱怨,而只有你自己相信这些都是真的,最后也只有你一人继续不思进取。”很多句子总在不经意中就会戳中一部分人的软肋,我想我们每个人的周围总是有那么些表现得“吊儿郎当”的存在,是否你就真的相信他们如此不思进取,而开始放松了对自己的要求随波逐流呢?
我有个朋友是搞技术的,平时嘻嘻哈哈,以
NDK/JNI二维数组多维数组传递
wenzongliang
二维数组 jni NDK
多维数组和对象数组一样处理,例如二维数组里的每个元素还是一个数组 用jArray表示,直到数组变为一维的,且里面元素为基本类型,去获得一维数组指针。给大家提供个例子。已经测试通过。
Java_cn_wzl_FiveChessView_checkWin( JNIEnv* env,jobject thiz,jobjectArray qizidata)
{
jint i,j;
int s