(一)为什么用检索?
爬虫系统一般分为多线程下载部分,链接池,数据存储,检索系统等。这个检索系统可以将我们爬取的信息进行整合,并且可以加快我们查找的速度。另外,不仅爬虫系统使用,我觉得在一切想把结果做成索引对外提供查询的需求都可以使用检索系统,比如个人社工库,大规模漏洞扫描系统(可以利用其做僵尸网络)等。检索系统很多,但是我认为Elasticsearch比较方便,提供多种语言的API,比如java,php,perl,python等。今天就记录下我折腾这个系统的过程。
(二)怎么使用?
从网上下载客户端与服务器各一个,服务器好说,下载下来就直接可以用:
进入bin目录运行bat文件即可,默认端口是9200。
客户端(我使用的是PHP API)比较麻烦些, 要使用elasticsearch-php有如下三个要求:
1.PHP的版本在5.3.9以上,我用的是PHP5.3.23
2.在项目中使用Composor来管理包,下载地址如下:https://getcomposer.org/
3.在php.ini中开启curl和openssl
安装好composer之后,使用的过程如下:
(1) 新建一个目录,我这里的项目名为:phpcrawler。
(2) 在里面添加下的json文件:
1
2
3
4
5
6
7 1 {
2 "require":{
3 "elasticsearch/elasticsearch" : "~1.2"
4 }
5 }
6
7
然后cd到这个文件夹,执行composer install –no-dev
稍等片刻就可以看到文件夹下出现了vendor文件夹,使用的也就是这个文件,哪里需要就粘贴到哪里即可。
这样我们就可以直接在php中包含/vendor/autoload.php。
(三)构建爬虫系统
有了PhpCrawler,PHP构建一个爬虫系统变得就容易多了,只需要给一个入口链接,PhpCrawler就可以帮你自己爬取,当然,必要的正则还是要自己写,不过省去了翻页、链接池管理、链接调度等麻烦。对于如何使用PhpCrawler,不是本文讨论的重点,你可以参考:
http://www.cuab.de/classreferences/PHPCrawler/overview.html
我所抓取的数据是歌单数据,一张歌单对应多个歌曲,歌单信息包括创建时间,创建人,歌单名称等,并存储在Mysql上,有两张表,一张是song,一张是songlist,通过songlist_id作为外键关联。
但是这些数据是比较乱的,用sql查找起来不方便,并且查找的速度也很慢,使用Elasticsearch构建索引会改变这一现状。
(四)建立索引系统
在PHP中使用Elasticsearch类,返回的是一个客户端,可以直接向构造函数传递一个array指明一个或者多个服务器IP和端口。
建立过程如下:
(1) 创建一个客户端
(2) 设置索引的名称
(3) 设置索引的Mapping
设置索引的mapping,名为:songlist_type。
(4) 设置索引项
使用$client对象的index添加索引项,要设置一个$params参数,body就是设置索引项的地方,这里是把歌单的title和歌单的songlist_id做了一个索引。向服务器提交一个关键字title就可以得到相应的id,使用这个id就可以获取歌单中的歌曲。
添加完所有的索引项,索引就算做完了,记得执行一下,向服务器提交索引
(五)使用索引查询数据
建完了索引,自然是要利用到我们的需求中。在查询时同样也要建立一个客户端,使用客户端中的search方法,并设置参数就可以获取结果集。这里的提供的索引的键值为title(songlist_id和title构成的索引项)。Title的值设置为$query(GET中获取)。
具体过程如下:
拿到结果集(Array),就可以从hits项中拿到查询的结果。
提交$query=‘烦恼’,打印下search返回的结果数组:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 1Array (
2[took] => 2
3[timed_out] =>
4[_shards] => Array (
5[total] => 5
6[successful] => 5
7[failed] => 0 )
8[hits] => Array ( //查询到的索引项的具体信息,如果没有匹配的项hits为空
9[total] => 1 //匹配索引项的个数
10[max_score] => 2.2478988
11[hits] => Array (
12[0] => Array (
13[_index] => songlist_index //索引的名称
14[_type] => songlist_type //索引的mapping
15[_id] => 209 //对应的id号
16[_score] => 2.2478988
17[_source] => Array (
18[title] => 你在烦恼什么? //结果的title
19[songlist_id] => 209 //索引项的id
20) ) ) ) )
21
22
拿到之后遍历之打印到页面上即可~!
(六)使用效果
盗了百度的logo,但是重点是检索的效果如下:
(七)总结
简简单单用Elasticsearch构建索引,如果以后有相应的需求,记得使用这个检索系统。