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
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 OP @zaishanfeng 所以将来打算把网页获取相关的方法剖离出来,假如在移动平台上的话就可以操作 WebView 来获取渲染后的源代码之类的,或者 PhantomJS 。还可以加入 JSON 选择器,直接读取 API 之类的。这些慢慢地都会加到 RoadMap 里
|
4
zaishanfeng 2017-02-17 15:07:49 +08:00 via Android
@plqws 楼主把抽取规则独立出来的想法挺好的,我觉得这个规则脚本最基本得支持一些类似条件循环之类的语法特性, 至于做通用爬虫还不太实际,反爬 验证码 ip 之类的,复杂 js 规则,还有一些加密的 js ,还是得用真正的语言来做。 爬虫要做大规模扩展确实不容易
|
5
plqws OP @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 吗?
|
9
plqws OP @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 OP @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 解析,我就是这么干的
|