Чрезвычайно лаконичный фреймворк сканера Python

рептилия

Обновление - использование структуры объяснения случая:Развлекайтесь — 100 строк кода для сбора всех сезонных данных обо всех игроках НБА.

================================================== === =========== Если вы хотите изучить поисковый робот Python, вы можете щелкнуть дальше~ ????один, два coder.com/ad1/index, а также…????

Хотя я и не являюсь профессиональным разработчиком краулеров, как Pythoner, я всегда питал слабость к краулерам.

В Python есть множество фреймворков для поисковых роботов, таких как Scrapy, PySpider и т. д. Я не тот человек, который особенно любит использовать колеса, поэтому, основываясь на своих ограниченных знаниях о краулерах в сочетании с другими фреймворками, я создал колесо, которое очень просто в использовании: PSpider, который также углубил мое понимание фреймворка краулеров, многопоточности. , многопроцессорность и др. понимание понятий.

Адрес Github фреймворка PSpider:Fairy Lake/P Паук · GitHub, Добро пожаловать в Paizhuan и хвала.

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

image

Давайте поговорим о работе по сканированию, которую PSpider проделал для меня.

  • Соберите более 100 000 единиц всей информации о стартап-компаниях на веб-сайте отечественной финансовой платформы.
  • Соберите около 70 000 новостных данных с отечественного веб-сайта, посвященного новостям в области технологий.
  • Соберите сотни тысяч всех внутренних данных хедхантинговой компании (вы должны знать, что это за данные, они не были обнародованы)
  • Собирайте всю информацию о четырех основных внутренних рынках приложений для мобильных телефонов и обновляйте ее ежедневно, около 200 000 в день.
  • Захват данных, таких как Sina Weibo, официальный аккаунт Sogou WeChat и т. д., порядка миллионов
  • Возьмите судебные документы на китайском сайте судебных решений онлайн, около 10 миллионов
  • Захват данных банка вопросов образовательных приложений, включая вопросы, ответы и анализ, около 200 000 элементов.
  • Я также просканировал множество небольших веб-сайтов и небольших приложений, поэтому я не буду перечислять их все здесь.

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

Объем кода PSpider очень мал, и он составляет менее 700 строк, если просто посмотреть на код. Конечно, есть также довольно много комментариев и строк документации.На следующем рисунке представлен некоторый обзор аспектов кода этого фреймворка:

image

Вот краткое введение в структуру и функции фреймворка.Если вы ничего не понимаете, вы можете сами прочитать исходный код, он должен быть простым для понимания. Фреймворк PSpider в основном состоит из трех модулей, а именно: утилиты, экземпляры и одновременный доступ.

  1. модуль утилит: он в основном определяет некоторые функции инструментов, классы инструментов и т. д., то есть абстрагирует конкретные процессы и общие процессы в работе сканера в функции или классы, чтобы сэкономить время инженеров сканеров. Например, определите класс UrlFilter для фильтрации URL-адресов, определите декоратор params_chack для проверки входных параметров функции и т. д. В этом модуле много функций, их около 15 или около того, вы можете перейти к коду, чтобы проверить детали.Имена функций относительно стандартизированы, а комментарии также достаточно подробны.

  2. Модуль instances: Он в основном определяет три рабочих класса: Fetcher, Parser и Saver, то есть тот процесс, над которым действительно работает краулер в рабочем процессе. *Если сравнить структуру сканера с фабрикой, параллельный модуль определяет несколько мастерских и выполняет соответствующее планирование, синхронизацию информации и т. д., модуль экземпляров определяет рабочий процесс рабочих в каждой мастерской, а модуль утилит определяет некоторые инструменты и машины, необходимые для производственный процесс и т.д.При использовании фреймворка вообще необходимо наследовать и переписывать вышеперечисленные три класса, особенно класс Parser, то есть все три нужно настраивать, а фреймворк не может быть на этом шаге полностью универсальным.Класс Fetcher выполняет простую выборку на основе URL-адреса и возвращает полученный контент. Класс Parser выполняет синтаксический анализ в соответствии с захваченным содержимым и создает список элементов, которые необходимо сохранить, и список URL-адресов, которые необходимо захватить. Класс Saver сохраняет Item. (Подробности см. в блок-схеме выше).*Кроме того, не нужно переписывать все три функции работы в каждом классе, функция будет полностью учитывать проблемы, возникающие в процессе, и давать максимально корректный «ответ».

  3. Параллельный модуль: он в основном определяет пул потоков, а также пул комбинаций процессов и потоков, который используется для обеспечения безопасности потоков/процессов и разумного планирования в процессе искателя, совместного использования данных и синхронизации между потоками процессов и т. д. *Если класс синтаксического анализа относительно прост и не потребляет слишком много ресурсов ЦП, вы можете использовать пул потоков ThreadPool, который будет генерировать соответствующее количество потоков захвата, анализа и сохранения дочерних потоков в соответствии с параметрами. Однако, если класс синтаксического анализа является более сложным и интенсивно загружает процессор, из-за проблемы с GIL в Python, если вы просто используете многопоточность, эффективность может быть относительно низкой, тогда вы можете рассмотреть возможность использования ProcessPool, который будет открыть несколько потоков в основном процессе. Поток сканирования и процесс синтаксического анализа помещаются в другой процесс для повышения эффективности сканирования и синтаксического анализа.*Кроме того, этот модуль определяет поток мониторинга для постоянного отслеживания состояния задачи во время работы сканера.

В дополнение к трем более целевым модулям фреймворк также определяет более подробную спецификацию журнала отладки и использует некоторые другие методы Python (такие как декораторы, динамические классы и т. д.). Хотя его можно использовать в качестве фреймворка для сканера Python, он также является хорошим исходным ресурсом для Python. Для получения дополнительных функций, конфигураций, параметров и т. д. вы можете проверить код, чтобы узнать.

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

Этот фреймворк на данный момент не идеален, я буду продолжать думать и обновлять его, и в основном он будет обновляться раз в неделю. Если у вас есть какие-либо функциональные предложения или любые другие хорошие идеи по архитектуре, вы можете оставить мне сообщение или упомянуть о проблемах, запросах на включение и т. д. на github.Я буду активно рассматривать ваши предложения.

Основной план следующего шага — переписать его как распределенный сканер, чтобы повысить эффективность сканирования.

Вот выходные данные журнала двух тестовых процессов:

image

image

=============================================================

Перепечатка статьи Автор: Сяоху Источник: Чжиху