GrabantGo 語(yǔ)言開發(fā)的爬蟲框架
Grabant
go語(yǔ)言爬蟲框架,自定義javascript規(guī)則
Grabant是一個(gè)用go語(yǔ)言開發(fā),用javascript語(yǔ)法書寫規(guī)則的爬蟲框架 規(guī)則開發(fā)和神箭手的爬蟲規(guī)則類似,開發(fā)的目的是兼容大部分神箭手已有的規(guī)則
說(shuō)明
一些相關(guān)解釋及說(shuō)明如下:
掃描頁(yè)是直接配置的一級(jí)頁(yè)面,這個(gè)頁(yè)面掃描的結(jié)果是抓取列表頁(yè);
列表頁(yè)是掃描后的二級(jí)頁(yè)面,這個(gè)頁(yè)面是為了抓取內(nèi)容頁(yè);
內(nèi)容頁(yè)才是真正匹配我們需要內(nèi)容的規(guī)則的頁(yè)面,內(nèi)容頁(yè)會(huì)匹配我們需要的內(nèi)容并輸出;
每次掃描頁(yè)面,會(huì)抽取頁(yè)面的鏈接放入隊(duì)列進(jìn)行規(guī)則匹配,列表頁(yè)規(guī)則如果為空則列表頁(yè)抽取鏈接全放入列表隊(duì)列,同理內(nèi)容頁(yè),從內(nèi)容頁(yè)中抽取的數(shù)據(jù)是以xpath或者正則匹配的規(guī)則
舉個(gè)栗子: 如下是一個(gè)簡(jiǎn)易的爬豆瓣電影評(píng)分的規(guī)則
var configs = {
domains: ["movie.douban.com"],
interval: 3000,
scanurls: ["https://movie.douban.com/cinema/nowplaying/shenzhen/"],
helperurlregexes: ["https://movie\\.douban\\.com/subject/\\d+/\\?from=playing_poster"],
fields: [
{
name: "film Name",
selector: "http://*[@id=\"content\"]/h1/span[1]",
required: true
},
{
name: "Rank",
selector: "http://*[@id=\"interest_sectl\"]/div[1]/div[2]/strong"
required: true
}
]
};
// 使用以上配置創(chuàng)建一個(gè)爬蟲對(duì)象
var crawler = new Crawler(configs);
// 啟動(dòng)該爬蟲
crawler.start();
configs是一個(gè)json配置對(duì)應(yīng)的字段意義如下:
domains
定義應(yīng)用爬取哪些域名下的網(wǎng)頁(yè)
interval
爬取頁(yè)面需要的延時(shí),毫秒
scanUrls
定義入口頁(yè)url, 從入口頁(yè)url開始爬取數(shù)據(jù)
contenturlregexes
設(shè)置內(nèi)容頁(yè)url的正則表達(dá)式
helperurlregexes
設(shè)置列表頁(yè)url的正則表達(dá)式
field
定義一個(gè)從內(nèi)容頁(yè)中抽取數(shù)據(jù)的抽取項(xiàng),包括以下內(nèi)容
-
name
抽取項(xiàng)的名稱
-
selector
抽取項(xiàng)的匹配規(guī)則,可以是正則表達(dá)式或者Xpath
-
selectortype
定義抽取區(qū)的類型,正則為SelectorType.Regex, XPath為SelectorType.XPath,如果不設(shè)置默認(rèn)為XPath
-
required
bool類型,如果為true,則此項(xiàng)必須存在才爬取此數(shù)據(jù)
使用方法
grabant -rule /路徑/規(guī)則文件
編譯
go get github.com/robertkrimen/otto go get github.com/bitly/go-simplejson go build
v0.01
此版本是一個(gè)原型版本,目前還有很多判斷不嚴(yán)密的可能引起crash的問題;
和神箭手不同之出目前有兩個(gè),一是configs項(xiàng)區(qū)分大小寫,需要全為小寫,二fields中selector只支持字符正則;
現(xiàn)在此版本還未實(shí)現(xiàn)多個(gè)對(duì)象及回調(diào)方法,只支持最簡(jiǎn)單的json規(guī)則.
