Почему каждый краулер-инженер должен изучать Kafka

Python Kafka

В этой статье мы не будем рассматривать конкретную работу Kafka, но расскажем, что такое Kafka и какую важную роль она может сыграть в разработке краулеров.

простое требование

Предположим, нам нужно написать краулер Weibo, а требования, данные начальником, следующие:

Разработка краулера для вас очень проста, поэтому вы можете разработать краулер, разделив три и пять на два:

Затем запустил функцию будильника, логика очень проста:

Давайте посмотрим на функцию подсчета ключевых слов.За этой функцией стоит веб-страница, которая будет отображать изменения количества просканированных данных в режиме реального времени и может отображать количество просканированного определенного ключевого слова каждую минуту или час.

Эта функция также очень проста для вас, поэтому вы реализуете следующую логику:

Последнее требование — провести анализ настроений по данным Weibo. Модуль анализа тональности разработан коллегами из других отделов, все, что вам нужно сделать, это каждый час вытягивать пакет данных, отправлять их в интерфейс, получать результат, а затем сохранять его в базе данных, необходимой для бэкенда:

Миссия выполнена, так что вы с радостью идете домой спать.

Трудности следуют

Рептилии медленные

По мере того, как босс постепенно добавляет новые ключевые слова, каждый раз, когда вы находите полное сканирование, все больше и больше времени, начиная с двух минут, чтобы проползти вокруг, позже превратилось в 10-минутный раунд, а затем в 30-минутный раунд, Затем он становится часом для обхода. . С увеличением задержки ваш сигнал тревоги становится все более неточным, микроблоги выдаются до одного часа, а вы не выдаете предупреждение, потому что у него нет хранилища микроблогов.

Ваша технология сканера очень хороша, вы можете обойти все механизмы защиты от сканирования, у вас есть неограниченное количество IP-адресов прокси, поэтому вы можете легко увеличить скорость сканирования до 1 миллиона параллелизма в секунду. Теперь вам потребуется всего 1 минута, чтобы завершить сбор всех данных. Уже все хорошо.

Но тревога не подавалась. Как это происходит?

База данных не выдерживает

После расследования вы нашли проблему. Объем выборки данных увеличился, но MongoDB не может одновременно получать столько записей данных. Скорость записи данных намного ниже скорости обхода данных, а в памяти накапливается большой объем данных. Итак, ваш сервер взрывается.

Вы срочно построили 100 баз данных и пронумеровали их от 0 до 99. Для захваченных микроблогов сначала вычислите остаток каждого идентификатора микроблога до 100, а затем сохраните данные в MongoDB, соответствующие остатку. Давление на каждую MongoDB упало до 1% от исходного. Наконец, данные могут быть мгновенно сохранены в базе данных.

Но тревога до сих пор не сработала, не только это, но теперь функция статистики объема захвата в реальном времени не может быть использована, в чем проблема?

Слишком поздно для запроса

Теперь программе оповещения необходимо просмотреть каждый фрагмент данных за последние 5 минут в 100 базах данных, чтобы подтвердить, есть ли какой-либо контент, требующий оповещения. Но этот процесс обхода занимает гораздо больше, чем 5 минут.

время в шахматном порядке

Поскольку функция комплексного поиска Weibo не сортируется по времени, будет такая ситуация, Weibo, опубликованная в 10:01 утра, будет поймана в 12:02.

Независимо от того, фильтруете ли вы данные во время срабатывания сигнала тревоги или фильтруете данные и отправляете их в интерфейс анализа НЛП, если вы выполняете поиск по времени выпуска Weibo, то вы сразу пропустите это — когда вам будет 10: 05 Найдите Weibo, опубликованное за 5 минут с 10:00 до 10:05. Поскольку этот Weibo не был пойман, вы, естественно, не сможете выполнить поиск.

Когда вы начинаете извлекать данные с 12:00 до 12:05 в 12:05, вы ищете данные, опубликованные с 12:00 до 12:05, поэтому данные с 10:01 были получены в 12:02 Да, но и отфильтровать нельзя.

Это не нужно использовать, чтобы ползать время, чтобы искать его? Например, 10:05 Начните извлечение в 10: 00-10: 05, чтобы захватить данные, независимо от того, сколько времени он выпускается, извлекаются.

