示例 http://findit.keenwon.com
- worker:爬虫,收集资源infohash,可以同时启动多个进程的worker,提高效率
- male:根据收集来的infohash去下载种子文件
- female:将种子文件录入数据库
- queen:简单的入口,启动pm2运行worker,male和female
- bucket:比较大的一个K桶
- infohash:就是已经收集到的infohashs(worker收集来的,male会用来下载种子)
- remoteNodes:worker新认识的节点,会依次“拜访”的,目前只保存最新的10w个(一方面我的VPS内存小,另一方面真没必要记录太多)
- sysInfo:记录一些统计信息,例如发出多少次请求,累积收集多少infohashs,目前已经发出15亿次Request,这个频率是可控的,worker 太疯狂的话,VPS扛不住。
- from https://github.com/keenwon/antcolony
安装&运行方法
AntColony部署文档
服务器环境安装
服务器配置
安装nodejs
安装pm2
安装Redis
安装Mongodb
部署AntColony
运行
修改配置文件
创建必要的文件夹
启动
问题
pm2的版本
多久有数据
worker、male和female的比例问题
其他
本地下载编译源码
下载源码和依赖包:
git clone https://github.com/keenwon/antcolony
cd antcolony
npm install --development
grunt
dist
目录下就是用来部署的文件。服务器环境安装
服务器配置
- Memory: 2G
- Disk: 40G SSD
- Processor: 2 Core
- Image: Centos6.5 x64
安装nodejs
我的安装过程参考这里
安装pm2
--unsafe-perm
:npm install pm2@0.10.7 -g --unsafe-perm
安装Redis
redis-cli
CONFIG SET requirepass 123456
安装Mongodb
部署AntColony
dist
目录上传至服务器,安装依赖包:npm install --production
npm install pm2@0.10.7 --save --unsafe-perm
运行
修改配置文件
config.js
redisHost: '127.0.0.1',
redisPort: 6379,
redisAuth: '123456',
mongodbHost: '127.0.0.1',
mongodbPort: 27017,
mongodbDatabase: 'antcolony',
mongodbUserName: 'antcolony',
mongodbPassword: '123456',
config.js
里面设置worker的相关参数。例如设置端口号是3000的worker:worker: {
3000: {
sended: true, // 是否发送find_node
cycle: 20 // 周期,每隔多少毫秒发送一次find_node
}
}
创建必要的文件夹
mkdir log
mkdir .temp
启动
node startup worker 3000
node startup male 1
node startup female 1
问题
pm2的版本
但是这次发现执行
pm2 list
,App name显示不正常,重装依然无效。但是在pm2 monit
中的name显示是正常的。 pm2挺好用的,但是问题也不少,新版本应该有不少改进,但是最近没空去了解,如果你要新版本的pm2的话,可以用下面的方法启动AntColony:pm2 start src/queen.js -f --name worker[3000] -- worker 3000
pm2 start src/queen.js -f --name worker[3001] -- worker 3001
pm2 start src/queen.js -f --name male[1] -- male 1
pm2 start src/queen.js -f --name female[1] -- female 1
多久有数据
{
"db" : "antcolony",
"collections" : 3,
"objects" : 74,
"avgObjSize" : 676.7567567567568,
"dataSize" : 50080,
"storageSize" : 188416,
"numExtents" : 5,
"indexes" : 1,
"indexSize" : 8176,
"fileSize" : 67108864,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1
}
worker、male和female的比例问题
- 如果你觉得抓取的太慢,可以多启动几个worker
- 如果你Redis里有很多待处理的infohash(worker抓取到的),可以多启动些male
- 如果你的
.temp
目录积压了很多种子文件,可以多启动几个female。
Findit – Node.js实现的磁力搜索引擎
废话写前头
源起
2013底的时候,我从上一家公司离职,由于各种原因休息了一段时间,年后才入职新公司。休息的这段时间,除了搭建这个个人网站、看书、帮以前学校完成一个CMS系统(目前没有使用,使用ASP.NET实现的,后面可能会把代码放到Github上)外,还有一个大的发现,就是Xiaoxia写的一个磁力链接搜索引擎。相信大家都知道这是干什么的,粗略看完Xiaoxia写的介绍后,真是脑洞打开,兴趣满满。本打算自己开发一个出来玩玩,奈何对ASP.NET/C#缺乏深入了解,写起来很累,又打算投入新的工作中,所以只得作罢。
2014年加入新公司后,频繁的使用了Node.js,渐渐的发现Node的强大,磁力搜索引擎的想法又重新浮现。可以说,这一年我大部分的学习都是围绕“Findit磁力搜索引擎”展开的,看我博客写的文章就会发现:Redis、Mongodb、PM2、Elasticsearch、甚至Centos和Nginx,都是Findit使用到的技术。在实践中学习,这本身也是花大力气做这件事的目的。
上线
2014-10-25网站正式上线。域名是http://findit.keenwon.com(旧域名是:http://findit.so),在Digitalocean上使用了三台VPS:
- 第一台部署了Findit站点本身(express.js、nginx)和单个节点的Elasticsearch
- 第二台部署了Mongodb数据库(目前有300W数据库,每日新收录1W+的数据)
- 第三台部署了AntColony磁力链接爬虫(后面细说)
好景不长
但是好景不长,不用说大家也知道,使用BT种子下载的都是什么东西,盗版、色情充斥其中。本来还想放点Google
AdSense实现自负盈亏的,结果还没一个月就收到了警告邮件,要求我整改,深知此问题无法解决,索性也就把广告给下了,每个月一两百的VPS钱还是出得起的(呵呵)。
另外一点就是,14年12月,“带头大哥”海盗湾被瑞典警方连窝端了,什么?你说这个关我p事?当然关我的事了。AntColony从DHT网络中收集到资源的infohash后,要去种子托管网站下载种子文件,读取文件内容,收录到系统中才能被用户搜索到。海盗湾被查封的同时Zoink和Torrage这两个种子托管站也被封了(目前Zoink还活着),这就影响到了资源的收录。
海盗湾事件更重要的影响是,我的信念被动摇了。很多国家禁止使用BT下载盗版资源,而国内大多数人用来干什么大家都懂的(我看的到用户搜索的关键字)。还有就是BT本身的特性,要大家一起下载才快,Findit收录的资源,可能已经没人下载了,用户使用搜索到的磁力链接下载资源,很可能根本没有速度。这些都让我怀疑“磁力链接搜索引擎”存在的意义,只能以“重在过程”聊以自慰了:开发过程中,我确实学到不少。所以,可能不久的将来,findit会被关闭,但我希望代码可以被留存下来,帮到需要它的人。好了废话到此为止。
相关知识
这部分我不打算细说,google都能搜出来,我只列一下我觉得比较好的资料:
-
最关键的就是BitTorrent.org上的文档
- 最初提到的Xiaoxia的那篇文章(http://web.archive.org/web/20170421091911/http://xiaoxia.org/2013/05/11/magnet-search-engine/),粗略的提到了实现原理。
- P2P中DHT网络介绍
-
Kademlia协议
-
Kademlia详解
- Kevin Lynx写的几篇文章
-
Torrent文件结构解析
AntColony
AntColony(Github)是findit磁力搜索引擎的核心。用来在DHT网络中,收集活跃资源的infohash,下载并解析资源的种子文件,存入数据库等。AntColony是若干功能的合集,也可以单独运行其中的部分功能,所以起“蚁群”这个名字也是很贴切的(没错,我就是爱动物世界)。主要分一下几块:
- worker:爬虫,收集资源infohash,可以同时启动多个进程的worker,提高效率
- male:根据收集来的infohash去下载种子文件
- female:将种子文件录入数据库
- queen:简单的入口,启动pm2运行worker,male和female
目前启动5个worker使用3000-3004的端口,2个male和1个female。
使用Mongodb储存数据,这没什么好说的;使用pm2维护和监控node进程,也没太多要说的,重点说下Redis。Redis里暂存的数据大概是这样的:
比较大的一个K桶(bucket);infohash就是已经收集到的infohashs(worker收集来的,male会用来下载种子);remoteNodes是worker新认识的节点,会依次“拜访”的,目前只保存最新的10w个(一方面我的VPS内存小,另一方面真没必要记录太多);sysInfo会记录一些统计信息,例如发出多少次请求,累积收集多少infohashs,目前已经发出15亿次Request,这个频率是可控的,worker太疯狂的话,VPS扛不住。
下面简单说下运行方法,安装好node,pm2,redis,mongodb之后,执行
npm install
下载依赖的包,在根目录运行node startup worker 3000
启动一个worker监听3000端口;运行node startup male 1
启动id为1的male(female同理)。
mongodb-to-elasticsearch
刚才说AntColony的时候没提到Elasticsearch。Elasticsearch是一个非常赞的实时分布式搜索引擎,惊人的强大和便捷,可以方便的在Node环境中使用elasticsearch.js操作。但是在实际使用中发现个问题,female将种子文件解析好后,存储在mongodb,再存储在Elasticsearch,这个过程效率很低。经常会堆积大量种子文件处理不过来。另一方面,没有必要那么“实时”,既浪费资源有增加了Elasticsearch的压力。所以就搞了mongodb-to-elasticsearch这个小工具,每天执行一次mongodb到Elasticsearch的数据同步。代码很简单,有兴趣的可直接看Github上的代码。
Findit
Findit是基于Express.js开发的一个小网站,只有一个简单的功能,就是查Elasticsearch。有了AntColony和mogodb-to-elasticsearch就有了数据,想怎么玩都随你了,不多说。
存在的问题
虽然稳定运行中,但是任然存在几个问题:
1、需要足否大的内存运行AntColony。目前AntColony的VPS内存是1G,Redis占用了一部分,剩下可用的内存是500M左右,如果大于遇到700K的种子文件(大概的),female就会卡住解析不存在,内存占用率不断提高,直到被PM2重启。
由于female是随机取出种子文件解析的,所以一段时间后还会遇到问题文件,继续卡住,如此不断的重复……,目前的解决办法,就是移走大文件,在自己电脑上运行female解析。当然不差钱的人可以用性能更强悍的机器。
2、目前mongodb-to-elasticsearch是手动执行的。先停止female,然后程序会把上次执行时间节点后,新增的数据同步过来。效率还不错,1W多的数据几十秒就好了。但是手动执行还是太麻烦,下一步优化的方向是定时执行或者优化female,直接同步Elasticsearch。
最后演示网站:findit
from http://keenwon.com/1436.html
-------------
写了个磁力搜索的网页 - 收录最近热门分享的资源
平常我们高端用户都会用到BT工具来分享一些好玩的资源,例如ubuntu 13.04的ISO安装盘,一些好听的音乐等。这个时候我们会进入一个叫做P2P的网络,大家都在这个网络里互相传递数据,这种分布式的数据传输解决了HTTP、FTP等单一服务器的带宽压力。以往的BT工具(包括现在也有)在加入这个P2P网络的时候都需要借助一个叫Tracker的中心服务器,这个服务器是用来登记有哪些用户在请求哪些资源,然后让请求同一个资源的用户都集中在一起互相分享数据,形成的一个集群叫做Swarm。
这种工作方式有一个弊端就是一旦Tracker服务器出现故障或者线路遭到屏蔽,BT工具就无法正常工作了。所以聪明的人类后来发明了一种叫做DHT(Distributed Hash Table)的去中心化网络。每个加入这个DHT网络的人都要负责存储这个网络里的资源信息和其他成员的联系信息,相当于所有人一起构成了一个庞大的分布式存储数据库。在DHT里定位一个用户和定位一个资源的方法是一样的,他们都使用SHA-1产生的哈希值来作标识。
具体如何工作的呢?举个形象点的例子,把DHT网络比作一个朋友圈子,你想进入这个圈子必须要有一个人带领你进去,通常会有一些特定人负责介绍你进入这个圈子。当你被A带进这个朋友圈,此刻你就只认识A而已。但是你的目的是想找奥巴马总统,所以你会问A要奥巴马的联系方式,但是A没有奥巴马的联系方式,他会介绍一个美国朋友B给你认识。于是你去问B要奥巴马的联系方式,B其实也没有奥巴马的联系方式,但是B认识一个州长C。于是你又得到了C的联系方式,C把奥巴马的联系方式告诉你之后,你就可以写信或者致电给奥巴马了。
这种DHT网络听起来很不错,没有中心服务器,也不怕被DDOS,看看海盗湾如今还能挺立那么久就知道了。但是有没有安全隐患在里面呢?答案是肯定有的。有些不听话的用户可能会在DHT网络里捣乱,譬如说撒谎,明明自己不是奥巴马,却偏说自己是奥巴马,这样会误导其他人无法正常获取想要的资源。另外,用户在DHT网络里的隐私可能会被窃听,因为在DHT网络里跟其他用户交换资源的时候,难免会暴露自己的IP地址,所以别人就会知道你有什么资源,你在请求什么资源了。这也是目前DHT网络里一直存在的一个弱点。
正是利用这个弱点,我根据DHT协议用Python写了一段白菜程序,加入了这个DHT网络。在这个网络里,我会认识很多人,越多越好,并且观察这些人的举动,比如说A想要ubuntu的安装盘,那么我会把A的这个行为记下来,同时我会把ubuntu安装盘这个资源的信息也记下来,保存到数据库中,统计请求ubuntu这个资源的人有多少。如今,这个爬虫已经运行了两个昼夜,以每分钟记录3000多个资源信息的速度工作(单机器单线程,耗尽了CPU的一个核心)。到目前为止(48小时),共发出4亿条交友请求,收到1100万条来自朋友的资源请求。到底有多少资源目前另外一个程序还在分析中,从已分析的300万请求中,独立资源个数为20万个。保守估计这1100万条请求中涉及资源个数为50万以上。迟点有空的话,对这些资源进行分类和分析。
在DHT网络里发现的资源基本上都是最新的活跃资源,一些几年前的资源现在没有用户请求的话就不会被挖掘出来。想想海盗湾沉淀了那么久才500万资源,我跑了两天的程序就已经探测到50万资源,所以随着时间推移,会有更多的资源被探测出来,而且那些最新的能够被接近实时的速度发现到。本来通过增加一个节点进程可以加快探测速度,但是我没有这样做的原因是分析请求的哈希值的速度赶不上发现新请求的速度。有兴趣的朋友可以自己琢磨一下这方面的东西,国内研究DHT网络的人应该比较少。前段时间我打探过几家现在做P2P视频播放的公司里,没有人做这方面的研究.
Rats on The Boat是支持多平台的开源BT搜索引擎服务器系统, 基于 Electron 开发, 多语言支持(包括中文版), 遵守MIT开源协议。Rats on The Boat不需任何tracker服务器即可搜索种子和下载资源。支持网页版访问,也配套了桌面版。可以对种子进行评级。种子过滤器支持正则表达式、类型和体积进行过滤。支持安全搜索,可设置是否屏蔽成人内容。服务器搭建后,默认使用8095端口,本地服务器可访问http://localhost:8095。
软件特点:
工作与p2p网络协议之上, 无需trackers服务器
支持自己的 p2p 协议方便传输数据 (如多个 rats客户端之间互传描述,评级信息等)
支持搜索种子和文件
搜索过滤器 (大小范围,文件等…)
Trackers 扫描支持
整合种子客户端
支持种子评级
P2P搜索协议,搜索其他rats客户端
网页版服务器
最受欢迎列表
Feed列表
多语言支持: 英语,俄语,乌克兰语,中文
拖拽种子搜索本地数据
[repo owner=”DEgITx” name=”rats-search”]
Rats on The Boat - BitTorrent search engine
BitTorrent search program for desktop and web. Collect and navigate over base of torrents statistic, categories, and give easy access to it. Work over p2p network and support Windows, Linux, Mac OS platforms.
Features
- Works over p2p torrent network, doesn't require any trackers
- Supports own p2p protocol for additional data transfer (like search between rats clients, descriptions/votes transfer, etc.)
- Search over torrent collection
- Torrent and files search
- Search filters (size ranges, files, seeders etc...)
- Collection filters (regex filters, adult filters)
- Trackers peers scan supported
- Integrated torrent client
- Collect only statistic information and don't save any torrents internal data
- Supports torrents rating (voting)
- P2P Search protocol. Search in other Rats clients.
- Web version (web interface) for servers
- Top list (mostly common and popular torrents)
- Feed list (Rats clients activity feed)
- Translations: English, Russian, Ukrainian, Chinese
- Drag and drop torrents (expand local search database with specific torrents)
- Descriptions association from trackers
- Torrent generation and automatic adding to search DB
Architecture
Contributing
We are welcome any contributing: bug fixes, improvements, code refactoring and other stuffs.
Own strategy / Other tracker support
Usage Manuals
Download Desktop client
By default we recomended using desktop version of application. Download and install most recent one for Windows, MacOS, Linux.
Start desktop client from master branch
Clone repository, then make sure that you have Node.js and NPM (with Node.js) installed in your system, then install all needed packages:
npm install --force
and start master develop branch version:
npm start
Server webUI version installation
Beside default desktop cross-platform client, also exist separated webUI that can run from server independant as web-client + Node.JS server.
Clone repository, then make sure that you have Node.js and NPM (with Node.js) installed in your system, then:
npm install --force
Then compile web version:
npm run buildweb
Finally start server application:
npm run server
Now you can get access to web interface on 8095 port: http://localhost:8095
More about server compatibility and known issues
Support
- Twitter: @RatsSearch
- Discord (Support)
from https://github.com/DEgITx/rats-search