如何自給自足獲取磁力種子

嚴(yán)肅的理論

磁力鏈接

現(xiàn)在我們使用迅雷等工具下載資源的時(shí)候焕刮,基本上都只需要一個(gè)叫做磁力鏈接的東西就可以了搜立,非常方便围来。

我仿佛聽到了車?guó)Q聲

磁力鏈接是對(duì)等網(wǎng)絡(luò)中進(jìn)行信息檢索和下載文檔的電腦程序痛垛。和基于“位置”連接的統(tǒng)一資源定位符不同刺桃,磁力鏈接是基于元數(shù)據(jù)文件內(nèi)容粹淋,屬于統(tǒng)一資源名稱。也就是說瑟慈,磁力鏈接不基于文檔的 IP 地址或定位符桃移,而是在分布式數(shù)據(jù)庫(kù)中,通過散列函數(shù)值來(lái)識(shí)別葛碧、搜索來(lái)下載文檔借杰。因?yàn)椴灰蕾囈粋€(gè)處于啟動(dòng)狀態(tài)的主機(jī)來(lái)下載文檔,所以特別適用沒有中心服務(wù)器的對(duì)等網(wǎng)絡(luò)进泼。

磁力鏈接格式類似于 magnet:?xt=urn:btih:E7FC73D9E20697C6C440203F5884EF52F9E4BD28

分解一下這個(gè)鏈接

  • magnet:協(xié)議名蔗衡。
  • xt:exact topic 的縮寫纤虽,表示資源定位點(diǎn)。BTIH(BitTorrent Info Hash)表示哈希方法名绞惦,這里還可以使用 SHA1 和 MD5逼纸。這個(gè)值是文件的標(biāo)識(shí)符,是不可缺少的济蝉。

一般來(lái)講杰刽,一個(gè)磁力鏈接只需要上面兩個(gè)參數(shù)即可找到唯一對(duì)應(yīng)的資源。也有其他的可選參數(shù)提供更加詳細(xì)的信息王滤。

  • dn:display name 的縮寫贺嫂,表示向用戶顯示的文件名。
  • tr:tracker 的縮寫雁乡,表示 tracker 服務(wù)器的地址第喳。
  • kt: 關(guān)鍵字,更籠統(tǒng)的搜索踱稍,指定搜索關(guān)鍵字而不是特定文件曲饱。
  • mt:文件列表,鏈接到一個(gè)包含磁力鏈接的元文件 (MAGMA - MAGnet MAnifest)寞射。

這里可以閱讀阮一峰的 BT 下載的未來(lái)渔工,我很喜歡他文章的最后一句話锌钮。

當(dāng)互聯(lián)網(wǎng)上每一臺(tái)機(jī)器都在自動(dòng)交換信息的時(shí)候桥温,謊言和封鎖又能持續(xù)多久呢?

種子/DHT

通過磁力就可以獲取種子文件從而進(jìn)行下載梁丘,這跟直接使用種子下載時(shí)一個(gè)道理的侵浸,只是少了從磁力到種子文件的一個(gè)過程而已。

老司機(jī) 帶帶我

BitTorrent 協(xié)議的種子文件可以保存一組文件的元數(shù)據(jù)氛谜。這種格式的文件被 BitTorrent 協(xié)議所定義掏觉。擴(kuò)展名一般為“.torrent”。BitTorrent 使用”分布式哈希表”(DHT)來(lái)為無(wú) tracker 的種子(torrents)存儲(chǔ) peer 之間的聯(lián)系信息值漫。這樣每個(gè) peer 都成了 tracker澳腹。這個(gè)協(xié)議基于 Kademila 網(wǎng)絡(luò)并且在 UDP 上實(shí)現(xiàn)。

DHT 由節(jié)點(diǎn)組成杨何,它存儲(chǔ)了 peer 的位置酱塔。BitTorrent 客戶端包含一個(gè) DHT 節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)用來(lái)聯(lián)系 DHT 中其他節(jié)點(diǎn)危虱,從而得到 peer 的位置羊娃,進(jìn)而通過 BitTorrent 協(xié)議下載。

  • peer: 一個(gè) TCP 端口上監(jiān)聽的客戶端/服務(wù)器埃跷,它實(shí)現(xiàn)了 BitTorrent 協(xié)議蕊玷。
  • 節(jié)點(diǎn): 一個(gè) UDP 端口上監(jiān)聽的客戶端/服務(wù)器邮利,它實(shí)現(xiàn)了 DHT(分布式哈希表) 協(xié)議。

