自己用 go 写的分布式爬虫,欢迎大家拍砖 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
wcong
V2EX    分享创造

自己用 go 写的分布式爬虫,欢迎大家拍砖

  •  2
     
  •   wcong
    wcong 2015-03-25 21:54:06 +08:00 17552 次点击
    这是一个创建于 3860 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ants-go

    最进在用golang开发的一个分布式的爬虫
    github:https://github.com/wcong/ants-go

    由来

    一直用scrapy抓数据。scrapy的分布式部署,需要人分配抓取链接,感觉很麻烦,一直想搞一个自动分发请求的分布式爬虫。
    基于scrapy改了一简陋的分布式爬虫ants,但是动态语言写起来有些混乱,正好正在学go,就用go写了一个分布式爬虫ants-go
    爬虫架构参考是scrapy,分布式的架构参考的是elasticsearch.
    目前已经可以试用,欢迎大家来拍砖.

    主要的功能

    • 分布式抓取数据
      • 自动选取master,各个node连接到master形成集群
      • master node分发请求,各个node执行完将结果发回master
    • 定制spider
      • 定制解析函数,不同链接对应不同的解析函数
      • spider可以实现多个cookiejar保存不同cookie数据
      • goquery解析html
    • web api

    主要模块

    • http:提供外部接口,查看cluster状态,开启spider,查看抓取状态
    • tcp:node之间连接,分发请求,汇总结果
    • node:管理当前节点
    • cluster:管理集群状态
    • distributer:把cluster队列的请求分发给各个node
    • downloader:执行请求,把response发到队列里
    • scraper:解析response,把解析的结果发到队列里
    • reporter:把当前node的抓取结果发送个master node

    欢迎拍砖,欢迎fork,欢迎一起完善

    github:https://github.com/wcong/ants-go

    22 条回复    2017-12-13 10:52:24 +08:00
    coosir
        1
    coosir  
       2015-03-25 22:01:58 +08:00   1
    各个node执行完将结果发[挥]master
    wcong
        2
    wcong  
    OP
       2015-03-25 22:04:42 +08:00   1
    @coosir ......,手残党
    qiang1012
        3
    qiang1012  
       2015-03-25 22:22:16 +08:00 via iPad   1
    正好要学go语言,star之!
    Tink
        4
    Tink  
    PRO
       2015-03-26 00:40:31 +08:00 via iPhone
    这个看起来很厉害啊
    ericls
        5
    ericls  
       2015-03-26 06:53:56 +08:00 via Android
    很厉害 虽然不懂go
    xiaoyaoking
        6
    xiaoyaoking  
       2015-03-26 07:39:07 +08:00 via Android
    搞这么多专业名词瞬间感觉自己啥都不懂了。。。
    qloog
        7
    qloog  
       2015-03-26 13:41:16 +08:00
    都开始自己写 分布式爬虫了,赞~~
    scrapy 还不太懂的路过吧。。
    kevinroot
        8
    kevinroot  
       2015-03-27 23:23:46 +08:00
    聪神威武~~~
    wcong
        9
    wcong  
    OP
       2015-03-29 19:35:38 +08:00
    @kevinroot 好巧
    monnand
        10
    monnand  
       2015-03-30 09:32:08 +08:00   1
    还没有看代码,但是从代码组织上看,不太符合Go语言的规范。参见Go的官方文档: http://blog.golang.org/organizing-go-code

    看这句:

    Sometimes people set GOPATH to the root of their source repository and put their packages in directories relative to the repository root, such as "src/my/package". On one hand, this keeps the import paths short ("my/package" instead of "github.com/me/project/my/package"), but on the other it breaks go get and forces users to re-set their GOPATH to use the package. Don't do this.

    简单说:

    把src/下面的代码都放到根目录下,修改相应的import path,让你的程序可以直接用go get安装。
    wcong
        11
    wcong  
    OP
       2015-03-30 10:50:03 +08:00
    @monnand 是有这个问题,thx,我立马改一下
    wcong
        12
    wcong  
    OP
       2015-03-30 11:49:03 +08:00
    @monnand 我考虑了一下,因为这不是一个传统的第三方库的项目,是一个完整的应用程序,需要依赖外部的conf,log等目录,所以把src/的代码都放到根目录下,有点不太合理
    monnand
        13
    monnand  
       2015-03-30 12:15:00 +08:00   1
    @wcong 其实,你这个疑问(以及你的理由)已经是go社区里的月经问题了。我简单给你总结一下之前的讨论。具体内容你可以去golang-nuts列表里讨论(鉴于这个问题已经属于月经问题了,很可能会被要求你在列表里先搜索一下答案)

    简单的回答是:你的需求和别的Go程序没什么区别,不要把代码放src里再让用户去修改GOPATH。你的项目的确不是“传统的”第三方库,但是是一个传统的Go可执行程序。所以还是依照传统方法解决。

    示例项目参见Go语言作者之一Brad Fitz的camlistore:

    https://github.com/camlistore/camlistore

    一个简单的理由是:用户自己配置的编辑器和各种开发环境,都会依赖当前设置的GOPATH。而如果每个项目都去让用户添加一个目录到GOPATH里面,各种工具之间就很难协调。

    至于其他理由,你可以去golang-nuts上面去搜索,我就不在这里细说了。

    标准的做法是这么做的:

    如果你的项目是github.com/myname/myproj,项目下有一个自己写的log库,在log/目录下,那么引用这个库的时候,import path就应该是github.com/myname/myproj/log。

    还有一些参考例子,比如Google的cAdvisor项目: https://github.com/google/cadvisor
    monnand
        14
    monnand  
       2015-03-30 12:31:42 +08:00   1
    @wcong 一条简单的原则是:绝大多数情况下,如果你的Go项目中有一个存放你自己代码的目录叫src,那很可能是你没有按照规范来写。

    具体理由我就不细说了,还是我刚才说的,你去golang-nuts那边搜索一下,或者发个邮件问问就好了。这里列举几个比较标准的Go项目,可以参考一下他们的组织结构,一下所有的项目,都是“完整的应用程序”,而非(仅仅是)第三方库:

    - 来自Google的kubernetes,一个项目包含多个可执行程序和库: https://github.com/GoogleCloudPlatform/kubernetes
    - 来自Google的cAdvisor: https://github.com/google/cadvisor
    - Go语言作者之一Brad Fitz的camlistore: https://github.com/camlistore/camlistore
    - 同样是Brad Fitz的goimports: https://github.com/bradfitz/goimports
    - 语法级别的自动补全程序,gocode: https://github.com/nsf/gocode
    - etcd: https://github.com/coreos/etcd

    还有很多,我就不一一列举了我想这些项目应该可以作为比较好的示例(尤其是Brad Fitz的项目)。
    wcong
        15
    wcong  
    OP
       2015-03-30 17:30:14 +08:00
    @monnand thx,这些信息很有帮助,我好好学习一下
    hustlzp
        16
    hustlzp  
       2015-03-30 18:19:00 +08:00
    收藏了
    monnand
        17
    monnand  
       2015-03-30 18:39:09 +08:00 via Android   2
    @wcong 不客气。和其他语言一样,Go语言有自己的一套独立的规范。个人觉得现在的官方文档把内容放得太分散,导致初学者必须把几份文档合在一起看。最好的办法还是看看官方的实际项目,这样有助于了解这个语言和相应工具的使用
    wcong
        18
    wcong  
    OP
       2015-03-30 20:23:12 +08:00
    已经参照的规范改过来了
    cgcs
        19
    cgcs  
       2015-04-01 14:53:05 +08:00
    @monnand 我来拜一下大神的
    jusonalien
        20
    jusonalien  
       2016-02-19 23:20:07 +08:00
    厉害~~ 学习学习~
    tweety
        21
    tweety  
       2017-08-31 10:23:48 +08:00
    建个群大家交流下
    tweety
        22
    tweety  
       2017-12-13 10:52:24 +08:00
    根据跑不起来
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2530 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 11:14 PVG 19:14 LAX 04:14 JFK 07:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86