Распределенный краулер завершен и может успешно работать, но есть очень громоздкая ссылка, то есть развертывание кода.
Мы предполагаем следующие сценарии.
Если код развертывается путем загрузки файла, мы сначала сжимаем код, затем загружаем файл на сервер с помощью SFTP или FTP, а затем подключаемся к серверу для распаковки файла.Каждый сервер необходимо настроить таким образом.
Если код развертывается с помощью синхронизации Git, мы можем сначала отправить код в репозиторий Git, а затем удаленно подключиться к каждому хосту, чтобы выполнить операцию извлечения для синхронизации кода.Каждый сервер также должен выполнить одну операцию.
Если код вдруг обновляется, то приходится обновлять каждый сервер, и в случае, если версия какого хоста плохо контролируется, это может повлиять на общую ситуацию с распределенным обходом.
Так что нам нужен более удобный инструмент для развертывания проектов Scrapy.Гораздо удобнее будет, если мы сможем сохранить операцию входа на сервер одну за другой для развертывания.
В этом разделе мы рассмотрим Scrapyd, инструмент, обеспечивающий распределенное развертывание.
1. Понимание Scrapyd
Scrapyd — это служебная программа, которая запускает сканеры Scrapy и предоставляет ряд HTTP-интерфейсов, которые помогают нам развертывать, запускать, останавливать и удалять сканеры. Scrapyd поддерживает управление версиями, а также может управлять несколькими задачами сканера.С его помощью мы можем легко выполнить планирование задач развертывания проектов сканера Scrapy.
2. Подготовка
Убедитесь, что Scrapyd правильно установлен на локальном компьютере или сервере.
3. Посетите Скрэпид
После установки и запуска Scrapyd мы можем получить доступ к порту 6800 сервера и увидеть страницу WebUI. Например, адрес моего сервера 120.27.34.25, тогда я могу открыть его в локальном браузере: http://120.27.34.25:6800 и увидеть домашнюю страницу Scrapyd. Его можно заменить адресом вашего сервера, как показано ниже.Если вы успешно заходите на эту страницу, проблем с конфигурацией Scrapyd нет.
В-четвертых, функция Scrapyd
Scrapyd предоставляет ряд HTTP-интерфейсов для реализации различных операций. Взяв в качестве примера IP-адрес 120.27.34.25, на котором находится Scrapyd, мы можем разобраться в функциях интерфейса.
1. daemonstatus.json
Этот интерфейс отвечает за просмотр текущего состояния сервиса и задач Scrapyd. мы можем использоватьcurl
команда для запроса этого интерфейса, команда выглядит следующим образом:
curl http://139.217.26.30:6800/daemonstatus.json
Мы получим следующий результат:
{"status": "ok", "finished": 90, "running": 9, "node_name": "datacrawl-vm", "pending": 0}
Возвращаемый результат представляет собой строку JSON,status
текущее рабочее состояние,finished
Представляет текущую завершенную задачу Scrapy,running
представляет запущенную задачу Scrapy,pending
Представляет задачу Scrapyd, ожидающую планирования,node_name
это имя хоста.
2. addversion.json
Этот интерфейс в основном используется для развертывания проектов Scrapy. Сначала мы упаковываем проект в файл Egg, а затем передаем имя проекта и версию развертывания.
Мы можем реализовать развертывание проекта следующими способами:
curl http://120.27.34.25:6800/addversion.json -F project=wenbo -F version=first -F egg=@weibo.egg
это здесь,-F
Представляет собой добавление параметра, и нам также нужно упаковать проект в файл Egg и поместить его локально.
После выполнения запроса мы можем получить следующие результаты:
{"status": "ok", "spiders": 3}
Этот результат указывает на то, что развертывание прошло успешно и количество поисковых роботов равно 3.
Этот метод развертывания может быть громоздким, и позже будут представлены более удобные инструменты для реализации развертывания проекта.
3. schedule.json
Этот интерфейс отвечает за планирование запуска развернутых проектов Scrapy.
Мы можем реализовать планирование задач со следующим интерфейсом:
curl http://120.27.34.25:6800/schedule.json -d project=weibo -d spider=weibocn
Здесь вам нужно передать два параметра,project
то есть имя проекта Scrapy,spider
А именно имя Паука.
Возвращаемые результаты следующие:
{"status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"}
status
Представляет начало проекта Scrapy,jobid
Представляет кодовое имя текущей задачи сканирования.
4. cancel.json
Этот интерфейс можно использовать для отмены задачи сканирования. Если эта задачаpending
состоянии, она будет удалена, если задачаrunning
состояние, оно будет прекращено.
Мы можем отменить выполнение задачи с помощью следующей команды:
curl http://120.27.34.25:6800/cancel.json -d project=weibo -d job=6487ec79947edab326d6db28a2d86511e8247444
Здесь вам нужно передать два параметра,project
то есть название проекта,job
То есть код задачи сканирования.
Возвращаемые результаты следующие:
{"status": "ok", "prevstate": "running"}
status
от имени исполнения запроса,prevstate
Представляет предыдущее рабочее состояние.
5. listprojects.json
Этот интерфейс используется для отображения всех описаний проектов, развернутых в службе Scrapyd.
Мы можем получить все описания проектов на сервере Scrapyd с помощью следующей команды:
curl http://120.27.34.25:6800/listprojects.json
Здесь нет необходимости передавать какие-либо параметры.
Возвращаемые результаты следующие:
{"status": "ok", "projects": ["weibo", "zhihu"]}
status
от имени исполнения запроса,projects
представляет собой список имен проектов.
6. listversions.json
Этот интерфейс используется для получения всех номеров версий проекта. Номера версий расположены по порядку, и последняя запись является последним номером версии.
Мы можем получить номер версии проекта с помощью следующей команды:
curl http://120.27.34.25:6800/listversions.json?project=weibo
Здесь требуется параметрproject
, что является названием проекта.
Возвращаемые результаты следующие:
{"status": "ok", "versions": ["v1", "v2"]}
status
от имени исполнения запроса,versions
список номеров версий.
7. listspiders.json
Этот интерфейс используется для получения всех имен пауков последней версии проекта.
Мы можем получить имя паука проекта с помощью следующей команды:
curl http://120.27.34.25:6800/listspiders.json?project=weibo
Здесь требуется параметрproject
, что является названием проекта.
Возвращаемые результаты следующие:
{"status": "ok", "spiders": ["weibocn"]}
status
от имени исполнения запроса,spiders
представляет собой список имен пауков.
8. listjobs.json
Этот интерфейс используется для получения подробной информации обо всех задачах, выполняемых в настоящее время для проекта.
Мы можем получить все детали задачи с помощью следующей команды:
curl http://120.27.34.25:6800/listjobs.json?project=weibo
Здесь требуется параметрproject
, что является названием проекта.
Возвращаемые результаты следующие:
{"status": "ok",
"pending": [{"id": "78391cc0fcaf11e1b0090800272a6d06", "spider": "weibocn"}],
"running": [{"id": "422e608f9f28cef127b3d5ef93fe9399", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664"}],
"finished": [{"id": "2f16646cfcaf11e1b0090800272a6d06", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664", "end_time": "2017-07-12 10:24:03.594664"}]}
status
от имени исполнения запроса,pendings
представляет текущую ожидающую задачу,running
представляет текущую запущенную задачу,finished
Представляет выполненную задачу.
9. delversion.json
Этот интерфейс используется для удаления определенной версии проекта.
Мы можем удалить версию проекта с помощью следующей команды:
curl http://120.27.34.25:6800/delversion.json -d project=weibo -d version=v1
Здесь требуется параметрproject
, которое является названием проекта, а также требует параметрversion
, которая является версией проекта.
Возвращаемые результаты следующие:
{"status": "ok"}
status
Представляет выполнение запроса, что означает успешное удаление.
10. delproject.json
Этот интерфейс используется для удаления элемента.
Мы можем удалить элемент с помощью следующей команды:
curl http://120.27.34.25:6800/delproject.json -d project=weibo
Здесь требуется параметрproject
, что является названием проекта.
Возвращаемые результаты следующие:
{"status": "ok"}
status
Представляет выполнение запроса, что означает успешное удаление.
Все вышеперечисленные интерфейсы являются интерфейсами Scrapyd. Мы можем напрямую запросить HTTP-интерфейс для управления развертыванием, запуском и работой проекта.
Пять, использование Scrapyd API
Вышеуказанные интерфейсы могут быть не очень удобными в использовании. Неважно, есть также API-библиотека Scrapyd, которая инкапсулирует эти интерфейсы.Способ установки описан в главе 1.
Давайте посмотрим, как использовать Scrapyd API. Основной принцип Scrapyd API такой же, как метод запроса в интерфейсе HTTP, но упакованная библиотека Python более удобна в использовании.
Мы можем создать объект API Scrapyd следующим образом:
from scrapyd_api import ScrapydAPI
scrapyd = ScrapydAPI('http://120.27.34.25:6800')
Вызовите его методы для реализации операции соответствующего интерфейса.Например, операцию развертывания можно использовать следующим образом:
egg = open('weibo.egg', 'rb')
scrapyd.add_version('weibo', 'v1', egg)
Таким образом, мы можем упаковать проект как файл Egg, а затем развернуть локально упакованный проект Egg на удаленном Scrapyd.
Кроме того, Scrapyd API также реализует весь интерфейс API, предоставляемое Scrapyd имя такое же, параметры такие же.
Например, вызовlist_projects()
метод для вывода списка всех развернутых проектов в Scrapyd:
scrapyd.list_projects()
['weibo', 'zhihu']
Есть и другие методы, которые здесь не перечислены, названия и параметры те же. Для более подробных операций обратитесь к официальной документации: http://python-scrapyd-api.readthedocs.io/.
6. Заключение
В этом разделе представлено связанное использование Scrapyd и API Scrapyd, с помощью которого мы можем развертывать проекты и контролировать выполнение задач через интерфейс HTTP. Однако процесс развертывания немного неудобен: проект должен сначала упаковать файл Egg, а затем загрузить его, что громоздко. В следующем разделе мы представляем более удобный инструмент для завершения процесса развертывания.
Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми
Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.
WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)