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

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

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

    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  
       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   ·   实用小工具   ·   1067 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:34 · PVG 02:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.