如果對(duì) DHT 協(xié)議感興趣的話一定要看下 DHT 協(xié)議 的具體內(nèi)容垃帅,這里有 中文翻譯版本延届。(想要徹底讀懂項(xiàng)目的話一定要先了解該協(xié)議,代碼都是基于該協(xié)議實(shí)現(xiàn)的)

務(wù)實(shí)的實(shí)踐

項(xiàng)目來(lái)源

一般來(lái)講到 Python 爬取贸诚,大家的第一印象可能就是 requests/aiohttp祷愉,或者是 scrapy/pyspider 等爬蟲框架∩馄模基本上都是從指定的 HTML 頁(yè)面爬取信息二鳄。我有一個(gè)項(xiàng)目 torrent-cli 就是一個(gè)從資源網(wǎng)站上爬取磁力信息的工具。

趕緊上車

然而我

渴望進(jìn)步

想自給自足獲取磁力種子媒怯,Google 了一番订讼,發(fā)現(xiàn)大家基本上的代碼都是從 simDHT 這個(gè)項(xiàng)目來(lái)的,首先這個(gè)項(xiàng)目很棒扇苞,但是有個(gè)問題就是代碼實(shí)現(xiàn)細(xì)節(jié)基本沒有一行注釋且不兼容 Python3欺殿。而很多網(wǎng)上同類的代碼基本上也是對(duì)這個(gè)照搬....

眉頭一皺

所以我知道我要開始干活了

努力干活

經(jīng)過一波 happy coding 之后。

開開心心寫代碼

項(xiàng)目結(jié)構(gòu)

核心代碼

從 DHT 網(wǎng)絡(luò)中獲取磁力鏈接鳖敷。主要是利用一些大型的服務(wù)器 tracker脖苏,冒充 DHT 節(jié)點(diǎn),使用 UDP 協(xié)議加入到 DHT 網(wǎng)絡(luò)中一波搜索以及和其他節(jié)點(diǎn)搞好關(guān)系定踱,讓他們也分享我點(diǎn)資源棍潘。磁力數(shù)據(jù)存放在了 redis,利用 redis 的集合特性來(lái)去重崖媚。使用了多線程/多進(jìn)程亦歉,用于提高爬取效率。在我的本地機(jī)器(i7-7700HQ/16G 內(nèi)存/8M 網(wǎng)速)跑了一下畅哑,效果還不錯(cuò)肴楷,4 小時(shí)爬了 100 萬(wàn)條磁力鏈接。

$ redis-cli
127.0.0.1:6379> scard magnets
(integer) 1137627

然后代碼推送到我那臺(tái)性能強(qiáng)悍 1 核/2G 內(nèi)存/1M 網(wǎng)速阿里云服務(wù)器跑一下荠呐,哎....

利用 aria2 將磁力鏈接轉(zhuǎn)換為種子文件赛蔫。嘗試了一些其他的方式將磁力轉(zhuǎn)換為種子,但效果好像都不怎么理想泥张。使用過 libtorrent 的 Python 版本呵恢,不知道是我打開方式不對(duì)還是它本來(lái)效率就不高,反正愣是一個(gè)種子都沒有轉(zhuǎn)換成功圾结。

好氣喔

最后兜兜轉(zhuǎn)轉(zhuǎn)用到了 aria2 發(fā)現(xiàn)效率還可以瑰剃。這里利用多線程跑一個(gè)命令。所以要先把 aria2 安裝到你的 PATH 中筝野,具體參考官網(wǎng)介紹晌姚。

飯真香

解析種子文件內(nèi)容粤剧,同樣也是利用了 bencoder 進(jìn)行解碼。有了種子我們當(dāng)然要看看到底是些什么資源了啦挥唠。你說世界就是這么小抵恋,在我解析出來(lái)的幾百個(gè)種子文件中,居然有幾個(gè)都是一個(gè)社區(qū)的宝磨,那個(gè)以 1024 為標(biāo)志的社區(qū)弧关。

還有這種操作

有圖有真相

知乎社區(qū)

不過我還是希望大家銘記下面這 24 字箴言

社會(huì)主義核心價(jià)值觀

輔助代碼

  • database.py:封裝了關(guān)于 redis 的數(shù)據(jù)操作,主要是利用其集合數(shù)據(jù)結(jié)構(gòu)唤锉。
  • utils.py:一些工具函數(shù)

如何使用

獲取源碼及安裝依賴環(huán)境

