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

你见过 Web 爬虫, 可是你见过 P2P 爬虫吗?

  •  5
     
  •   CrazySpiderMan ·
    Fuck-You-GFW · 2016-02-29 06:09:02 +08:00 · 5166 次点击
    这是一个创建于 3201 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网络爬虫爱好者为了爬取视频, 图片, 文档, 软件, 可能只想到写一个 Web 爬虫, 从各大网站爬取. 但是你知道吗? 这个世界上, 还有 DHT 协议, BitTorrent 协议.

    想想看, 全世界每天有那么多人通过 BT 种子 & 磁力链接下载资源(有你懂滴的资源), 如果写个爬虫, 从 DHT 网络里"监听"人们正在下载的资源, 然后把这个资源的种子信息给下载并保存下来. 打造成属于自己的海盗湾!

    这几天, 我用 Node.js 重写了我去年用 Python 写出的 DHT 爬虫 + BT 客户端 = P2P 爬虫. 为什么用 Node.js 重写呢? 除了我闲得蛋疼外, 还有个原因是 Node.js 在这个 Network IO 操作频繁的项目上, 性能非常非常牛逼, 占用也非常少! 不过代码难写倒是真的. 我花了好多天才重写出来.

    爬虫运行演示视频: http://v.youku.com/v_show/id_XMTQ4NTIzMDU2MA==.html

    默认参数下, 在最便宜的日本区 Vultr VPS 运行 24 小时, 可”监听"到 50 万 个 BT 种子信息. 我那个 Python 版的爬虫(只开源一部分), 已经爬了 1400 万种子信息, 连续运行了一年多.

    我平常下载资源, 都是从我私人种子数据库里搜索, 然后拿磁力链接去下载. 比如搜索引擎找不到的新电影, 我都能从我数据库找到.

    代码在这里: https://github.com/Fuck-You-GFW/p2pspider

    求 Star !

    如果你对此也有研究, 建议你看看 README.md, 列有这个项目如何发展的计划. 如果你对此感兴趣, 请 fork 它, 贡献你的智慧.

    如果你对 Node.js 比较熟练, 也欢迎你重构我的代码, 我对 Node.js 不是很熟, 代码写得不是很好.

    Star 到 1000 的时候, 我会写个文章, 给感兴趣但看不懂相关协议的人讲讲原理, 让每个人都可以写属于自己的 P2P 爬虫建立私人海盗湾. 包教会!

    如果有兴趣, 可加 QQ 群即时交流: 145234507 (不用微信群是因为很蛋疼)

    @vitovan @iugo (这就是我说的爬虫项目)

    第 1 条附言  ·  2016-02-29 10:44:57 +08:00
    Star 是程序员的优良美德. 下载了代码都不 Star 下, I am angry. :)
    第 2 条附言  ·  2016-02-29 14:44:38 +08:00
    看起来我程序得控制 TCP 连接数了, 好多人都把主机跑挂了. 说不定这程序还有内存泄露的问题. 不知有 Node.js 熟手看看呢? 我果真还是太菜了!
    第 3 条附言  ·  2016-02-29 17:06:50 +08:00
    我邀请了 MinggeJS 的作者来改进改进代码, 不知会不会来. 你们当初可把他喷惨了, 不晓得是不是弃 V2EX 走了. :)
    第 4 条附言  ·  2016-03-03 16:20:59 +08:00
    内存泄露已解决. 在默认参数情况下, 可随便艹了.
    第 5 条附言  ·  2016-03-05 23:38:24 +08:00
    QQ 群已解散, 建群真没得意思.
    97 条回复    2016-06-04 00:08:42 +08:00
    AstroProfundis
        1
    AstroProfundis  
       2016-02-29 06:27:03 +08:00
    弱弱问一下,国外很多版权保护组织用来抓盗版下载者的是不是也是类似的东西
    znoodl
        2
    znoodl  
       2016-02-29 07:22:52 +08:00 via iPhone
    肯定见过,要不然你以为那些 bt 站哪来的
    irockytan
        3
    irockytan  
       2016-02-29 07:46:46 +08:00 via iPhone
    好像很有意思
    CupTools
        4
    CupTools  
       2016-02-29 07:51:53 +08:00   ❤️ 1
    ericls
        5
    ericls  
       2016-02-29 08:16:17 +08:00 via iPhone
    磁力站就这么来的啊
    Xxss
        6
    Xxss  
       2016-02-29 08:24:03 +08:00 via Android
    很酷
    jedyu
        7
    jedyu  
       2016-02-29 09:12:53 +08:00
    scarlex
        8
    scarlex  
       2016-02-29 09:24:48 +08:00
    readme 上面由错字, reross -> feross
    CrazySpiderMan
        9
    CrazySpiderMan  
    OP
       2016-02-29 09:50:33 +08:00
    @jedyu 小虾开源的手撕包菜里的 simdht_worker.py, simMetadata.py 就是我写的. 前者直接从我 github 弄过去的, 后者间接从我这里得到的(没开源). :)
    CrazySpiderMan
        10
    CrazySpiderMan  
    OP
       2016-02-29 09:51:34 +08:00
    @AstroProfundis 可能噢. 细思极恐!
    CrazySpiderMan
        11
    CrazySpiderMan  
    OP
       2016-02-29 09:53:58 +08:00
    @znoodl 有些 BT 站是纯 BT 站, 就是靠别人上传的, 不是自己主动到 DHT 网络里抓取的.
    CrazySpiderMan
        12
    CrazySpiderMan  
    OP
       2016-02-29 10:02:56 +08:00
    @vitovan @iugo 看起来没收到我的 AT ?
    v1024
        13
    v1024  
       2016-02-29 10:34:51 +08:00
    跑了一下 很快就抓到了 牛逼
    wtbhk
        14
    wtbhk  
       2016-02-29 10:39:25 +08:00
    Cool!
    zhizhongzhiwai
        15
    zhizhongzhiwai  
       2016-02-29 11:07:05 +08:00
    你说 python 在网络 io 上不如 nodejs , 这个不太靠谱吧, 你用过 python gevent 吗?
    CrazySpiderMan
        16
    CrazySpiderMan  
    OP
       2016-02-29 11:08:01 +08:00
    @zhizhongzhiwai 几年前用过. 可能我太笨, 用不太好.
    MyFaith
        17
    MyFaith  
       2016-02-29 11:11:14 +08:00
    求问, Python 版的是哪个
    CrazySpiderMan
        18
    CrazySpiderMan  
    OP
       2016-02-29 11:14:34 +08:00
    @MyFaith Python 版的完整代码我没开源. 只开源了其中 DHT 爬虫部分. 地址: https://github.com/Fuck-You-GFW/simDHT

    完整版只有我少数几个朋友有. 我这不把 Python 版的给重写成了 Node.js 嘛, 而且真的比我那 Python 版好多了.
    ELIOTT
        19
    ELIOTT  
       2016-02-29 11:19:38 +08:00 via Android
    root@eu:~/p2pspider# node example.js

    /root/p2pspider/example.js:7
    btclient.on('complete', (metadata, infohash, rinfo) => {
    ^
    SyntaxError: Unexpected token >
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3
    root@eu:~/p2pspider# node -v
    v0.10.22

    請問要如何解決?
    vdo
        20
    vdo  
       2016-02-29 11:20:02 +08:00
    几年前就玩过了
    CrazySpiderMan
        21
    CrazySpiderMan  
    OP
       2016-02-29 11:29:31 +08:00
    @ELIOTT 恐怕 Node.js 得升级到 V4.X.X 版本才可以.
    CrazySpiderMan
        22
    CrazySpiderMan  
    OP
       2016-02-29 11:29:48 +08:00
    @vdo 还望前辈指点指点.
    ELIOTT
        23
    ELIOTT  
       2016-02-29 11:37:25 +08:00
    @CrazySpiderMan 感謝,使用 4.1.0 已成功。

    CrazySpiderMan
        24
    CrazySpiderMan  
    OP
       2016-02-29 11:38:45 +08:00
    @ELIOTT 你用的什么 SSH 连接工具? 看起来是在平板连接过去的.
    ELIOTT
        25
    ELIOTT  
       2016-02-29 11:42:41 +08:00
    @CrazySpiderMan JuiceSSH, 手機連接的.
    l0wkey
        26
    l0wkey  
       2016-02-29 11:43:52 +08:00
    @CrazySpiderMan 看状态栏应该是 juice
    jy02201949
        27
    jy02201949  
       2016-02-29 11:47:38 +08:00
    视频流媒体播放,冲着这个给 star 了,不知道楼主有没有后续开发的动力
    CrazySpiderMan
        28
    CrazySpiderMan  
    OP
       2016-02-29 11:52:11 +08:00
    @jy02201949 感谢 Star! 我开发它的另外目的之一就是借由这个项目, 不断增强自己的技术能力, 毕竟这个项目需要很多很多我现目前都没有的知识, 那么就有动力去学习相关知识.

    另外就是, 我时间多得很, 多得平常睡觉都要 12 个小时 :)
    CrazySpiderMan
        29
    CrazySpiderMan  
    OP
       2016-02-29 11:55:36 +08:00
    @CupTools 果真有人用 RethinkDB. 我关注它好久了, 然而并未用过. :)
    jasontse
        30
    jasontse  
       2016-02-29 11:56:02 +08:00 via iPad
    忠告:不管你是出于什么目的,***一定不要***在境外主机上跑这段程序。
    ooh
        31
    ooh  
       2016-02-29 11:56:18 +08:00
    老太太你还在搞这个?
    CrazySpiderMan
        32
    CrazySpiderMan  
    OP
       2016-02-29 11:59:02 +08:00
    @ooh 换了马甲都还有人活捉我. :(
    ooh
        33
    ooh  
       2016-02-29 12:06:15 +08:00
    @CrazySpiderMan 主要时你的马甲一般都比较 abnormal
    SlipStupig
        34
    SlipStupig  
       2016-02-29 12:11:58 +08:00
    smb 爬虫专业爬内网共享
    llhh
        35
    llhh  
       2016-02-29 12:40:27 +08:00
    见过 web 爬虫,也见过 p2p 爬虫。
    v2014
        36
    v2014  
       2016-02-29 12:42:10 +08:00
    @CrazySpiderMan 老太太,我下 metadata 时请求本机的 bt 下载软件,每次都可以,但是请求根据 dht 给的地址去下 metadata 时,基本被拒绝,应该是什么问题啊
    CrazySpiderMan
        37
    CrazySpiderMan  
    OP
       2016-02-29 12:48:11 +08:00
    @v2014 都不详细说说情况. 我又不是算命的.
    CrazySpiderMan
        38
    CrazySpiderMan  
    OP
       2016-02-29 12:48:47 +08:00
    @ooh @v2014 以后不要叫我老太太了. 太显眼了.
    CrazySpiderMan
        39
    CrazySpiderMan  
    OP
       2016-02-29 12:51:26 +08:00
    @SlipStupig samba 协议的爬虫?
    SlipStupig
        40
    SlipStupig  
       2016-02-29 13:16:23 +08:00
    @CrazySpiderMan 是的,为啥要叫你老太太呢?
    imlonghao
        41
    imlonghao  
       2016-02-29 13:17:01 +08:00
    @CrazySpiderMan 我的博客也在用 RethinkDB ,从 MongoDB 换过去的...
    CrazySpiderMan
        42
    CrazySpiderMan  
    OP
       2016-02-29 13:19:24 +08:00
    @imlonghao 嘿! 我认识你, 我在你博客留过言的. 是那个支付宝什么的文章.
    shiji
        43
    shiji  
       2016-02-29 13:20:20 +08:00
    能把番号集齐么?
    CrazySpiderMan
        44
    CrazySpiderMan  
    OP
       2016-02-29 13:20:42 +08:00
    @SlipStupig 我以前昵称就是老太太. 正巧认识我的人也在 V2EX 混.

    我很好奇, 你在哪里找到特别大的 samba 的网络呢? 以至于能写个爬虫了.
    CupTools
        45
    CupTools  
       2016-02-29 13:21:03 +08:00
    @CrazySpiderMan 我最近写了个邮件系统,用的就是 RethinkDB
    CrazySpiderMan
        46
    CrazySpiderMan  
    OP
       2016-02-29 13:22:09 +08:00
    @shiji 能否集齐就不晓得了, 没统计过. 反正特别多. 哈哈.
    CupTools
        47
    CupTools  
       2016-02-29 13:22:45 +08:00
    用 cluster 跑 4 线程: http://url.sc/k

    我想是不是 CPU 不够快
    AlexaZhou
        48
    AlexaZhou  
       2016-02-29 13:37:46 +08:00
    感觉楼主这个有点走偏了,满满的求 star 味道,这样求来的 star 是木有意义的

    个人认为开源一个项目,重要的是能给其他人带来价值,这样自然会有 star

    ps :建议先把文档弄好,这样 star 才会多,而不是说到了 1000star 才放文档...
    zqhong
        49
    zqhong  
       2016-02-29 13:43:04 +08:00
    @CupTools RethinkDB ,看起来很不错呀!一直想找类似这样的东西,十分感谢~
    lhbc
        50
    lhbc  
       2016-02-29 13:50:10 +08:00
    运营商那里, P2P 缓存系统都有
    CupTools
        51
    CupTools  
       2016-02-29 13:55:28 +08:00
    @zqhong 你的用途是什么?我可能可以帮得上
    CupTools
        52
    CupTools  
       2016-02-29 13:58:43 +08:00
    @CrazySpiderMan 话说内存占用很大。我看了看代码, LRU 不知道是是不是问题, Socket 数太大不知道是不是问题,总之我把这货丢到 32G 的机子都跑满内存

    防火墙上面看到这货开了 2900000+连接, netstat -an 直接 seg fault
    miyuki
        53
    miyuki  
       2016-02-29 14:27:50 +08:00 via Android
    vitovan
        54
    vitovan  
       2016-02-29 14:34:16 +08:00
    r#12 @CrazySpiderMan 晚上回去看~
    a342191555
        55
    a342191555  
       2016-02-29 14:34:58 +08:00
    在 HOSTUS 上成功跑挂了,找了客服向他解释了我在干啥后才恢复- -、、、
    He told me:
    Looks like it was suspended: SUSPENDING VPS xxxx (xxx.xxx.xxx.xxx); it has 65502 conntrack sessions
    CrazySpiderMan
        56
    CrazySpiderMan  
    OP
       2016-02-29 14:37:39 +08:00   ❤️ 1
    @AlexaZhou 有部分你说得对, 我改正.

    PS: 我之前看到你开发的 VeryNginx. 非常不错! 虽然我业余的, 用不到这个玩意儿, 但是我晓得这个绝对很有前景, 毕竟市场有这个需求, 又是较早出现的. 向你学习你的编程理念!
    SlipStupig
        57
    SlipStupig  
       2016-02-29 14:40:09 +08:00
    @CrazySpiderMan 以前校内网交换机只要改一下掩码就能过去,还有一些特殊场景,主要目的不在于有多大而是有多少东西
    CrazySpiderMan
        58
    CrazySpiderMan  
    OP
       2016-02-29 14:40:45 +08:00
    @CupTools 我对 Node.js 不是很熟, 我得排查排查. 不过, 程序自动退出没有?

    @a342191555 论买一个可耐操的 VPS 的重要性. :) 从某种意义来说, 运行这个爬虫, 就是主动对自己造成 DDOS 攻击. 所以要可以控制好 nodesMaxSize 的值.

    也许是 TCP 连接数太大? 我考虑考虑得限制下并发连接数了.
    xlrtx
        59
    xlrtx  
       2016-02-29 14:47:57 +08:00
    我也想写一个, 然后做个搜索站, 加上 aria2 的功能, 点击下载直接分配到家里的路由器上.
    welsmann
        60
    welsmann  
       2016-02-29 15:00:49 +08:00
    之前初学 Python 时写过一个,不过当时做了额外的种子文件内容解析,后来数据多到付不起 VPS 费用干脆就关掉了...
    AlexaZhou
        61
    AlexaZhou  
       2016-02-29 15:13:53 +08:00
    @CrazySpiderMan
    客气啦,我觉得 p2pspider 也很不错,这个想法很棒,再完善完善,可能成为一个超叼的开源项目

    大家一起加油⛽️⛽️
    msg7086
        62
    msg7086  
       2016-02-29 15:22:32 +08:00
    @CrazySpiderMan 耐艹请支付对应的价格。低价又耐艹的 VPS 必然是辣鸡。
    jasontse
        63
    jasontse  
       2016-02-29 15:30:44 +08:00 via iPad
    @CrazySpiderMan
    我刚才 SSH 回家里的 RPi 上运行,现在路由器的连接数全满。😹
    cnnblike
        64
    cnnblike  
       2016-02-29 16:01:47 +08:00
    卧槽,这个好强啊!
    PandaSaury
        65
    PandaSaury  
       2016-02-29 16:08:43 +08:00
    为毛没有 PHP 版本的?
    CupTools
        66
    CupTools  
       2016-02-29 16:10:11 +08:00
    @CrazySpiderMan
    @jasontse

    机房 G 口,独服+SSD 在跑,仍然掉链。应该是哪里有内存泄漏了
    CupTools
        67
    CupTools  
       2016-02-29 16:11:20 +08:00
    skylancer
        68
    skylancer  
       2016-02-29 16:37:58 +08:00
    “这几天, 我用 Node.js 重写了我去年用 Python 写出的 DHT 爬虫 + BT 客户端 = P2P 爬虫. 为什么用 Node.js 重写呢? 除了我闲得蛋疼外, 还有个原因是 Node.js 在这个 Network IO 操作频繁的项目上, 性能非常非常牛逼, 占用也非常少! 不过代码难写倒是真的. 我花了好多天才重写出来”

    老实说我还以为是 MingGe 附体
    CrazySpiderMan
        69
    CrazySpiderMan  
    OP
       2016-02-29 16:43:55 +08:00
    @skylancer 哈哈. 我喜欢 MingGe 的那狂放的气质. 搞程序就是要这么自大, 在别人的打击下, 成长得更快.
    123s
        70
    123s  
       2016-02-29 17:21:09 +08:00
    你写构造函数还是用旧的写法啊。
    完全 ES6 化
    第一条就不符合,当然我只是吐槽一下而已,很好的项目。
    CrazySpiderMan
        71
    CrazySpiderMan  
    OP
       2016-02-29 17:22:43 +08:00
    @123s 所以是待做嘛. 先实现, 再慢慢进化. 因为我一开始就不是很懂 ES6. ES5 + ES6 混着来的.
    hyq
        72
    hyq  
       2016-02-29 18:06:32 +08:00
    已经运行起来!!!!四国义
    CrazySpiderMan
        73
    CrazySpiderMan  
    OP
       2016-02-29 19:49:29 +08:00
    @CupTools 我看你 Linux 玩得挺转的. 我都忘了好多 Linux 命令了.
    leon3333
        74
    leon3333  
       2016-02-29 20:00:06 +08:00
    有意思,已 star ,有时间玩一下
    bearqq
        75
    bearqq  
       2016-02-29 20:58:02 +08:00 via Android
    有人吐槽连接数的问题,其实你的 python 版一样有,不要问我 vps 怎么被封的
    Garantion
        76
    Garantion  
       2016-02-29 21:10:06 +08:00
    小心蜜罐。
    CrazySpiderMan
        77
    CrazySpiderMan  
    OP
       2016-02-29 21:19:02 +08:00
    @Garantion 看样子你研究得还挺深的. 是的, 有蜜罐. 我见过好多次了.
    Garantion
        78
    Garantion  
       2016-02-29 21:42:25 +08:00
    @CrazySpiderMan 看来老司机还留了一手啊……
    wbsdty331
        79
    wbsdty331  
       2016-02-29 21:44:16 +08:00
    Ed2k Shareaza 呢
    CupTools
        80
    CupTools  
       2016-03-01 03:49:05 +08:00 via Android
    @CrazySpiderMan 睡了一觉起来, 13M 。然而线程全部挂了
    julor
        81
    julor  
       2016-03-01 07:19:52 +08:00 via Android
    @CrazySpiderMan ,我来歪个楼,既然不满意 python 怎么不用 golang ,这个需要用起来也很舒服。
    zqhong
        82
    zqhong  
       2016-03-01 09:27:16 +08:00
    @CupTools 谢谢。我有个和楼主类似的项目,数据库用的是 MySQL 。看了下 RethinkDB ,直观的 web 显示界面,还有 Python 客户端接口很人性化呀。而且呢, RethinkDB 存储的是 JSON 数据,以后作 API 接口也很方便。

    不知道这东西有什么坑吗?新手,请指教~
    CupTools
        83
    CupTools  
       2016-03-01 10:23:39 +08:00   ❤️ 1
    @zqhong 坑就是如果你用 filter 的话 RethinkDB 不会用 index 优化
    123s
        84
    123s  
       2016-03-01 10:27:58 +08:00
    @CrazySpiderMan 好吧,没看到是 todo
    CrazySpiderMan
        85
    CrazySpiderMan  
    OP
       2016-03-01 12:20:05 +08:00
    @julor 因为我喜欢全能型的编程语言. JavaScript / Node.js 正好. Golang 不能开发 Chrome 扩展. Golang 不能像 JavaScript/Node.js 那么方便开发跨平台的 PC 程序.
    hyq
        86
    hyq  
       2016-03-01 14:04:29 +08:00
    golang 可以开发 chrome 扩展,详情参见 npapi
    iugo
        87
    iugo  
       2016-03-01 15:04:28 +08:00
    以前没有接触过这样的协议, 也没深入过 Node.js.

    大概看了下代码, 有几个问题:
    1. DHTSpider 作为模块, 但是在模块内部就 `new` 似乎不太好.
    ```
    exports.start = function(options) {
    (new DHTSpider(options)).start();
    };
    ```
    2. 关于 JavaScript 的书写风格, 目前我遵从 https://github.com/feross/standard/blob/master/RULES.md .

    关于内存占用问题, 因为不懂 Node.js 也不好说. 不知道是不是因为无用的 UDP 连接没有被杀掉导致的.
    ttbt
        88
    ttbt  
       2016-03-01 16:17:24 +08:00
    @AstroProfundis 擦擦 可以参考下我站的数据 bt0.com 希望能用上你的 code
    CrazySpiderMan
        89
    CrazySpiderMan  
    OP
       2016-03-01 22:51:13 +08:00
    @ttbt 你站是个好网站! 我已收藏! 下了一个情色电影. :)
    ttbt
        90
    ttbt  
       2016-03-01 22:57:34 +08:00
    @CrazySpiderMan 我什么都不知道 就不能下个科幻啥的么 捂脸
    kozora
        91
    kozora  
       2016-03-02 10:30:13 +08:00
    @jasontse 抗投诉的比如俄罗斯这些可以吧?
    dismonday
        92
    dismonday  
       2016-03-02 15:41:35 +08:00
    顶一下
    CrazySpiderMan
        93
    CrazySpiderMan  
    OP
       2016-03-03 18:47:22 +08:00
    @CupTools 现在最新版爬虫已稳定了. 你可以去 github 瞅瞅.
    CupTools
        94
    CupTools  
       2016-03-04 05:58:50 +08:00 via Android
    @CrazySpiderMan 🌚最近在研究朴素贝尔斯算法
    CupTools
        95
    CupTools  
       2016-03-04 06:00:11 +08:00 via Android
    @CrazySpiderMan 建议用 Promise , callback 不堪入目
    CrazySpiderMan
        96
    CrazySpiderMan  
    OP
       2016-03-04 11:18:53 +08:00
    @CupTools 对数据进行分类? Promise 以后再写, 这个目前不是重点. 不过我把这个需求提到 issue 去.
    wico77
        97
    wico77  
       2016-06-04 00:08:42 +08:00
    作者对程序 bug 崩溃已经不 care 了。也不再维护了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1026 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 20:14 · PVG 04:14 · LAX 12:14 · JFK 15:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.