[2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
解决方法:在命令行中运行
redis-cli.exe
127.0.0.1:6379>shutdown
not connected>exit
然后重新运行redis-server.exe redis.windows.conf,启动成功!
一、搜索引擎工作原理
搜索引擎的工作分为三个节点,即爬行,索引,和检索
1、爬行
搜索引擎具有网路爬虫或蜘蛛来执行爬网,每次抓取工具访问网页时,它都会复制该网页并将其网址添加到索引中。
在 “蜘蛛” 抓取网页内容,提炼关键词的这个过程共,就存在一个问题: “蜘蛛” 能否看懂。如果网站内容是 flash 和 js ,那么她是看不懂的。相应的如果网站内容是其他语言,那么她便能看懂,她的语言即SEO2、索引
此阶段,爬网程序会创建搜索引擎的索引。索引就像一本巨大的书,其中包含爬虫找到的每个网页的副本。如果任何网页发生更改,则抓取工具会使用新内容更新图书。3、检索
这是搜索引擎以特定顺序提供最有用和最相关答案的最后阶段二 、SEO 简介
全称:Search English Optimization,搜索引擎优化,即为了提升网页在搜索引擎自然搜索结果中的收录数量以及排序位置而做的优化。
1、SEO 的分类
2、白帽SEO 的使用
通过网站的结构布局设计和网页代码优化,使前端页面既能让浏览器用户能够看懂,也能让“蜘蛛”看懂
1、网站结构布局优化
<img src="" alt="" title="">
其次,在每一个网页上应该加上面包屑导航
对用户而言,可以让用户了解当前所处的位置,形成更好的位置感,并方便用户操作;
对蜘蛛而言,能够清楚的了解网站结构,同时还增加了大量的内部链接,方便抓取,降低跳出率。
2、网页代码优化
(1) title
标题,强调重点即可,尽量做到每个页面的
<title>英雄联盟全新官方网站-腾讯游戏</title>
(2) meta keywords
关键词,列举出几个页面的重要关键字即可
<meta name="Keywords" content="英雄联盟,lol,lol新手礼包,lol攻略,lol视频,lol视频攻略,英雄资料,英雄联盟战争学院,明星解说视频,101战争学院,英雄,攻略,WCG,点亮图标,赛事">
(3) meta description
网页描述,高度概括网页内容的关键词,每个页面也要有所不同
<meta name="Description" content="英雄联盟官方网站,海量风格各异的英雄,丰富、便捷的物品合成系统,游戏内置的匹配、排行和竞技系统,独创的“召唤师”系统及技能、符文、天赋等系统组合,必将带你进入一个崭新而又丰富多彩的游戏世界。">
(4) 标签语义化
比如:h1-h6是用于标题类的,<nav>标签是用来设置页面主导航的等
(5) a 标签
页内链接,要加“title” 属性加以说明,让访客和 “蜘蛛” 知道;
外部链接,链接到其他网站的,则需要加上 el="nofollow" 属性,避免“蜘蛛”爬了外部链接之后,就不回了
(6) 正文标题要用 h1 标签:
“蜘蛛” 认为它最重要,若不喜欢<h1>的默认样式可以通过CSS设置
(7) br
<p>
第一行文字<br/>
第二行文字<br/>
第三行文字
</p>
(8) caption
表格应该使用 <caption> 表格标题标签
(9) img 应使用 “alt” 属性加以说明
(10) strong 和 em : 需要强调时使用
<strong>标签在搜索引擎中能突出关键词
<em>标签强调效果仅次于 <strong>
而 <b>、<i>标签: 只是用于显示效果时使用,在 SEO 中不起效果
(11) 避免使用 和 ©
空格符 应用 CSS 进行设置
版权符 © 可以直接使用输入法打“©”
(12) 少用 iframe 框架,因为“蜘蛛”一般不会读取其中的内容
(13) 少用 display: none;
对于不想显示的文字内容,应当设置 z-index 或设置到浏览器显示器之外。因为搜索引擎会过滤掉 display:none 中的内容
作为seo工作人员,搜索引擎运行原理是必须要了解的,包括页面质量白皮书、搜索引擎优化指南,今天重点解读下搜索引擎整个工作原理过程分析。搜索引擎的主要工作过程包括:抓取、存储、页面分析、索引、检索等几个主要过程。也就是常说的抓取、过滤、收录、排序四个过程,下面详解的讲解每个过程,及有哪些影响一、搜索引擎抓取Spider抓取系统是搜索引擎数据来源的重要保证,如果把web理解为一个有向图,那么spider的工作过程可以认为是对这个有向图的遍历。从一些重要的种子 URL开始,通过页面上的超链接关系,不断的发现新URL并抓取,尽最大可能抓取到更多的有价值网页。
搜索引擎工作原理解读影响抓取的因素1、抓取友好性互联网资源庞大的数量级,这就要求抓取系统尽可能的高效利用带宽,在有限的硬件和带宽资源下尽可能多的抓取到有价值资源。2、用抓取返回码示意简单介绍几种百度支持的返回码:1)最常见的404代表“NOT FOUND”,认为网页已经失效,通常将在库中删除,同时短期内如果spider再次发现这条url也不会抓取;2)503代表“Service Unavailable”,认为网页临时不可访问,通常网站临时关闭,带宽有限等会产生这种情况。3)403代表“Forbidden”,认为网页目前禁止访问。如果是新url,spider暂时不抓取,短期内同样会反复访问几次;如果是已收录url,不会直接删除,短期内同样反复访问几次。如果网页正常访问,则正常抓取;如果仍然禁止访问,那么这条url也会被认为是失效链接,从库中删除。4)301代表是“Moved Permanently”,认为网页重定向至新url。当遇到站点迁移、域名更换、站点改版的情况时,我们推荐使用301返回码,同时使用站长平台网站改版工具,以减少改版对网站流量造成的损失。3、取优先级调配由于互联网资源规模的巨大以及迅速的变化,对于搜索引擎来说全部抓取到并合理的更新保持一致性几乎是不可能的事情,因此这就要求抓取系统设计一套合理的抓取优先级调配策略。主要包括:深度优先遍历策略、宽度优先遍历策略、pr优先策略、反链策略、社会化分享指导策略等等4、取反作弊spider在抓取过程中往往会遇到所谓抓取黑洞或者面临大量低质量页面的困扰,这就要求抓取系统中同样需要设计一套完善的抓取反作弊系统
百度搜索引擎工作原理对于网站抓取频次的断断原则1,网站更新频率:更新快多来,更新慢少来,直接影响Baiduspider的来访频率2,网站更新质量:更新频率提高了,仅仅是吸引了Baiduspier的注意,Baiduspider对质量是有严格要求的,如果网站每天更新出的大量内容都被Baiduspider判定为低质页面,依然没有意义。3,连通度:网站应该安全稳定、对Baiduspider保持畅通,经常给Baiduspider吃闭门羹可不是好事情4,站点评价:百度搜索引擎对每个站点都会有一个评价,且这个评价会根据站点情况不断变化,是百度搜索引擎对站点的一个基础打分二、搜索引擎过滤垃圾内容1, 重复内容的网页:互联网上已有的内容,百度必然没有必要再收录。2, 主体内容空短的网页1)有些内容使用了百度spider无法解析的技术,如JS、AJAX等,虽然用户访问能看到丰富的内容,依然会被搜索引擎抛弃2)加载速度过慢的网页,也有可能被当作空短页面处理,注意广告加载时间算在网页整体加载时间内。3)很多主体不突出的网页即使被抓取回来也会在这个环节被抛弃。3, 部分作弊网页4,各种过滤,举例可能包含过滤掉死链、重复数据、色情、垃圾结果以及你懂的;
搜索引擎蜘蛛工作原理三、如何更好的被收录,建立索引哪些网页可以进入优质索引库呢。其实总的原则就是一个:对用户的价值。包括却不仅于:1,有时效性且有价值的页面:在这里,时效性和价值是并列关系,缺一不可。有些站点为了产生时效性内容页面做了大量采集工作,产生了一堆无价值面页,也是百度不愿看到的.2,内容优质的专题页面:专题页面的内容不一定完全是原创的,即可以很好地把各方内容整合在一起,或者增加一些新鲜的内容,比如观点和评论,给用户更丰富全面的内容。3,高价值原创内容页面:百度把原创定义为花费一定成本、大量经验积累提取后形成的文章。千万不要再问我们伪原创是不是原创。4,重要个人页面:这里仅举一个例子,科比在新浪微博开户了,即使他不经常更新,但对于百度来说,它仍然是一个极重要的页面。
百度搜索引擎蜘蛛四、百度搜索引擎排序影响因素1,相关性:网页内容与用户检索需求的匹配程度,比如网页包含的用户检查关键词的个数,以及这些关键词出现的位置;外部网页指向该页面所用的锚文本等2,权威性:用户喜欢有一定权威性网站提供的内容,相应的,百度搜索引擎也更相信优质权威站点提供的内容。3,时效性:时效性结果指的是新出现的网页,且网页内承载了新鲜的内容。目前时效性结果在搜索引擎中日趋重要。4,重要性:网页内容与用户检查需求匹配的重要程度或受欢迎程度5,丰富度:丰富度看似简单却是一个覆盖范围非常广的命题。可以理解为网页内容丰富,可以完全满足用户需求;不仅可以满足用户单一需求,还可以满足用户的延展需求。6,受欢迎程度:指该网页是不是受欢迎。7、终排序,将最能满足用户需求的结果排序在最前,可能包括的有用信息如:网站的整体评价、网页质量、内容质量、资源质量、匹配程度、分散度、时效性等总结:这整个过程就是搜索引擎抓取到排名结果页的计算过程,当然其中影响排名的因素还有很多,这个是网页分析技术,但网站的总体得分是由每个网页组成,所以说要做好每个网页的细节优化,做好用户用户体验,提升网站排名。互联互通社区互联互通社区专注于IT互联网交流与学习,关注公众号:互联互通社区,每日获取最新报告并附带专题内容辅助学习。方案打造与宣讲、架构设计与执行、技术攻坚与培训、数据中台等技术咨询与服务合作请+微信:hulianhutongshequ
搜索引擎系统的工作流程分为四步,从网上抓取网页,建立索引数据库,根据用户的关键词在索引数据库中进行搜索,对搜索结果进行相关度排序处理。它主要由网络爬虫、索引器和检索器三部分组成。网络爬虫,英文名称Web Spider,它的主要功能是从指定的IP出发,便利整个互联网中所存在的网页,它可以借助网页中的URL爬到其他网页中去,不停的对这个过程进行重复,将爬过的网页搜集起来并存储到页面存储库中去。Indexer,索引器,它的主要功能是将Web Spider收集回来的网页进行分析,提取网页中所含的信息,并按照相关度进行计算,将这些相关信息建立完整的网页索引数据库。Searcher,检索器,用户输入关键词进行搜索,它负责对关键词进行分解,根据搜索器从网页索引数据库中查询到相关度较高的网页,对其进行排序处理,然后交给系统,系统会把结果进行组织处理,反馈给用户。搜索引擎对于文件的存储要求较高,操作系统又有自身的缺陷,在大型文件的管理方面存在诸多局限,这就需要搜索引擎自行定义和管理大型文件系统。大型文件是一种跨多文件系统的虚拟文件,支持64位寻址方式,可自动处理多文件系统的分配和寻址。
在进行软件开发前期,我们需要进行Python开发环境的搭建,需要Python程序开发包:Python3.6 ,开发IDE:JetBrains PyCharm2017.1,结巴中文分词包:jieba,网页实现框架:Flask,实现HTTP的第三方库requests。后面第三节会对本搜索引擎所用到的相关技术进行介绍,包括爬虫技术,结巴分词,向量空间模型,BM25算法等
一、系统架构设计
搜索引擎有基本的五大模块,分别是信息采集,信息处理,建立索引,查询和 web 交互。本次系统设计的目的是的是如何在信息处理分析的基础上,建立一个完整的中文搜索引擎。所以该系统主要由以下几个详细部分组成:爬取数据,中文分词,相关度排序,建立索引库,建立查询服务器,建立web交互。
网络爬虫部分前文已经讲过,在此不再赘述,在此直接使用中国地质大学的课程设计文件,即对某文献库的爬取结果做分词排序与查询。
二、结巴分词与建立索引
1、结巴分词简介
jieba 是一个基于Python的中文分词工具对于一长段文字,其分词原理大体可分为三步:
1.首先用正则表达式将中文段落粗略的分成一个个句子。
2.将每个句子构造成有向无环图,之后寻找最佳切分方案。
3.最后对于连续的单字,采用HMM模型将其再次划分。
jieba分词分为“默认模式”(cut_all=False),“全模式”(cut_all=True)以及搜索引擎模式。对于“默认模式”,又可以选择是否使用 HMM 模型(HMM=True,HMM=False)。
2、倒排索引
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
倒排索引有两种不同的反向索引形式:
一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
一个单词的水平反向索引(完全反向索引)又包含每个单词在一个文档中的位置。
后者的形式提供了更多的兼容性(比如短语搜索),但是需要更多的时间和空间来创建。
通过上面的定义可以知道,一个倒排索引包含一个单词词典和一个倒排文件。其中单词词典包含了所有粒度的拆分词;倒排文件则保存了该词对应的所有相关信息。
3、代码实现
1)读取爬虫文件夹下所有文件名,并保存为doc_list。def index_writer(self): path="answer/C3-Art" self.doc_list=os.listdir(path) self.index()
(2)读取文件内容并用jieba分词,分词内容保存为term_list,方便接下来进行建立倒序索引表。其中,inverted为记录词所在文档及词频,idf为词的逆文档频率。
for i in range(len(self.doc_list)): print(self.doc_list[i]) with open("answer/C3-Art/"+self.doc_list[i],"r",encoding='gb18030', errors='ignore') as f: data=f.read() term_list = jieba.lcut_for_search(data)
(3)对分词结果进行倒序索引
for j in term_list: if j in self.inverted: if i not in self.inverted[j]: self.inverted[j][i]=1 else: self.inverted[j][i]+=1 else: self.inverted[j]={i:1} for t in self.inverted: self.idf[t]=math.log10(doc_num/len(self.inverted[t]))
(4)完整代码呈现:
import jieba import os import math class Indexer: inverted = {} # 记录词所在文档及词频 idf = {} # 词的逆文档频率 def __init__(self): self.doc_list=[] self.index_writer() def index_writer(self): path="answer/C3-Art" self.doc_list=os.listdir(path) self.index() def index(self): doc_num=len(self.doc_list) for i in range(len(self.doc_list)): print(self.doc_list[i]) with open("answer/C3-Art/"+self.doc_list[i],"r",encoding='gb18030', errors='ignore') as f: data=f.read() term_list = jieba.lcut_for_search(data) for j in term_list: if j in self.inverted: if i not in self.inverted[j]: self.inverted[j][i]=1 else: self.inverted[j][i]+=1 else: self.inverted[j]={i:1} for t in self.inverted: self.idf[t]=math.log10(doc_num/len(self.inverted[t])) print("inverted terms:%d"% len(self.inverted)) print("index done") index=Indexer()
三、向量空间模型
1、向量空间模型原理
向量空间模型(vector space model)概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,直观易懂。当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。
搜索引擎需要计算“用户查询”和爬下来的众多”网页“之间的相似度,从而把最相似的排在最前返回给用户。
2、BM25算法原理
BM25 是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法。BM25属于bag-of-words模型,bag-of-words模型只考虑document中词频,不考虑句子结构或者语法关系之类,把document当做装words的袋子,具体袋子里面可以是杂乱无章的。对每一个搜索查询,我们很容易给每个文档定义一个“相关分数”。当用户进行搜索时,我们可以使用相关分数进行排序而不是使用文档出现时间来进行排序。这样,最相关的文档将排在第一个,无论它是多久之前创建的(当然,有的时候和文档的创建时间也是有关的)。
我们要从最简单的、基于统计的方法说起。这种方法不需要理解语言本身,而是通过统计词语的使用、匹配和基于文档中特有词的普及率的权重等情况来决定“相关分数”。
这个算法不关心词语是名词还是动词,也不关心词语的意义。它唯一关心的是哪些是常用词,那些是稀有词。如果一个搜索语句中包括常用词和稀有词,最好让包含稀有词的文档的评分高一些,同时降低常用词的权重。
3、代码实现
(1)对搜索词进行结巴分词term_list=[] query=query.split() for i in query: term_list.extend(jieba.cut_for_search(i))
(2)计算tf-idf,找出候选doc
tf_idf={} for i in term_list: if i in self.index.inverted: for doc_id,idf in self.index.inverted[i].items(): if doc_id in tf_idf: tf_idf[doc_id]+=(1+math.log10(idf))*self.index.idf[i] else: tf_idf[doc_id]=(1+math.log10(idf))*self.index.idf[i]
(3)对候选doc进行排序
sorted_doc=sorted(tf_idf.items(),key=operator.itemgetter(1),reverse=True) res=[self.index.doc_id[id_doc]for id_doc,score in sorted_doc]
(4)完整代码呈现
from index import Indexer import jieba import math import operator class Searcher: def __init__(self,index:Indexer): self.index=index def search(self,query:str): term_list=[] query=query.split() for i in query: term_list.extend(jieba.cut_for_search(i)) tf_idf={} for i in term_list: if i in self.index.inverted: for doc_id,idf in self.index.inverted[i].items(): if doc_id in tf_idf: tf_idf[doc_id]+=(1+math.log10(idf))*self.index.idf[i] else: tf_idf[doc_id]=(1+math.log10(idf))*self.index.idf[i] sorted_doc=sorted(tf_idf.items(),key=operator.itemgetter(1),reverse=True) res=[self.index.doc_id[id_doc]for id_doc,score in sorted_doc] return res index=Indexer() search=Searcher(index) print(search.search("中华民族的伟大成就"))
四、网页框架
1、Flask简介
Flask 是一个 Python 实现的 Web 开发微框架。基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
2、代码实现from flask import Flask, redirect, url_for, request, render_template from index import Indexer from BM25 import Searcher import jieba app = Flask(__name__) #@app.route('/success/<name>') @app.route('/<name>') def success(name): docs = searcher.search(name) terms = list(jieba.cut_for_search(name)) reslut=highlight(docs,terms) #return render_template('test.html') print(reslut) return render_template('search.html', docs=reslut, value=name, length=len(docs)) #return data @app.route('/login',methods = ['POST', 'GET']) def login(): if request.method == 'POST': user = request.form['nm'] return redirect(url_for('success',name = user)) else: user = request.args.get('nm') return redirect(url_for('success',name = user)) def highlight(docs, terms): result = [] print() content="" title='' len_1=0 for doc in docs: result.append([]) with open("answer/C4-Literature/" + doc, "r", encoding='gb18030', errors='ignore') as f: data = f.read() #print(lines) for term in terms: #print(term) num1=data.find(term) content=data[num1-50:num1+50] #content = content.replace(term, '<em><font color="red">{}</font></em>'.format(term)) for i in range(3): if i==0: result[len_1].append(doc) elif i==1: result[len_1].append(content) elif i==2: with open("answer/C4-Literature/" + doc, "r", encoding='gb18030', errors='ignore') as f: #lines=f.readline() #print(lines) for i in f: print("!!!!!!!!!!!!") print(i) if "【 标 题 】" in i: print(i) title=i result[len_1].append(title) len_1=len_1+1 return result index = Indexer() searcher = Searcher(index) if __name__ == '__main__': app.run(debug = True)
3、Web设计
超文本标记语言(标准通用标记语言下的一个应用,外语缩写HTML),是迄今为止网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。
4、代码实现
1、login.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body background="image.jpeg"> <form action = "http://localhost:5000/login" method = "get"> <p align="center" size="3" color="red"> 搜索引擎设计:</p> <p align="center"> <input type = "text" name = "nm" /> </p> <p align="center"><input type = "submit" value = "搜索" /></p> </form> </body> </html>
2、Search.html
<!doctype html> <html ng-app="app"> <head> <meta charset="UTF-8"> <title>搜索</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"> </head> <body ng-controller="ctrl"> <div class="container"> <br> <br> <form action = "http://localhost:5000/login" method = "post"> <div class="form-group"> <input type="text" style="height: 40px; width: 360px;" class="form-control" ng-model="query" value="{{ value }}" name="query" id="query"/> </div> <input class="btn btn-small btn-success" role="button" type="submit" value="搜一下" id="btn"> </form> <br> <br>共有{{ length }}条结果 <br> <div id="box"> {% for doc in docs %} <p>{{ doc[2]|safe }}</p> <p>摘要: {{ doc[1]|safe }}</p> <p>来源:{{ doc[0] }}</p> <br> {% endfor %} </div> </div> </body> </html>
五、成果展示
因为工作需要,我准备在win7 x64系统上基于springboot +elasticsearch+redis搭建全文索引服务器。
1. elasticsearch安装比较方便,直接去官网下载了elasticsearch 6.2.4 的msi安装包,安装过程中配置集群信息,并将路径添加到环境变量,同时将elasticsearch添加到系统服务中。这个都是在安装过程中配置的。顺便还有data目录,conf目录,logs目录等。我把elasticsearch安装到C盘,而将data目录等3个目录放到了H盘。
为了保证能识别127.0.0.1是localhost,要保证hosts文件中有一行为:
127.0.0.1 localhost
下面直接贴配置信息:
# elasticsearch.yml bootstrap.memory_lock: false cluster.name: oldkingESCluster http.port: 9200 network.host: 127.0.0.1 node.data: true node.ingest: true node.master: true node.max_local_storage_nodes: 1 node.name: okT400 path.data: H:\ElasticSearch\data path.logs: H:\ElasticSearch\logs transport.tcp.port: 9300
#jvm.options -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=${ES_TMPDIR} -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -Xms1024m
直接去安装路径启动elasticsearch即可。
至于elasticsearch-head插件,可以去elasticsearch-head的GitHub上看它的readme。可以直接从chrome的商店里面找到head插件,直接安装就可以啦。
启动elasticsearch后,点chrome上的head插件,发现elasticsearch启动了:
elasticsearch-head插件的作用基本就是elasticsearch的管理,平时也基本用不上。
注意:elasticsearch安装过程中会推荐一堆插件,看着挺有用的,但是你无法选中,选中就会出现无法联网的情况,所以我最后都没有安装它推荐的那些插件,包括x-package和其他的。
2. 安装redis
直接去GitHub上下载redis的msi版安装。
安装比较简单,一路就下去了,其余的就是配置。
(1)配置redis.window.conf
maxmemory 1024000000 requirepass redis #一定要顶头写
(2)添加到系统服务中:redis-server.exe redis.windows.conf
(3)出错解决方法
Redis第一次启动报错:
[2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
解决方法:在命令行中运行
redis-cli.exe
127.0.0.1:6379>shutdown
not connected>exit
然后重新运行redis-server.exe redis.windows.conf,启动成功!
添加系统服务错误:
[12820] 06 Sep 11:00:26.431 # HandleServiceCommands: system error caught. error code=1073, message = CreateService failed: unknown error
原因:系统服务中已经存在解决办法:1)先卸载服务:redis-server --service-uninstall2)然后再安装:redis-server--service-install redis.windows.conf启停:启动服务:redis-server --service-start停止服务:redis-server --service-stop
3. 查看redis中的数据
下载青格软件的TreeNMS来管理redis,这里我给出csdn的下载链接。
登录后,点击右上角“参数配置”按钮,新增或修改连接参数,我们这里要添加密码(因为我们设置了redis的密码)测试连接成功后,保存参数并刷新页面即可。
4. 编译爬取IT之家的热评的代码
这个源码,我会给出csdn上的下载链接。
这个工程还依赖mysql,所以需要安装mysql并设置密码,这里设置的用户名密码是root和mysql。如果设置成其他的,可以在工程中修改。
除此之外,我们贴出配置文件,这里主要是elasticsearch和redis的配置:
#application.yml #端口号 server: port: 8081 spring: data: ##elasticsearch配置 elasticsearch: cluster-name: oldkingESCluster cluster-nodes: localhost:9300 ##redis配置 redis: database: 0 host: localhost port: 6379 password: redis pool: max-active: 15 max-wait: 1 max-idle: 0 timeout: 0 ##freemarker配置 freemarker: ##是否允许属性覆盖 allow-request-override: false allow-session-override: false cache: true check-template-location: true content-type: text/html ##暴露request属性 expose-request-attributes: false expose-session-attributes: false expose-spring-macro-helpers: false suffix: .ftl template-loader-path: classpath:/templates/ request-context-attribute: request settings: classic_compatible: true locale: zh_CN date_format: yyyy-MM-dd time_format: HH:mm:ss datetime_format: yyyy-MM-dd HH:mm:ss
编译之后会报错:
(1)Spring连接Elasticsearch报错:org.elasticsearch.transport.NodeDisconnectedException: [][127.0.0.1:9300][cluster:monitor/nodes/liveness] disconnected
这个错误是由于elasticsearch版本过高造成的,查看你的Elasticsearch安装目录的logs下的日志.
java.lang.IllegalStateException: Received message from unsupported version: [2.0.0] minimal compatible version is: [5.6.0]
从不支持的版本接收消息:[2.0.0]最小兼容版本是:[5.6.0]
低版本jar包的不支持高版本的Elasticsearch
这里是什么版本建议使用什么版本的Elasticsearch。
装上elasticsearch-2.1.0 解决。
我们曾尝试按照文章《spring boot集成elasticsearch6.1版本》和《spring boot elasticsearch 5.x/6.x版本整合详解》升级org.springframework.boot的版本到2.0.1,但是编译出了更多的错误,这是因为里面调用的接口发生变化造成的。所以我们还是老老实实的安装低版本的Elasticsearch算了。
另外,https://blog.csdn.net/weixin_36380516/article/details/78482167也说明了Spring boot和spring-data-elasticsearch以及elasticsearch之间有严格的版本对应关系。
有的地方写着:Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z)
x <= 1.3.5 y <= 1.3.4 z <= 1.7.2* x >= 1.4.x 2.0.0 <=y < 5.0.0** 2.0.0 <= z < 5.0.0**
* - 只需要你修改下对应的 pom 文件版本号
我们这里是spring-boot-1.5.6.RELEASE和spring-data-elasticsearch-2.1.6.RELEASE,我们卸载安装的elasticsearch 6.2.4版本,试试安装2.4.6版本。这个是没有msi的哦。
5. 重新安装elasticsearch 2.4.6
配置2.4.6可以参考:https://www.cnblogs.com/ljhdo/p/4887557.html
下载2.4.6太费劲了。下载完解压缩,然后安装head插件,然后将elasticsearch添加到系统服务中。
安装完head插件后,可以通过网页管理ElasticSearch
启动elasticsearch服务,然后在本地浏览器中输入http://localhost:9200/_plugin/head/,如果看到以下截图,说明head插件安装成功。
6. 编译工程ithomecrawler
由于是下载别人的程序,原来IThome的评论页面都是json格式,而目前完全没了格式,所以没法使用jsoup。我们要保存的数据内容如下:
private Long id;//热评编号 private String commentId; private String user;//用户 private String comment;//内容 private int up;//支持数 private int down;//反对数 private String posandtime;//位置和时间 private String mobile;//设备 private String articleUrl;//源文章地址
如果采用json返回类型,那么解析出上面的数据结构相当简单,然而,下面给出一个评论页面的内容(只有两条评论):
{"html":"\u003cli class=\"entry\" cid=\"32767350\" nid=\"356518\"\u003e\u003cdiv class=\"adiv\"\u003e\u003cdiv\u003e\u003ca title=\"软媒通行证数字ID:1114977\" target=\"_blank\" href=\"http://quan.ithome.com/user/1114977\"\u003e\u003cimg class=\"headerimage\" οnerrοr=\"this.src=\u0027//img.ithome.com/images/v2.1/noavatar.png\u0027\" src=\"//avatar.ithome.com/avatars/001/11/49/77_60.jpg\"/\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv class=\"level\"\u003e\u003cspan\u003eLv.24\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class=\"info rmp\"\u003e\u003cstrong class=\"p_floor\"\u003e72楼2#\u003c/strong\u003e\u003cdiv class=\"nmp\"\u003e\u003cspan class=\"nick\"\u003e\u003ca title=\"软媒通行证数字ID:1114977\" target=\"_blank\" href=\"http://quan.ithome.com/user/1114977\"\u003e在拾荒时捡到的\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"mobile iphone\"\u003e\u003ca target=\"_blank\" title=\"App版本:v6.03\" href=\"//m.ithome.com/ithome/download/\"\u003eiPhone 6s 银\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"posandtime\"\u003eIT之家甘肃兰州网友\u0026nbsp;2018-4-22 20:57:21\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003eov:告辞告辞,没想到是魅族技高一筹,甘拜下风,下一代机型见\u003c/p\u003e\u003cdiv class=\"zhiChi\"\u003e\u003cdiv class=\"l\"\u003e\u003cspan class=\"comm_reply\"\u003e\u003ca class=\"comment_co\"\u003e展开(21)\u003cimg src=\"//img.ithome.com/images/v2.3/arrow.png\"\u003e\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e \u003cdiv class=\"r\"\u003e\u003cspan class=\"comm_reply\"\u003e\u003ca class=\"s\" id=\"hotagree32767852\" href=\"javascript:hotCommentVote(32767852,1)\"\u003e支持(72)\u003c/a\u003e\u003ca class=\"a\" id=\"hotagainst32767852\" href=\"javascript:hotCommentVote(32767852,2)\"\u003e反对(0)\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/li\u003e\u003cli class=\"entry\" cid=\"32767546\" nid=\"356518\"\u003e\u003cdiv class=\"adiv\"\u003e\u003cdiv\u003e\u003ca title=\"软媒通行证数字ID:1565223\" target=\"_blank\" href=\"http://quan.ithome.com/user/1565223\"\u003e\u003cimg class=\"headerimage\" οnerrοr=\"this.src=\u0027//img.ithome.com/images/v2.1/noavatar.png\u0027\" src=\"//avatar.ithome.com/avatars/001/56/52/23_60.jpg\"/\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv class=\"level\"\u003e\u003cspan\u003eLv.18\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class=\"info rmp\"\u003e\u003cstrong class=\"p_floor\"\u003e99楼6#\u003c/strong\u003e\u003cdiv class=\"nmp\"\u003e\u003cspan class=\"nick\"\u003e\u003ca title=\"软媒通行证数字ID:1565223\" target=\"_blank\" href=\"http://quan.ithome.com/user/1565223\"\u003e死星\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"mobile android\"\u003e\u003ca target=\"_blank\" title=\"App版本:v6.02\" href=\"//m.ithome.com/ithome/download/\"\u003e华为 Mate RS 保时捷设计\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"posandtime\"\u003eIT之家四川成都网友\u0026nbsp;2018-4-22 20:57:14\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003e白色15我肯定要入一部的\u003cbr\u003e颜值高(仅限白色)\u003cbr\u003e线性马达\u003cbr\u003e手感好\u003cbr\u003e24w快充保障\u003cbr\u003e够用性能+够用拍照\u003cbr\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv class=\"zhiChi\"\u003e\u003cdiv class=\"l\"\u003e\u003cspan class=\"comm_reply\"\u003e\u003ca class=\"comment_co\"\u003e展开(130)\u003cimg src=\"//img.ithome.com/images/v2.3/arrow.png\"\u003e\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e \u003cdiv class=\"r\"\u003e\u003cspan class=\"comm_reply\"\u003e\u003ca class=\"s\" id=\"hotagree32767844\" href=\"javascript:hotCommentVote(32767844,1)\"\u003e支持(54)\u003c/a\u003e\u003ca class=\"a\" id=\"hotagainst32767844\" href=\"javascript:hotCommentVote(32767844,2)\"\u003e反对(1)\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/li\u003e\u003cli class=\"entry\" cid=\"32767350\" nid=\"356518\"\u003e\u003cdiv class=\"adiv\"\u003e\u003cdiv\u003e\u003ca title=\"软媒通行证数字ID:1197300\" target=\"_blank\" href=\"http://quan.ithome.com/user/1197300\"\u003e\u003cimg class=\"headerimage\" οnerrοr=\"this.src=\u0027//img.ithome.com/images/v2.1/noavatar.png\u0027\" src=\"//avatar.ithome.com/avatars/001/19/73/00_60.jpg\"/\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv class=\"level\"\u003e\u003cspan\u003eLv.28\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class=\"info rmp\"\u003e\u003cstrong class=\"p_floor\"\u003e72楼7#\u003c/strong\u003e\u003cdiv class=\"nmp\"\u003e\u003cspan class=\"nick\"\u003e\u003ca title=\"软媒通行证数字ID:1197300\" target=\"_blank\" href=\"http://quan.ithome.com/user/1197300\"\u003e雷檬猴啊\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"mobile iphone\"\u003e\u003ca target=\"_blank\" title=\"App版本:v6.02\" href=\"//m.ithome.com/ithome/download/\"\u003eiPhone 7 Plus 亮黑\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"posandtime\"\u003eIT之家湖北网友\u0026nbsp;2018-4-22 21:10:02\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003e鸡王:扫视一圈友商把苹果能抄的都抄了个遍,就差带震动回馈的home键还没人抄了,这波我来捡个漏