我在下面的代码中做了什么更改,以使用go colly在弹性中进行索引?
-
我想得到全文(strip-html,strip-js,如果需要的话渲染(,然后
-
使其符合avro模式{pageurl:,title:,content:},
-
批量发布到特定的弹性搜索"mywebsiteindex yyyymmdd"-可能使用配置文件,而不是硬编码。
代码片段会很棒。有没有一个示例代码显示爬行->抓取->屈服于弹性的">流水线"输出(例如在python scrapy框架中(。I.e管道框架支持。
对于插入松紧带,我正在考虑:https://github.com/olivere/elastic?
func main() {
c := colly.NewCollector(
colly.AllowedDomains( "www.coursera.org"),
colly.Async(true),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2,
})
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
e.Request.Visit(link)
})
pageCount :=0
c.OnRequest(func(r *colly.Request) {
r.Ctx.Put("url", r.URL.String())
})
// Set error handler
c.OnError(func(r *colly.Response, err error) {
log.Println("Request URL:", r.Request.URL, "failed with response:", r, "nError:", err)
})
// Print the response
c.OnResponse(func(r *colly.Response) {
pageCount++
urlVisited := r.Ctx.Get("url")
log.Println(fmt.Sprintf("%d DONE Visiting : %s", pageCount, urlVisited))
})
baseUrl := "https://www.coursera.org"
c.Visit(baseUrl)
}
您需要一个额外的库来将数据存储到弹性中,这是正确的。go colly只是在做工作的一部分。根据您的抓取策略,您需要编写一段代码来将抓取结果存储到索引中。
通常,您希望使用类似olivere/elastic的库,连接到elastic并初始化索引。然后,您可能想要一个函数,该函数将结构化数据存储到该索引中,并在您拥有要存储的所有数据时(从提供的代码片段中还不清楚是什么(,通过适当的go-colly回调(例如c.OnHTML()
(调用该函数。要了解更多关于如何使用olivere/elastic的信息(请注意,版本7有突破性的API更改,因此旧版本的一些教程可能不起作用(,请参阅godoc。
根据您的特定用例,需要做出许多决定(例如,决定如何在索引中构建数据,何时将数据发送到弹性数据-这意味着要使用哪一个colly回调,您希望如何刷新已经在索引中的页面,等等(
至于框架,我不知道有什么东西会有从抓取到存储在弹性中的最终管道。