0x00 写在前面
玩微博的都知道其实微博的搜索功能比较鸡肋,就算直接输入ID也未必能搜到什么有用的信息。如果想知道一个人在微博上的评论,回复怎么办?这段时间了解一些elasticsearch的知识,既然花了时间就要学以致用。
0x01 数据是基础
没有数据说什么都是耍流氓,用python爬微博的评论,为了节省开销,我这里利用的是 http://weibo.cn/
,理想化的程度是全网爬(想想就可以了 = =,那么最大程度获取数据的方法就是目标化。
回到开始,我们的需求是特定目标的微博评论与回复,而这些内容90%出现在ta所关注的po主微博下(一个人基本只会给自己关注的博主评论),那么遍历ta的关注列表,只爬这些人的微博评论(这就已经是个不小的工程了。。。
1. 流程
2. 唯一微博标识(commentID)
commentID算是微博评论的唯一标识,后面的参数没有实在意义,利用这个commentID可以直接定位某条微博下的评论: http://weibo.cn/comment/{commentID}?page=n
3. 数据处理
- redis集合去重
存入mongo的字段是「是否二级评论」,「评论人」,「回复给who」,「评论正文」,「页数」,「commentID」
{
"_id" : ObjectId("58d1e2f6dce48a0eb14b5f2d"),
"author" : "six个shell",
"replyTo" : "@sixwhale",
"text" : ":这是一条回复测试",
"twice_comment" : true,
"commentID" : "EADXk12c1",
"page" : 1
}
{
"_id" : ObjectId("58d1e4a7dce48a0eebfe559b"),
"author" : "画小猜",
"replyTo" : null,
"text" : "新年快乐![干杯]西安娃[doge]",
"twice_comment" : false,
"commentID" : "EoGpxl4a4",
"page" : 20
}
0x02 为什么使用ES?
ES即elasticsearch,其实就是利用的ES的模糊匹配。数据库与搜索引擎的区别在于:
- 数据库是「询问这篇文章是否匹配查询条件」
- 搜索引擎是「这篇文章和查询的要求匹配程度如何」,即「相关性」①
ES将每个字段的内容利用分词器分成单独的词,创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档,比较匹配程度,即相关性,计算出_score,按照降序全部检索出来。
0x03 mongoDB 与 ES 数据同步
我的环境:
- mongo3.4.0
- elasticsearch5.0.0
- mongo-connector !!!
- elastic2-doc-manager ②(文档管理器
同步之前确定27017,9200端口都正常服务
$ mongo-connector --auto-commit-interval=0 -m 127.0.0.1:27017 -t 127.0.0.1:9200 -d elastic2_doc_manager -n db.collection③ |
目前数据比较少,但是效果真的不错。。。
0x04 说明
① 相关性:
- 检索词频率
- 反向文档频率:每个检索词在索引中出现的频率,频率越高,相关性越低
- 字段长度准则:检索词出现的字段的长度越大,相关性越低
② elastic2-doc-manager:
- elasticsearch1.x
pip install elastic-doc-manager
- elasticsearch2.x
pip install elastic2-doc-manager[elastic2]
- elasticsearch5.x
pip install elastic2-doc-manager[elastic5]
③ db.collection:
指定数据库名db,集合名collection 默认情况是同步全部数据库,具体用法–help吧(= =