使用erlang实现P2P磁力搜索-实现

这个爬虫程序主要的问题在于如何获取P2P网络中分享的资源,获取到资源后索引到数据库中,搜索就是自然而然的事情。

DHT

DHT网络本质上是一个用于查询的网络,其用于查询一个资源有哪些计算机正在下载。每个资源都有一个20字节长度的ID用于标示,称为infohash。当一个程序作为DHT节点加入这个网络时,就会有其他节点来向你查询,当你做出回应后,对方就会记录下你。对方还会询问其他节点,当对方开始下载这个infohash对应的资源时,他就会告诉所有曾经询问过的节点,包括你。这个时候就可以确定,这个infohash对应的资源在这个网络中是有效的。

关于这个网络的工作原理,参看:P2P中DHT网络爬虫以及写了个磁力搜索的网页。

获取到infohash后能做什么?关键点在于,我们现在使用的磁力链接(magnet url),是和infohash对应起来的。也就是拿到infohash,就等于拿到一个磁力链接。但是这个爬虫还需要建立资源的信息,这些信息来源于种子文件。种子文件其实也是对应到一个资源,种子文件包含资源名、描述、文件列表、文件大小等信息。获取到infohash时,其实也获取到了对应的计算机地址,我们可以在这些计算机上下载到对应的种子文件。

但是我为了简单,在获取到infohash后,从一些提供映射磁力链到种子文件服务的网站上直接下载了对应的种子。dhtcrawler里使用了以下网站:

https://zoink.it

使用这些网站时,需提供磁力哈希(infohash可直接转换),构建特定的URL,发出HTTP请求即可。

U1 = "http://torrage.com/torrent/" ++ MagHash ++ ".torrent", U2 = "https://zoink.it/torrent/" ++ MagHash ++ ".torrent", U3 = format_btbox_url(MagHash), format_btbox_url(MagHash) -> H = lists:sublist(MagHash, 2), T = lists:nthtail(38, MagHash), "http://bt.box.n0808.com/" ++ H ++ "http://www.likecs.com/" ++ T ++ "http://www.likecs.com/" ++ MagHash ++ ".torrent".

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjsyd.html