Это гарантирует, что никакие данные не будут упущены, но за счет необходимости сохранять и извлекать очень и очень большой объем данных. Например, каждое сканирование, если время выпуска составляет последние 10 часов, должно быть сохранено. Следовательно, когда аварийная программа извлекает данные, ей необходимо извлечь все данные, которые были помещены в хранилище в течение 5 минут, но фактически выпущены в течение 10 часов.

Что, вы сказали проверять, существует ли уже этот Weibo перед каждым сохранением, и если он существует, то он не будет сохранен? Не забывайте, что времени на пакетную запись недостаточно, вы все еще собираетесь выделять время на запросы?

Приходят грязные данные

Босс неожиданно пришел сказать вам, что в ключевом слове «баскетбол» много информации о Цай Сюкуне, поэтому я хочу, чтобы вы удалили все данные, содержащие Цай Сюкуня.

Итак, где находится эта логика фильтрации? Поместить его в пайплайнс.py сканера? Затем вам нужно повторно развернуть все поисковые роботы. Сегодня фильтровать Cai Xukun, завтра фильтровать слои моделей, послезавтра фильтровать Wang Yibo, добавляя ключевые слова каждый день, вам нужно переустанавливать сканер каждый день?

Затем вы помещаете ключевые слова в Redis или MongoDB.Прежде чем каждый раз вставлять данные, читайте все ключевые слова и смотрите, не содержит ли Weibo re-storage.

Или в том проблема, времени вставки не хватает, надо еще базу проверить?

Что ж, в краулер больше не включена фильтрация по ключевым словам. Вы написали скрипт, который каждую минуту проверяет наличие новых данных в MongoDB и удаляет их, если находит нежелательное ключевое слово.

Теперь вот проблема, программа удаляющая данные проверяет каждую минуту, а программа будильник проверяет каждые 5 минут. В середине должны быть какие-то данные, и прежде чем их можно будет удалить, программа сигнализации подаст сигнал тревоги, босс получит сигнал тревоги, чтобы просмотреть данные, а ваша программа удаления в это время удалит грязные данные.

Ничего страшного, каждый день вызывайте фальшивую полицию, и история с приходом волка повторяется.

5 вопросов 1 спаситель

Если вы столкнулись со многими из вышеперечисленных проблем в процессе разработки поискового робота, вам следует попробовать Kafka. Решите все вышеперечисленные проблемы сразу.

Добавьте кафка в ваш процесс рептилий, тогда ваша архитектура рептилий становится следующим:

Кажется, это ничем не отличается от записи данных непосредственно в MongoDB, а затем чтения MongoDB каждой программой? Итак, какие проблемы может решить Кафка?

Давайте посмотрим на функции Kafka, которые мы будем использовать в этой архитектуре сканера:

Kafka не похожа на MongoDB в этой архитектуре сканера, она больше похожа на список Redis.

Теперь давайте упростим нашу модель.Если у краулера сейчас только одно требование, это поиск, а затем тревога. Тогда мы можем спроектировать его следующим образом:

Данные, просканированные сканером, помещаются непосредственно в правую часть списка Redis. Аварийная программа считывается одна за другой с левой стороны списка Redis. Прочитайте один элемент и просмотрите один элемент, если он содержит ключевое слово будильника, он подаст сигнал тревоги. Тогда читайте следующую.

Какая польза от этого?

Поскольку тревожная программа считывает данные непосредственно из Redis один за другим, нет процесса поиска данных по времени, поэтому не возникает проблемы с задержкой данных. Поскольку Redis — это однопоточная база данных, одновременно можно запускать множество тревожных программ. Поскольку lpop удаляет один после прочтения, если по какой-то причине программа будильника дает сбой, просто запустите ее снова, она продолжит работать и не будет повторять будильник.

Но преимущества использования списков Redis также являются недостатками: информация в списке может быть использована только один раз, и она исчезнет при всплывающем окне.

Поэтому, если вам нужно подать сигнал тревоги и сохранить данные в MongoDB для резервного копирования, то есть только один способ, то есть после того, как программа сигнализации проверит данные, сохраните данные в MongoDB.

Но я всего лишь часовой, зачем мне работать логистом?

Программа будильника, пусть она делает будильник, она не должна заниматься хранением данных.

С Kafka у него есть эти преимущества списков Redis без недостатков списков Redis!

Мы можем реализовать четыре программы по отдельности, и скорость потребления данных между разными программами не влияет друг на друга. Но одна и та же программа, независимо от того, закрыта ли она и снова открыта, или запущена несколько раз одновременно, не будет использоваться повторно.

Процедура 1: Тревога

По одному считывайте данные из Kafka и выполняйте работу, связанную с тревогами. Программа 1 может запускаться более одной одновременно. Закрытие и повторное открытие не приведет к повторному потреблению.

Процедура 2: Сохранение необработанных данных

Эта программа считывает данные из Kafka один за другим и записывает их в MongoDB партиями каждый раз, когда собирается 1000 данных. Эта программа не требует хранения данных в реальном времени, и не имеет значения, есть ли задержка. В MongoDB хранится только исходный архив данных. В обычных условиях он не будет прочитан из MongoDB.

Процедура 3: Статистика

Читайте данные из Kafka, записывайте ключевые слова и публикуйте время. Твиты по каждому ключевому слову считаются по часам и по минутам. Наконец, сохраните результат подсчета.

Процедура 4: Эмоциональный анализ

Прочитайте каждый фрагмент данных из Kafka, создайте пакет и отправьте его в интерфейс анализа NLP. Получите результаты и сохраните их во внутренней базе данных.

Что делать, если вы хотите очистить свои данные

Все четыре требования были решены, что делать, если вам все еще нужно сначала удалить грязные данные, а затем проанализировать их? Это на самом деле очень просто, вы просто добавляете Kafka (Тема)!

Обходной гусеничный сканер общего назначения

В дополнение к приведенному выше примеру Weibo давайте посмотрим, как применить Kafka при разработке сканера общего назначения.

В любое время ни извлечение данных с помощью XPath, ни анализ JSON, возвращаемого веб-сайтом, не являются основной работой разработки сканера. Основная работа по разработке краулеров всегда заключалась в планировании краулеров и разработке антикраулеров.

Когда мы сейчас пишем Scrapy, логика обработки антикраулеров и логика извлечения данных прописывается в проекте краулеров, поэтому на самом деле сложно добиться совместной работы нескольких человек во время разработки.

Теперь разделим рептилий и извлечение данных содержимого сайта, чтобы добиться такой архитектуры рептилий:

Учащиеся с хорошими навыками разработки поисковых роботов несут ответственность за обход антикраулеров и получение содержимого веб-сайта, будь то исходный код HTML или JSON, возвращаемый интерфейсом. Получив его, подключите его непосредственно к Kafka.

Технология сканирования относительно распространена среди студентов и стажеров: все, что им нужно сделать, — это получить данные из Kafka, и им не нужно заботиться о том, поступают ли данные из Scrapy или Selenium. Все, что им нужно сделать, — это разобрать эти HTML или JSON в отформатированные данные в соответствии с требованиями продукта, а затем вставить их в Kafka для студентов, которые продолжат читать и использовать их для последующего анализа данных.

Таким образом, работа дата-команды разделяется, и каждый делает свою работу, согласовывает формат и развивается синхронно, не мешая друг другу.

Почему Кафка, а не другие

Описанные выше функции на самом деле могут быть реализованы многими MQ. Но почему Кафка, а не что-то еще? Поскольку производительность кластера Kafka очень высока, кластер, построенный на мусорном компьютере, может выдерживать 100 000 одновременных операций записи данных в секунду. А если вы выберете сервер с более высокой производительностью, вы легко справитесь с 1 миллионом операций записи данных в секунду.

Суммировать

Эта статья знакомит Кафку с развитием Кафки на двух примерах. Как инженер-рептилий, как мой читатель. Обязательно освойте Кафку.

В следующей статье мы поговорим о том, как использовать Kafka. Это будет проще и легче следовать, чем учебники, которые вы видите в Интернете.

Подпишитесь на эту официальную учетную запись и ответьте на «Crawler and Kafka», чтобы получить оригинальную карту разума, соответствующую этой статье.