DHT协议网络爬虫磁力连接和BT种子搜索引擎

系统功能和用到的技术。

系统包括几个独立的部分:php

  • 使用 Python 的 Scrapy 框架开发的网络爬虫,用来爬取磁力连接和种子;html

  • 使用 PHP CI 框架开发的简易网站;java

  • 搜索引擎目前直接使用的 MySQL,未来能够考虑使用 sphinx;node

  • 中文分词。git

    用 PHP 写了一个简陋版的基于逆向最大匹配算法的小类,词库呢,哈哈,直接使用了 Chrome 的分词表,分词表能够在这个地址下载:http://www.mdbg.net/chindict/chindict.php?page=cedictgithub

  • 新词发现机制算法

    基于搜索关键词的新词发现机制。chrome

    目前词库方面还有一个很大的问题,好比最新的电影没法分词,例如星际穿越 会被分词为“星际”和“穿越”,所以“被偷走的那五年,穿越火线,极速蜗牛,了不得的盖茨比,摩登年代,星际迷航,乔布斯传。”也出如今了搜索结果中。服务器

    固然这也不算事大问题,可是霍比特人却被分词为了“霍”、“比特”、“人”了,好在搜索结果里面没有啥东西乱入。这些属于过分分词,经过增长词库内容能够解决,所以准备些一个豆瓣爬虫,将豆瓣的全部电影都加入词库,用来辅助分词。网络

  • 资源别名

    这会使咱们的系统更加智能,更加人性化。咱们在百度搜索时,常常会遇到这样的状况,当咱们搜索“开核桃利器”,百度提示咱们“您要找的是否是诺基亚?”。当咱们搜索“世界上最好的语言”,百度提示咱们“您要找的是否是PHP?”。一样,当用户搜索“星际穿越”时,应该为用户提供Interstellar的匹配结果。

    咱们不用实现复杂的在线翻译,只须要继续爬取豆瓣,将电影的中英文都作成对照表就能够了。并且,为了考虑到某些宅男的特殊需求,咱们还须要作一个日语的对照表。

  • 英文分词

    英文还须要分词?空格不就是词语边界吗?你有这样的译文很正常,我最初也是这么想的,所以英文只是简单的使用了 PHP 的 explode(' ', $query) 函数。

    可是我刚才(2015-02-01 21:59:35)看搜索日志时发现了一些问题,今天 xart 关键词被搜索了 169 次,而 x-art 关键词仅仅被搜索了 54 次,可是 x-art 才是它的官方名词啊(不要问我为何知道的这么多)。所以我刚刚调整了一下代码,将 xart 和 x-art 统必定向到了 x-art。

  • BitTorrent 低版本最初使用 Python 开发,并且是开源的,所以不少类库都是直接使用的 BitTorrent 的,也有一些类库和辅助函数直接移植到了 PHP 平台上;(Petru Paler 写的 bencode 太赞了,老婆问我:你为何跪着写代码?)

了解 P2P 原理的人都知道,BT 不须要中心服务器,由于每一个节点既是客户端,同时也是服务器,所以基于 0x0d 大神的 dhtfck写了一个 DHT 爬虫,它假装为 DHT 网络中的一个节点,这样当其余客户端想下载某个 torrent 时,就会在 DHT 网络发起广播,当它询问到个人节点时,我就知道了:哦,原来有人要下载这个种子啊,那么在 DHT 网络中确定有这个种子。因而我把这个种子的信息保存到 MySQL 中。

以上 DHT 的整个过程能够具体看看 DHT 协议

注意:我只是保存了 torrent 的 infohash 信息,用这个信息,能够构建一个磁力连接,可是却尚未获得种子文件,咱们还得经过其它方式取得种子文件。

Python 的爬虫程序是主动出击,盲目寻找。在互联网的海量网页中寻找种子和磁力连接。而 DHT 爬虫则变成了被动等待,当别人来询问时,就把它的询问结果记录下来,若是一个种子被询问了不少次,则说明这个种子是一个热门种子,这是 Python 爬虫没法作到的。

因为 BitTorrent 开源版本使用的 Python,所以个人 DHT 爬虫也使用了 Python。做为一个服务器,确定要使用 twisted 框架,熟悉 nodejs 的同窗必定知道这个框架的特性:异步网络 IO,虽然大部分开发者都是经过 nodejs 才了解了异步 IO,可是 twisted 要比 nodejs 早了 N 年。

当前运行的爬虫是一个很是简陋的版本,是我一周前写的一个多线程的基于 Socket 的 DHT 服务器。截至到如今(2015年2月1日),已经运行了 6 天了,总共收集到了 45,234,859 个磁力连接。

磁力搜索网站汇总每日更新

http://www.javashuo.com/article/p-dyvcyick-kn.html

相关文章
相关标签/搜索