V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
plqws

Go 实现的基于简单脚本的下一代开源爬虫框架 - Creeper

  •  3
     
  •   plqws ·
    wspl · Feb 17, 2017 · 4273 views
    This topic created in 3356 days ago, the information mentioned may be changed or developed.

    Creeper 是一个基于简单脚本( Creeper Script ,扩展名 .crs )的下一代开源爬虫框架。

    使用方法比较独特,可能需要捉摸一会儿才会理解。

    需要配合一门正经的编程语言(只开发了 Go 版本)来使用,先在 Creeper Script 内定义爬取规则,然后用 Go 代码来读取规则,再爬取资源。

    使用场景一般会用在需要同时采集大量不同网站,或者开发聚合阅读器时。(以后可能会增加 cli 和数据库访问支持)

    简单的用例:

    假如我想要爬取 HackerNews ,需要写出这样子的脚本,其实看起来有些类似 yaml 配合 jquery 的样子,但是其实差别挺大的。

    page(@page=1) = "https://news.ycombinator.com/news?p={@page}"
    
    news[]: page -> $("tr.athing")
    	title: $(".title a.storylink").text
    	site: $(".title span.sitestr").text
    	link: $(".title a.storylink").href
    

    之后在 Go 文件中来读取并使用这个脚本;

    package main
    
    import "github.com/wspl/creeper"
    
    func main() {
    	c := creeper.Open("./hacker_news.crs")
    	c.Array("news").Each(func(c *creeper.Creeper) {
    		println("title: ", c.String("title"))
    		println("site: ", c.String("site"))
    		println("link: ", c.String("link"))
    		println("===")
    	})
    }
    

    执行后,将会如期地输出类似下面的内容:

    title:  Samsung chief Lee arrested as S.Korean corruption probe deepens
    site:  reuters.com
    link:  http://www.reuters.com/article/us-southkorea-politics-samsung-group-idUSKBN15V2RD
    ===
    title:  ReactOS 0.4.4 Released
    site:  reactos.org
    link:  https://reactos.org/project-news/reactos-044-released
    ===
    title:  FeFETs: How this new memory stacks up against existing non-volatile memory
    site:  semiengineering.com
    link:  http://semiengineering.com/what-are-fefets/
    

    目前这个项目嘛,还处于刚刚把基本功能开发完毕的状态,也就是只是个玩具的状态,但是我也会慢慢地完善,并且补充容错机制还有加上测试代码。

    Github 地址: https://github.com/wspl/creeper

    项目根目录有个测试用的 eh 的爬取规则(逃

    项目基于 Apache 2.0

    14 replies    2017-02-19 15:02:28 +08:00
    zaishanfeng
        1
    zaishanfeng  
       Feb 17, 2017 via Android
    这个只能爬最简单的网站吧
    jackysc
        2
    jackysc  
       Feb 17, 2017
    有点意思 先 star 了。。
    plqws
        3
    plqws  
    OP
       Feb 17, 2017
    @zaishanfeng 所以将来打算把网页获取相关的方法剖离出来,假如在移动平台上的话就可以操作 WebView 来获取渲染后的源代码之类的,或者 PhantomJS 。还可以加入 JSON 选择器,直接读取 API 之类的。这些慢慢地都会加到 RoadMap 里
    zaishanfeng
        4
    zaishanfeng  
       Feb 17, 2017 via Android
    @plqws 楼主把抽取规则独立出来的想法挺好的,我觉得这个规则脚本最基本得支持一些类似条件循环之类的语法特性, 至于做通用爬虫还不太实际,反爬 验证码 ip 之类的,复杂 js 规则,还有一些加密的 js ,还是得用真正的语言来做。 爬虫要做大规模扩展确实不容易
    plqws
        5
    plqws  
    OP
       Feb 17, 2017
    @zaishanfeng 对,这个玩意其实就是用于一些比较简单的场景的,例如静态的资讯站图片站之类的,其实爬虫的循环是内置的机制,会自己获取当页所有的内容,还会自动翻页。。登录注册啥的现在不考虑。。以后也不会考虑加进去,因为这就脱离了这个爬虫的设计初衷了。。其实这个爬虫的灵感来自 Android 上的一个叫 H-Viewer 的聚合阅读器,嗯。
    a308057848
        6
    a308057848  
       Feb 17, 2017
    很喜欢,不过带上 cookie 还是很必要的
    scnace
        7
    scnace  
       Feb 17, 2017 via Android
    我们撸的 Golang 爬虫 把规则都封装成了 json 格式🌚 还有些比较复杂的还是用了 pure go 来写… 楼主用的也是 goquery 吗?
    plqws
        8
    plqws  
    OP
       Feb 18, 2017
    @scnace 对,用的 goquery ,不过之后打算解耦,让用户自己选择。。
    plqws
        9
    plqws  
    OP
       Feb 18, 2017
    @a308057848 之后会弄程序内设置 cookies 的接口,还有自动设置 referer 反防盗链之类的。。
    xlvecle
        10
    xlvecle  
       Feb 18, 2017
    下一代怎么定义
    run2
        11
    run2  
       Feb 18, 2017
    支持数组么? 怎么写 比如本页的 tag
    plqws
        12
    plqws  
    OP
       Feb 18, 2017
    @sobigfish 节点名后面加个 [] 就行了,然后把内容定义在子节点,目录下有个叫 eh.crs 的可以参考一下,内容 NSFW ,慎重测试 23333333
    dphdjy
        13
    dphdjy  
       Feb 18, 2017 via Android
    😳都是下一代
    ensonmj
        14
    ensonmj  
       Feb 19, 2017 via iPhone
    go 封装一层调用 phantomjs , js 解决各种高级控制逻辑, goquery 解析,我就是这么干的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3145 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 14:32 · PVG 22:32 · LAX 07:32 · JFK 10:32
    ♥ Do have faith in what you're doing.