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

2017-02-17 14:39:29 +08:00
 plqws

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/341189

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX