Может ли Colly, мощный, эффективный и простой в использовании краулер Golang, заменить Scrapy?

рептилия

предисловие

Любой друг, который плохо знаком с программированием краулеров, может быть знаком или более или менее знаком с инфраструктурой краулеров, основанной на асинхронной среде Python Twisted.Scrapy. Scrapy разрабатывался почти 7 лет и является создателем фреймворка для краулеров, который, естественно, стал самым популярным и широко используемым фреймворком для краулеров. Естественное преимущество Scrapy заключается в том, что он поддерживает параллелизм и интегрирует общие функциональные модули в программы поисковых роботов, такие как HTTP-запросы, загрузка, синтаксический анализ и планирование, так что инженеры поисковых роботов могут сосредоточиться только на анализе страниц и формулировании правил сканирования. процесс разработки поискового робота и повышает эффективность разработки.

но,Scrapy не идеален, у него все же есть немало недостатков. Среди них его настройка шаблона стала обоюдоострым мечом, ограничивающим проект краулера Scrapy: с одной стороны, Scrapy абстрагирует различные необходимые модули, включая краулер (Spider), результат захвата (Item), промежуточное ПО (Middleware), конвейер ( Конвейер), настройка (Setting) и т. д., чтобы пользователи могли напрямую написать программу искателя, которую они хотят разработать в соответствии с определенными правилами; с другой стороны, из-за этих весьма абстрактных модулей весь проект искателя выглядит раздутым, и каждый проект искателя потребности Несколько файлов генерируются по соответствующим шаблонам, что делает управление конфигурацией и поисковым роботом относительно запутанным. Более того, Scrapy кажется более чем достаточным в некоторых особых сценариях, таких как распределенное сканирование, поэтому многим старшим инженерам сканеров даже приходится изменять исходный код Scrapy, чтобы соответствовать бизнес-требованиям.

Для решения этих проблем был создан краулер-фреймворк на основе статического языка Golang.CollyРодился в конце 2017 года. Хотя он не так известен и популярен, как Scrapy, попробовав его, я обнаружил, что у него есть одно особенное преимущество:Легкость. Согласно представлению функции на официальном сайте Colly, он имеет чистый API (Clean API), быстрый (Fast), естественную поддержку распределенного (Distributed), синхронного/асинхронного/параллельного очистки (Sync/async/parallel scraping), богатые расширения. (Расширения) и многие другие функции. Кратко прочитав документацию Colly, автор попытался написать несколько относительно простых поисковых программ с помощью Colly и обнаружил, что после написания код каждого веб-сайта содержит только один файл. короче,Он довольно легкий и не требует большого количества избыточного кода для реализации нужной логики..

На картинке ниже показано сравнение количества звезд на Github между Colly и Scrapy. Видно, что Колли развился относительно поздно, количество звезд меньше, чем у Скрэпи, на треть, но все равно быстро растет. В этой статье основное внимание будет уделено этому молодому и мощному фреймворку для поисковых роботов: Colly.

Статический язык Голанг

Colly разработан на основе статического языка Golang. Как мы все знаем, Golang тоже относительно молодой язык, всего 13 лет истории (по сравнению с историей Python 30 лет). Golang, естественно, поддерживает concurrent, и необходимо настроить координацию (COROUTINE), просто добавьте ее перед вызовом функции.goКлючевые слова — это все, что вам нужно, очень просто. Конечно, в Golang есть и другие замечательные функции, такие как каналы (chan). Однако для сканеров очень важно поддерживать параллелизм, поскольку эффективный сканер должен занимать как можно больше ресурсов пропускной способности сети.Функции параллелизма Golang дают преимущества при написании фреймворков для поисковых роботов.. В отличие от Python, если вы хотите добиться параллелизма, вам нужно проделать много работы, в том числе использоватьasyncioБиблиотеки и заимствования из JavaScript ES7async/awaitСинтаксис не очень интуитивен.

Ниже приведен пример асинхронного синтаксиса в Golang.

func run() {
    fmt.Printf("hello world")
}

func main() {
    go run()
}

Ниже приведен пример асинхронного синтаксиса Python.

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

# Python 3.7+
asyncio.run(main())

У Golang как статического языка есть еще одно очень важное преимущество:Предсказуемость. Статические языки требуют, чтобы все переменные, параметры и результаты, возвращаемые функцией, указывали соответствующие типы, а правильность типа будет проверяться во время компиляции для обеспечения надежности кода. Одним из преимуществ написания на статическом языке является то, что вы можете уберечь себя от множества ошибок, вызванных ошибками типов. Поэтому для масштабных проектов с высокими требованиями к надежности и отказоустойчивости более разумным выбором будет написание на статическом языке. При написании программ на Golang среда IDE автоматически завершает потенциальный код на основе типов или переменных, разве это не восхитительно? Наоборот, динамические языки, представленные Python, не такие строгие. Хотя Python является строго типизированным языком, в нем нет процесса предварительной компиляции, поэтому ошибки типов не могут быть обнаружены во время компиляции. Много раз, если передается неправильный тип, это вызывает ошибку во время выполнения (Runtime). То же самое и с циркулирующим в Интернете «момент ненадолго остывает, а крематорий реконструируется». В то время как динамические языки, такие как Python, дают некоторую гибкость парсингу результатов, на мой взгляд,Статический язык (например, Golang) был бы более разумным выбором для крупных проектов поисковых роботов..

Colly

Я также представил его раньше.Colly— это краулер-фреймворк, написанный на Golang. Колли на самом деле является прозвищем Коллекционера или Коллекционера. Он компактен, прост в использовании, мощен и эффективен и постепенно становится предпочтительным выбором для краулеров, помимо Scrapy.

Давайте используем пример, чтобы увидеть, как это делается. (Эта статья не является справочным документом по Colly. Я надеюсь представить преимущества и функции Colly только на некоторых примерах. Чтобы увидеть все API, см.Документация официального сайта Colly)

Создать в любом каталогеbaidu_spider.goфайл и введите следующий код.

package main

import (
	"fmt"
	"github.com/crawlab-team/crawlab-go-sdk/entity"
	"github.com/gocolly/colly/v2"
)

func main() {
    // 生成 colly 采集器
	c := colly.NewCollector(
		colly.AllowedDomains("www.baidu.com"),
		colly.Async(true),
		colly.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"),
	)

    // 抓取结果数据钩子函数
	c.OnHTML(".result.c-container", func(e *colly.HTMLElement) {
        // 抓取结果实例
		item := entity.Item{
			"title": e.ChildText("h3.t > a"),
			"url":   e.ChildAttr("h3.t > a", "href"),
		}
        
        // 打印抓取结果
		fmt.Println(item)
		
        // 取消注释调用 Crawlab Go SDK 存入数据库
		//_ = crawlab.SaveItem(item)
	})

	// 分页钩子函数
	c.OnHTML("a.n", func(e *colly.HTMLElement) {
		_ = c.Visit("https://www.baidu.com" + e.Attr("href"))
	})

	// 访问初始 URL
	startUrl := "https://www.baidu.com/s?wd=crawlab"
	_ = c.Visit(startUrl)

	// 等待爬虫结束
	c.Wait()
}

Над этим рептилированным скриптом только 40 строк кода. Если вы хотите SCRAPY для достижения такой же функции, это может потребовать дополнительных файлов кода и каталогов.

Как видно из кода, программа-краулер Colly очень проста в написании и в основном состоит из четырех частей:

  1. Сгенерировать коллекционера Колли (Коллекционер)cи передать некоторую информацию о конфигурации;
  2. OnHTMLфункция крюка, в том числеcolly.HTMLElementЭкземпляр элемента, здесь в основном логика обработки результата захвата;
  3. c.VisitДоступ к функциям, как в Scrapyyield scrapy.Request;
  4. c.WaitОжидание функции, ожидание выполнения программы-рептилии Colly.

После создания выполнить в каталогеgo run baidu_spider.go, вы можете запустить поисковик Baidu по ключевым словам «crawlab». Результат выполнения аналогичен следующему.

...
map[title:docker安装爬虫管理工具crawlab - kindvampire - 博客园 url:http://www.baidu.com/link?url=ueCY-MwzzGwaVqXw3Q18Fz8rEodI1P_mv60lRd8H0UZdFC4xVnVwWtsh-HpiwaOFI1zVjZFeVca]
map[title:crawlab python脚本关联mongodb结果集,实例_kai4024589..._CSDN博客 url:http://www.baidu.com/link?url=2wFQZaLoEk7OOTHrf1LOJcPiBAZEFETQYbjrqnrJi_Wfqdx-gPFIyjt2q3f7lTC-8A6SWz_l8zE6D8SBs1j0c4DOIwbdAw8i]
map[title:手把手教你如何用Crawlab构建技术文章聚合平台(一)_wei..._CSDN博客 url:http://www.baidu.com/link?url=nr9NOz2dqYFuaU5E1Zjz0OIfeeixSADNBNcHwj4dw9zypIky-9dVxd4RdzdS8-JMP7_X-LYpo0ydWmB8VNBmqq]
map[title:tikazyq-crawlab-master crawlab爬虫平台 适合scrapy分布式部署... url:http://www.baidu.com/link?url=VibsGu0BinYAUR_96pWCmcELObAXIPn7rKprlc9HR_607_cuEbxlcShUHqXjOoV6dnc4pND5F0K]
map[title:手把手教你如何用Crawlab构建技术文章聚合平台(一) - 个人文章... url:http://www.baidu.com/link?url=SG6dJcLc20xIuiesjRIXu2XzGSR0N674BEnUTveJhYe5mRc9SFtggk-NL0pmAAa]
map[title:爬虫管理平台Crawlab v0.3.0发布(Golang版本) - 个人文章... url:http://www.baidu.com/link?url=TItw3zWB4jHCoGmoQMm01E7oP2WlwfX7BRMsA9WDhaxHeQZZDi3I8bZh_kgTfpNx4fhtf42_]
map[title:Crawlab 单节点服务集群搭建部署简明教程 - 个人文章 - Segment... url:http://www.baidu.com/link?url=cuYEFA1zjqK1GiEmDCjwRMLDGFVKDsz6u4ljYjQol-VwDdr_cBS9Y3UlgChkyCuO7A_]
...

Вам может быть интересно, куда идут модули, определенные в Scrapy, такие как Pipeline и Middleware? На самом деле, на что нужно обратить внимание, так это на то, что эти модули не нужны, а абстрагируется некоторая практическая логика, подведенная большими парнями в процессе разработки краулеров. Если вы хотите реализовать Pipeline в Colly, непосредственно вc.OnHTMLФункция обратного вызова в функции ловушки может вызывать последующую функцию обработки, например следующий код.

...
	c.OnHTML(".result.c-container", func(e *colly.HTMLElement) {
		item := entity.Item{
			"title": e.ChildText("h3.t > a"),
			"url":   e.ChildAttr("h3.t > a", "href"),
		}
        
        // 后续处理抓取结果
        PostProcess(item)
	})
...

Из этого примера видно, что API Colly очень прост и понятен, и именно эта простота придает ему очень высокуюГибкость, что позволяет разработчикам делать множество сложных вещей внутри фреймворка.

Конечно, у Колли есть и недостатки. Судя по текущему прогрессу разработки, Colly, похоже, не может поддерживать захват динамически отображаемого контента, такого как рендеринг данных Ajax, для которого в Scrapy есть множество готовых решений. Но из недавнего GithubPull RequestС точки зрения, поддержка динамического рендеринга контента должна быть реализована в ближайшее время.chromedp, то есть поддержка вызова Chromium для запуска содержимого JavaScript. Кроме того, у Colly, похоже, нет встроенной системы логирования и модуля статистики данных в Scrapy, которые кажутся слишком легковесными.

Тем не менее, у нас есть основания полагать, что Colly будет становиться все более и более всеобъемлющим и мощным по мере того, как он продолжает развиваться в будущем.

Интеграция с Crawlab

CrawlabЭто распределенная платформа управления сканерами, которая поддерживает любой язык и инфраструктуру и теоретически может запускать все типы сканеров, включая Colly и Scrapy. Друзья, которые не знают о Crawlab, могут проверить егоОфициальный сайт Кролаба такжеГитхаб Главная).

первое использованиеCrawlab CLIЗагрузите файл сканера.

~/projects/tikazyq/colly-crawlers/baidu(master*) » crawlab upload
go.mod
go.sum
baidu_spider.go
uploaded successfully

Затем введите команду выполнения в интерфейсе сведений об искателе Crawlab.go run baidu_spider.goНажмите «Беги», чтобы открыть рептилий. Тогда рептилия начнет бежать.

Подождите некоторое время, и поисковый робот завершит работу. Мы можем увидеть распечатанный результат в журнале.

И мы также можем просмотреть захваченные данные результатов в «Результатах». Эти результаты по умолчанию сохраняются в базе данных MongoDB.

Поэтому очень удобно использовать Crawlab для управления краулером Colly.

Суммировать

Эта статья начинается с ознакомления с преимуществами и недостатками известного краулера Scrapy и представляет Colly, эффективную и простую краулер-фреймворк, основанную на Golang. Затем мы используем пример сканирования поисковой системы Baidu, чтобы проиллюстрировать преимущества Colly, то есть его оптимизированный и чистый API, надежность статического языка и многие другие полезные функции. Появление Колли может символизировать стремление разработчиков краулеров к простоте.Создайте большую ценность с чем-то простым и чистым.爬虫技术的发展,是一个开发流程由复杂变简单、而程序功能由简单变复杂的过程。爬虫技术经历了 urllib/requests+BeautifulSoup 原始技术,到 Scrapy 的全能框架,再到如今的 Colly 的轻量级框架。而如今已经有不少所谓的 “低代码” 甚至 “无代码” 爬虫平台了,例如Настраиваемый сканер Crawlab, сборщик Octopus / Houyi. И интеллектуальное сканирование также постепенно становится популярным. С этой точки зрения Colly должен быть лучше, чем Scrapy. ноПока рано говорить, сможет ли Colly заменить Scrapy, потому что у Scrapy все еще есть много отличных функций и экологичности, которые Colly пока не может заменить.. Однако в настоящее время Colly быстро развивается и постепенно понимается разработчиками.Colly обладает большим потенциалом, чтобы стать еще одной обязательной технологией в мире рептилий..

Ссылаться на