系统功能和用到的技术。

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

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

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

  • 搜索引擎目前直接使用的 MySQL,将来可以考虑使用 sphinx;

  • 中文分词。

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

  • 新词发现机制

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

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

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

  • 资源别名

    这会使我们的系统更加智能,更加人性化。我们在百度搜索时,经常会遇到这样的情况,当我们搜索“开核桃利器”,百度提示我们“您要找的是不是诺基亚?”。当我们搜索“世界上最好的语言”,百度提示我们“您要找的是不是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 个磁力链接。

DHT协议网络爬虫磁力链接和BT种子搜索引擎的更多相关文章

  1. 迅雷磁力链接转BT种子工具

    种子文件目录:C:\Users\jifeng\AppData\Local\Temp\magnetex MagnetEx.exe 从迅雷5.8支持磁力链接的无视受限资源版提取 MagnetEx.exe ...

  2. 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源) 先直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间 ...

  3. 据磁力链获得BT种子

    最近研究了一下磁力链magnet和BT种子torrent文件之间的相互转换.其实通过torrent文件获得磁力链实现起来比较简单,但反过来并非是一个可逆的过程,磁力链转BT种子理论上来说是不可能实现的 ...

  4. [搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器:http://www.sosobta.com   大家可以给提点意见... 出售商业网站代码,万元起,非诚勿扰,谢谢. 联系h31h31 a ...

  5. 利用迅雷提供的接口从磁力链得到bt种子文件

    本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...

  6. BitTorrent DHT 协议中文翻译

    前言 做了一个磁力链接和BT种子的搜索引擎 {Magnet & Torrent},因此把 DHT 协议重新看了一遍. BitTorrent 使用"分布式哈希表"(DHT)来 ...

  7. nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫

    项目简介 前端站点 项目效果预览 http://findcl.com 使用 nodejs 实现磁力链接爬虫 磁力链接解析成 torrent种子信息,保存到数据库,利用 Elasticsearch 实现 ...

  8. [C#搜片神器] 之P2P中DHT网络爬虫原理

    继续接着上一篇写:使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器] 昨天由于开源的时候没有注意运行环境,直接没有考虑下载BT种子文件时生成子文件夹,可能导致有的朋友运行 ...

  9. BT中的磁力链接(转)

    注意:磁力链接不是迅雷的,而是BT网络中的一种协议. 磁力链接与种子文件 磁力链接并不是一个新概念,早在2002年,相关的标准草稿就已经制定了.但直到2012年海盗湾为规避版权问题删除了站点上的所有T ...

随机推荐

  1. FreeRTOS学习笔记3:内核控制及开启调度器

    内核控制函数API 应用层中不会用到taskYIELD() //任务切换.会自动切换当前就绪表里优先级最高的任务 临界区 //不能被打断的代码段任务中进入临界区任务中退出临界区中断服务进入临界区中断服 ...

  2. 8.10-Day1T2圈(circle)

    圈(circle) 题目大意 一开始看这道题,觉得有点像备用钥匙那道题,需要离散化, 把一个球的两个点分开看... 但是..其中的规律我推不出来 (不是很难,只是蒟蒻好久都没有自己独立思考了) 题解 ...

  3. JVM工具使用和Linux-top命令解析

    top 命令 top 命令查看现在线程占用资料的情况. 第三行,cpu状态信息,具体属性说明如下: us — 用户空间占用CPU的百分比.(重要) sy — 内核空间占用CPU的百分比. ni — 改 ...

  4. 【PAT甲级】1112 Stucked Keyboard (20分)(字符串)

    题意: 输入一个正整数K(1<K<=100),接着输入一行字符串由小写字母,数字和下划线组成.如果一个字符它每次出现必定连续出现K个,它可能是坏键,找到坏键按照它们出现的顺序输出(相同坏键 ...

  5. 字符串类型:char,varchar,text,enum,set

    字符串类型 1.char 格式:char (M) 2.varchar 格式:varchar (M) [注意]M表示允许的字符串长度[65535].M表示的是字符数,而不是字节数.但是最大长度的使用是按 ...

  6. 委托与事件--delegate&&event

    委托 访问修饰符 delegate 返回值 委托名(参数); public delegate void NoReturnNoPara(); public void NoReturnNoParaMeth ...

  7. concat merge

    # concat import numpy as np import pandas as pd from pandas import Series,DataFrame df1 = DataFrame( ...

  8. ACM的探索之Just Skip The Problem

    -----------------心怀虔诚,奋勇前进,fighting!!!!!! Problem Description: inclusively:          包括一切地;包含地 simul ...

  9. numpy函数hstack,vstack,dstack简介

    vstack.hstack和dstack都用于把几个小数组合并成一个大数组.它们的差别是小数组的元素在大数组中的排列顺序有所不同.把两部手机摆到一起有几种方式?水平的左右排列,垂直的上下排列,还可以把 ...

  10. 学习笔记(22)- plato-训练端到端的模型

    原始文档 Train an end-to-end model To get started we can train a very simple model using Ludwig (feel fr ...