$ git clone https://github.com/chenjiandongx/magnet-dht.git
$ cd magnet-dht
$ pip install -r requirements.txt
# 確保已經(jīng)安裝好 redis世囊,redis 的具體配置可以在 database.py 里面修改。

運(yùn)行項(xiàng)目

# 至于進(jìn)程數(shù)量可以在 crawler.py 進(jìn)行調(diào)整
$ python manage.py -h
usage: manage.py [-h] [-s] [-m] [-p]

start manage.py with flag.

optional arguments:
  -h, --help  show this help message and exit
  -s          run start_server func.
  -m          run magnet2torrent func
  -p          run parse_torrent func

深刻的感悟

自我學(xué)編程以來(lái)窿祥,我一直都是屬于興趣驅(qū)動(dòng)的株憾,對(duì)某種技術(shù)感興趣的話就會(huì)花時(shí)間去研究去嘗試。想成為一個(gè)有趣的人晒衩,去做一些有趣的事嗤瞎,真心覺得能把腦海里的想法轉(zhuǎn)變?yōu)榇a實(shí)現(xiàn)是件很棒的事,即使可能這件事在別人看來(lái)并沒有什么了不起听系。技術(shù)發(fā)展變化總是那么快贝奇,不緊跟著可能不小心就掉隊(duì)了。所以希望每個(gè)真心熱愛編程的人都能不忘初心靠胜,永遠(yuǎn)保持對(duì)新技術(shù)的熱情掉瞳,永遠(yuǎn)能從編碼中找到樂趣。

stay real, stay wild

項(xiàng)目地址

https://github.com/chenjiandongx/magnet-dht

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末髓帽,一起剝皮案震驚了整個(gè)濱河市菠赚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郑藏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘩欺,死亡現(xiàn)場(chǎng)離奇詭異必盖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)俱饿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門歌粥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拍埠,你說我怎么就攤上這事失驶。” “怎么了枣购?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嬉探,是天一觀的道長(zhǎng)擦耀。 經(jīng)常有香客問我,道長(zhǎng)涩堤,這世上最難降的妖魔是什么眷蜓? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮胎围,結(jié)果婚禮上吁系,老公的妹妹穿的比我還像新娘。我一直安慰自己白魂,他們只是感情好汽纤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著福荸,像睡著了一般冒版。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逞姿,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天辞嗡,我揣著相機(jī)與錄音,去河邊找鬼滞造。 笑死续室,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谒养。 我是一名探鬼主播挺狰,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼买窟!你這毒婦竟也來(lái)了丰泊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤始绍,失蹤者是張志新(化名)和其女友劉穎瞳购,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亏推,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡学赛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吞杭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盏浇。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芽狗,靈堂內(nèi)的尸體忽然破棺而出绢掰,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布滴劲,位于F島的核電站攻晒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哑芹。R本人自食惡果不足惜炎辨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聪姿。 院中可真熱鬧碴萧,春花似錦、人聲如沸末购。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盟榴。三九已至曹质,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擎场,已是汗流浹背羽德。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅办,地道東北人宅静。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像站欺,于是被迫代替她去往敵國(guó)和親姨夹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 做了一個(gè)磁力鏈接和BT種子的搜索引擎 {Magnet & Torrent}矾策,因此把 DHT 協(xié)議重新看了一遍...
    justjavac閱讀 8,609評(píng)論 1 24
  • 本文使用markdown編譯生成磷账,如果嫌長(zhǎng),左側(cè)附有目錄可直接跳轉(zhuǎn)贾虽,本文簡(jiǎn)書同步更新地址http://www.ji...
    愛咪哆閱讀 77,961評(píng)論 8 95
  • 種子站點(diǎn)的集中特性使得它們很容易被關(guān)閉(提供音樂逃糟、電影等版權(quán)內(nèi)容的種子文件的網(wǎng)站經(jīng)常會(huì)因法律原因而被關(guān)閉,如海盜灣...
    treelake閱讀 45,707評(píng)論 17 187
  • BT 1.0 誕生背景是傳統(tǒng)下載方式給用戶造成很多困難在傳統(tǒng)下載方式中榄鉴,一般是把文件由服務(wù)器端傳送到客戶端履磨,例如F...
    SMThree閱讀 2,050評(píng)論 2 12
  • 轉(zhuǎn)眼春回又一年,翩翩往事復(fù)流連庆尘。 風(fēng)云變幻從容過,歲月無(wú)痕余味研巷送。 舊歷輝煌留史冊(cè)驶忌,新篇精彩鑄當(dāng)前。 初心不改麒麟...
    梅蘭竹菊石閱讀 720評(píng)論 3 6