V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
flamhaze5946
V2EX  ›  分享创造

写了个 java 版的 DHT 爬虫..半成品 ←_← 有很多问题..

  •  
  •   flamhaze5946 · 2015-10-06 00:40:36 +08:00 · 5730 次点击
    这是一个创建于 3346 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 findnodes 找到的节点几乎都无法访问, 不知道是不是解析 node 信息的时候出了问题.
    把 Node 放到 Bucket 中,当 Bucket 满了后会进行 Bucket 分裂操作,目前的做法是,每个 Bucket 中最多可以放 8 个 Node,分裂规则是第一个 Bucket 的 nodeIdMax = 2 ^ 160, nodeIdMin = 0,第一次分裂变为两个 Bucket,第一个 Bucket 的 nodeIdMax = 2 ^ 160 / 2, nodeIdMin = 0,第二个 Bucket 的 nodeIdMax = 2 ^ 160, nodeIdMin = 2 ^ 160 / 2 + 1,简单的说就是平均分为两个区间~这样做某些情况会产生很多空的 Bucket,例如 id[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}的情况....

    求建议要怎么样才能做出一个像样的 DHT 爬虫, 还有 Bucket 的分裂方法有没有什么好的方案.
    代码中有什么可以改进的地方, 谢啦~~

    github 地址
    https://github.com/flamhaze5946/DHTSpider

    9 条回复    2017-10-09 18:16:34 +08:00
    whywhy36
        1
    whywhy36  
       2015-10-06 05:20:32 +08:00   ❤️ 1
    前段时间无聊,写了一套 DHT 爬虫, torrent parsing 加上搜索前端网站,不过主要是用 Ruby, 并且用 Redis 作为中间存储的, Postgres 作为最终最终存储并且提供文本搜索的。跑起来之后效率还是不错的。

    爬虫: https://github.com/whywhy36/DHTDigger
    简单的半成品网站,提供搜索和多数据源输入: https://github.com/whywhy36/SearchMagnet

    两个都是半成品,但是核心功能都在了。其中爬虫部分您可以大概看下,希望有帮助 :-)
    pagxir
        2
    pagxir  
       2015-10-06 11:29:34 +08:00   ❤️ 1
    > 这样做某些情况会产生很多空的

    基本不会产生空的 bucket, 如果大概率产生了,说明你的实现有问题。因为一旦需要分裂,那么新分离出两个 bucket 需要存 9 个 node 的。而 bucket 仅能存 8 个,所以另外一个至少有 1 个 node.

    你举例是个特例,实际上是不会出现的。因为 node 的 update 基本上是随机的,所以能比较平均的落入 bucket 中。如果出现你所说的情况,你需要在这个 node tables 中对落入这 bucket 空间的一个随机 nodeid 执行 findnode 操作。
    laotaitai
        3
    laotaitai  
       2015-10-06 12:20:20 +08:00   ❤️ 1
    既然是要写专业的 DHT 爬虫, 那么就不要太遵守 DHT 协议了, 只要了解了本质, 就跟功夫一样, 本质就是拿来杀人, 舞来舞去的花招都比不上一个直拳来得简单粗暴. 所以, 什么 bucket, 分裂什么的, 都是拿给下载工具去遵守的.

    看看这家伙写的:
    Python 版:
    http://t.cn/RyYmooB

    Ruby 版:
    http://t.cn/RyYmQ4c

    他还有个 NodeJS 版, 不过弃坑了, 里面很多代码都是"假"的, 不建议看. 我最喜欢 Ruby 版的, 简洁优美, 代码写得有点生涩, 效果还是很不错的. 如果你实现了 DHT 爬虫部分, 不满足于单纯的 infohash, 进一步想从 DHT 网络里下载种子的 metadata 部分, 就去看看 NodeJS 版里的有个 issue, 他建议了要实现这个从 DHT 下载 metadata 的功能, 需要看什么文档.

    你搞 Java 的, 看懂这俩个语言应该是小 case 吧?
    flamhaze5946
        4
    flamhaze5946  
    OP
       2016-05-23 09:41:30 +08:00
    @whywhy36 非常感谢, 最近我会看看实现的~~接下来看看能不能整合到我的项目中去~~
    flamhaze5946
        5
    flamhaze5946  
    OP
       2016-05-23 09:42:49 +08:00
    @pagxir 好的, 随机性好的话应该是没问题的, 到时候我测试一下, 非常感谢!!!
    flamhaze5946
        6
    flamhaze5946  
    OP
       2016-05-23 09:44:12 +08:00
    @laotaitai 谢谢推荐~~准备把他的代码研究一下, 看看我现阶段是哪里实现错了所以才一直连接不上其它节点..
    unique
        7
    unique  
       2016-08-08 16:23:09 +08:00
    楼主还在维护这个项目吗?
    flamhaze5946
        8
    flamhaze5946  
    OP
       2016-09-18 10:35:48 +08:00
    @unique 暂时没有了, 最近搞 rpc 比较忙
    summerLast
        9
    summerLast  
       2017-10-09 18:16:34 +08:00
    你好 有什么好的学习资料吗 比较感兴趣
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:40 · PVG 10:40 · LAX 18:40 · JFK 21:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.