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

相關文章
相關標籤/搜索