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

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

  •  3
     
  •   plqws · 2017-02-17 14:39:29 +08:00 · 2752 次点击
    这是一个创建于 969 天前的主题,其中的信息可能已经有所发展或是发生改变。

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