精华 我用NodeJS写了个DHT爬虫, 发现比Python写出的还牛逼!
发布于 10 年前 作者 laomayi 55671 次浏览 最后一次编辑是 8 年前 来自 分享

什么是DHT爬虫? 来, 给你个最直接的表达, 请直达:btbook.net

上周五, 找程序员方面的工作, 网上对方问我是否会NodeJS, 答曰不会, 于是给我4天的时间学习NodeJS, 4天后就去他那面试(就今天), 学了7, 8个小时, 实在按捺不住, 得写个什么玩意儿, 不然干看书真无聊, 于是拿着半吊子的NodeJS知识来打算重写掉这个我之前用Python写的simDHT, 现在NodeJS版是这个 nodeDHT, 现在在免费的AWS上跑了20个小时, 一共跑了900万资源hash(今天面试官问我跑了多少, 我居然口急说成是9000万, 汗, 但愿没发现出我这个表达bug, 不然面试不过啦). 由于数据量庞大, 很难用sort -u来去重, 免费的AWS配置超低的, 保守估计有500万唯一资源hash, 再去掉无效的infohash资源, 保守能搞到150万真实种子, 这150万种子里, 保守有30万的影视资源, 所以, 你懂滴… 好邪恶哦.

说说NodeJS版 VS Python版: 1, NodeJS效率更强劲, 但代码不好理解, 估计是我这半吊子NodeJS知识不够. 2, Python代码看起来很单调, NodeJS看起来有点geek风. 3, NodeJS的依赖安装真省事. 4, 用NodeJS的异步来干这个事, 真适合. update(2014-10-31): 经过再次对Python版的simDHT进行重构, 现在和nodeJS版不相上下了.

总结: 就单单论这个DHT爬虫, NodeJS赢了.

顺便请教下, 怎么把代码整得像线性似的?

PS: 不要问我DHT爬虫是如何做成BT站的. 你要是觉得我这个写得不错, 请点个star. TKS! 话说github的star越高, 越容易得到面试机会, 大家帮帮我哈. 失业很无聊. 么么哒!

18 回复

什么叫代码像线性似的? 不用回调吗?

整成类似同步方式的话,就是promise啦。

do_step1()
.then(function(){
    return do_step2()
})
.then(function(){
   ....
})

撸主是要这个吗?

爲什麼要同步式?

@ryanking8215 这写法好有趣, 查了下, 可用bluebird是吧? tks!! 么么哒!

@xadillax 万一哪天要写一个几万行的项目, 代码是同步, 运行是异步, 这多爽啊

@laomayi ES6 就是这样的。但是至今还是喜欢异步写代码的方式。

promise有性能损,ES6 也是。 归递调用时最爽的。

@MiguelValentine 每天看见自己的node代码里面最后一行有20个右花括号特别有成就感,恩

@zzjin 我就不相信你看到你同事的代码回调特别多的时候, 你能维护得了.

@zzjin 归递调用,AMD写法,不是回调金字塔

async 来处理挺爽的,eventProxy看着也挺爽的。写起来感觉不错啊

var dgram = require(‘dgram’);

var socket = dgram.createSocket(‘udp4’);

socket.on(‘message’, function (message, remote) { //显示server发回的消息 console.log(‘server ip:’ + remote.address + ‘, port:’ + remote.port +’, message:’ + message); });

//监听端口 socket.bind(33333);

//发送消息 function send(server){ var message = new Buffer(“心花路放”); socket.send(message, 0, message.length, 6881, server, function(){ //1秒后再次发送 setTimeout(function(){ send(server); }, 1000); }); };

send(“127.0.0.1”);

为什么没有爬到任何东西出来?

Fibjs作者快点来 :)

@coolicer 跟Fibjs作者毛关系哦.

@laomayi 完全看不懂啊亲。。。。。

@514366607 我小学文化的人都看得懂呢…

回到顶部