磁力鏈接
現(xiàn)在我們使用迅雷等工具下載資源的時候,基本上都只需要一個叫做磁力鏈接的東西就可以了,非常方便。
私信小編01 02 03 04 即可獲取數(shù)十套PDF哦!
磁力鏈接是對等網(wǎng)絡(luò)中進行信息檢索和下載文檔的電腦程序。和基于“位置”連接的統(tǒng)一資源定位符不同,磁力鏈接是基于元數(shù)據(jù)文件內(nèi)容,屬于統(tǒng)一資源名稱。也就是說,磁力鏈接不基于文檔的 IP 地址或定位符,而是在分布式數(shù)據(jù)庫中,通過散列函數(shù)值來識別、搜索來下載文檔。因為不依賴一個處于啟動狀態(tài)的主機來下載文檔,所以特別適用沒有中心服務(wù)器的對等網(wǎng)絡(luò)。
磁力鏈接格式類似于 :
magnet:?xt=urn:btih:E7FC73D9E20697C6C440203F5884EF52F9E4BD28
分解一下這個鏈接
一般來講,一個磁力鏈接只需要上面兩個參數(shù)即可找到唯一對應(yīng)的資源。也有其他的可選參數(shù)提供更加詳細的信息。
種子/DHT
通過磁力就可以獲取種子文件從而進行下載,這跟直接使用種子下載時一個道理的,只是少了從磁力到種子文件的一個過程而已。
BitTorrent 協(xié)議的種子文件可以保存一組文件的元數(shù)據(jù)。這種格式的文件被 BitTorrent 協(xié)議所定義。擴展名一般為“.torrent”。BitTorrent 使用”分布式哈希表”(DHT)來為無 tracker 的種子(torrents)存儲 peer 之間的聯(lián)系信息。這樣每個 peer 都成了 tracker。這個協(xié)議基于 Kademila 網(wǎng)絡(luò)并且在 UDP 上實現(xiàn)。
DHT 由節(jié)點組成,它存儲了 peer 的位置。BitTorrent 客戶端包含一個 DHT 節(jié)點,這個節(jié)點用來聯(lián)系 DHT 中其他節(jié)點,從而得到 peer 的位置,進而通過 BitTorrent 協(xié)議下載。
務(wù)實的實踐
項目來源
一般來講到 Python 爬取,大家的第一印象可能就是 requests/aiohttp,或者是 scrapy/pyspider 等爬蟲框架。基本上都是從指定的 HTML 頁面爬取信息。我有一個項目 torrent-cli(github.com/chenjiandongx/torrent-cli) 就是一個從資源網(wǎng)站上爬取磁力信息的工具。
然而我想自給自足獲取磁力種子,Google 了一番,發(fā)現(xiàn)大家基本上的代碼都是從 simDHT(github.com/fanpei91/simDHT)這個項目來的,首先這個項目很棒,但是有個問題就是代碼實現(xiàn)細節(jié)基本沒有一行注釋且不兼容 Python3。而很多網(wǎng)上同類的代碼基本上也是對這個照搬....
所以我知道我要開始干活了
經(jīng)過一波 happy coding 之后
項目結(jié)構(gòu)
核心代碼
從 DHT 網(wǎng)絡(luò)中獲取磁力鏈接。主要是利用一些大型的服務(wù)器 tracker,冒充 DHT 節(jié)點,使用 UDP 協(xié)議加入到 DHT 網(wǎng)絡(luò)中一波搜索以及和其他節(jié)點搞好關(guān)系,讓他們也分享我點資源。磁力數(shù)據(jù)存放在了 redis,利用 redis 的集合特性來去重。使用了多線程/多進程,用于提高爬取效率。在我的本地機器(i7-7700HQ/16G 內(nèi)存/8M 網(wǎng)速)跑了一下,效果還不錯,4 小時爬了 100 萬條磁力鏈接。
$ redis
-
cli
127.0
.
0.1
:
6379
>
scard magnets
(
integer
)
1137627
然后代碼推送到我那臺性能強悍 1 核/2G 內(nèi)存/1M 網(wǎng)速阿里云服務(wù)器跑一下,哎....
最后兜兜轉(zhuǎn)轉(zhuǎn)用到了 aria2 發(fā)現(xiàn)效率還可以。這里利用多線程跑一個命令。所以要先把 aria2 安裝到你的 PATH 中,具體參考官網(wǎng)介紹。
有圖有真相
不過我還是希望大家銘記下面這 24 字箴言
輔助代碼
如何使用
獲取源碼及安裝依賴環(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 里面修改。
運行項目
# 至于進程數(shù)量可以在 crawler.py 進行調(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é)編程以來,我一直都是屬于興趣驅(qū)動的,對某種技術(shù)感興趣的話就會花時間去研究去嘗試。想成為一個有趣的人,去做一些有趣的事,真心覺得能把腦海里的想法轉(zhuǎn)變?yōu)榇a實現(xiàn)是件很棒的事,即使可能這件事在別人看來并沒有什么了不起。技術(shù)發(fā)展變化總是那么快,不緊跟著可能不小心就掉隊了。所以希望每個真心熱愛編程的人都能不忘初心,永遠保持對新技術(shù)的熱情,永遠能從編碼中找到樂趣。