Как зацепить go -colly на elasticsearch? - PullRequest
0 голосов
/ 07 мая 2020

Какое изменение я должен внести в приведенный ниже код для индексации в elasti c с помощью go -colly?

  1. Я хочу получить полный текст (полоса html, полоса js, визуализация при необходимости), затем

  2. Соответствует схема avro {pageurl:, title :, content:},

  3. Массовая публикация с указанием c elasti c -search 'mywebsiteindex-yyyymmdd' - возможно, используйте файл конфигурации , а не жесткое кодирование.

Фрагменты кода подойдут. Есть ли пример кода go -colly, который показывает вывод " pipelining " для crawl-> scraping-> yield to elasti c (например, как в python scrapy framework). Т.е. конвейерная фреймворк поддержка.

Для вставки в эласти c рассматриваю: 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)
 }

1 Ответ

0 голосов
/ 07 мая 2020

Вы правы, что вам понадобится дополнительная библиотека для хранения данных в elasti c. go -колли выполняет только часть работы по очистке. В зависимости от вашей стратегии парсинга вам нужно будет написать код для сохранения результатов парсинга в индексы.

Как правило, вы хотите использовать такую ​​библиотеку, как Olivere / elasti c, подключитесь к elasti c и инициализируйте index. Тогда вы, вероятно, захотите иметь функцию, которая будет хранить структурированные данные в этом индексе и вызывать эту функцию из соответствующего обратного вызова go -colly (например, c.OnHTML()), когда у вас есть все данные, которые вы хотите сохранить (что на самом деле не ясно из предоставленного фрагмента кода). Чтобы узнать больше о том, как использовать Olivere / elasti c (обратите внимание, что версия 7 содержит критические изменения API, поэтому некоторые руководства для более старых версий могут не работать) см. godo c.

В зависимости от конкретного варианта использования необходимо принять множество решений (например, решить, как данные будут структурированы в индексах, когда данные должны быть отправлены в elasti c - что означает, какой обратный вызов go -colly использовать для этого, как вы хотите обновить sh страницы, которые уже находятся в индексе, и т. д. c.).

Что касается фреймворков, я не знаю ничего, что могло бы иметь конечный конвейер от очистки до хранения в эластичном c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...