Стыковка SCHAPY с Docker

Python Docker MongoDB Scrapy

Проблемы с конфигурацией среды всегда могут доставлять нам головную боль, включая следующие ситуации.

  • Мы написали проект сканера Scrapy локально и хотим запустить его на сервере, но среда Python не установлена ​​на сервере.

  • Другие предоставили нам проект сканера Scrapy, версия пакета, используемого проектом, не соответствует версии локальной среды, и проект нельзя запустить напрямую.

  • Нам нужно одновременно управлять разными версиями проектов Scrapy.Например, более ранние проекты зависели от Scrapy 0.25, а текущие проекты зависят от Scrapy 1.4.0.

В этих случаях нам необходимо решить проблему установки и настройки среды и разрешения конфликтов версий в среде.

Для Python Virtualenv действительно может решить проблему версий конфликтов. Однако Virtualenv не очень удобно для развертывания проекта, нам все еще нужно установить среду Python,

Как решить вышеуказанную проблему? Ответ заключается в использовании Docker. Docker может предоставить виртуальную среду на уровне операционной системы.Образ Docker обычно содержит полную операционную систему, и эти системы также имеют настроенную среду разработки, например среду Python 3.6.

Мы можем напрямую использовать этот образ Docker Python 3 для запуска контейнера и помещать проект непосредственно в контейнер для запуска без дополнительной настройки среды Python 3. Это решает проблему конфигурации среды.

Мы также можем дополнительно преобразовать проект Scrapy в новый образ Docker, который содержит только среду Python, подходящую для этого проекта. Если вы хотите выполнить развертывание на других платформах, вам нужно только загрузить образ и запустить его.Поскольку Docker использует для запуска виртуальную среду, он полностью изолирован от хоста, поэтому вам не нужно беспокоиться о конфликтах среды.

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

Далее мы пытаемся превратить проект Scrapy в образ Docker.

1. Цель этого раздела

Мы хотим реализовать процесс упаковки предыдущего входного проекта Scrapy в образ Docker. Веб-сайт, просканированный проектом: http://quotes.toscrape.com/. В разделе «Начало работы со Scrapy» этой главы реализован процесс сканирования Scrapy для этого сайта.Код проекта: https://github.com/Python3WebSpider/ScrapyTutorial. Если он не существует локально, код можно клонировать.

2. Подготовка

Убедитесь, что Docker и MongoDB установлены и работают.

3. Создайте Dockerfile

Сначала создайте файл requirements.txt в корневом каталоге проекта и перечислите все пакеты среды Python, от которых зависит весь проект, как показано ниже:

scrapy
pymongo

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

scrapy>=1.4.0
pymongo>=3.4.0

В файле Dockerfile нового корневого каталога проекта без расширения измените содержимое следующим образом:

FROM python:3.6
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip3 install -r requirements.txt
CMD scrapy crawl quotes

первая строкаFROMПредставляет используемый базовый образ Docker.Здесь мы напрямую используем образ python:3.6 и запускаем проект Scrapy на его основе.

вторая линияENVэто параметр переменной среды, который будет/usr/local/bin:$PATHназначить вPATH, то есть увеличить/usr/local/binЭтот путь к переменной среды.

Третий рядADDзаключается в размещении локального кода в виртуальном контейнере. Он принимает два параметра: первый параметр., представляющий локальный текущий путь; второй параметр/code, представляющий путь в виртуальном контейнере, то есть размещение всего содержимого локального проекта в каталоге /code виртуального контейнера, чтобы код можно было запустить в виртуальном контейнере.

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

Пятая линияRUNЭто выполнить некоторые команды, чтобы сделать некоторую подготовку среды. Поскольку в виртуальном контейнере Docker есть только среда Python 3 и нет необходимой библиотеки Python, мы запускаем эту команду, чтобы установить соответствующую библиотеку Python, такую ​​как Scrapy, в виртуальном контейнере, чтобы команду Scrapy можно было выполнить в виртуальном контейнере.

шестой рядCMDэто команда запуска контейнера. Эта команда выполняется, когда контейнер запущен. Здесь мы запускаем сканер напрямую с помощью кавычек для сканирования.

В-четвертых, измените соединение MongoDB.

Далее нам нужно изменить информацию о соединении для MongoDB. Если мы продолжим использовать localhost, мы не сможем найти MongoDB, потому что в виртуальном контейнере Docker localhost фактически указывает на работающий IP самого контейнера, а MongoDB не установлена ​​внутри контейнера, поэтому краулер не может подключиться к MongoDB.

Адрес MongoDB здесь может иметь следующие два параметра.

  • Если мы хотим протестировать только эту машину, мы можем изменить адрес на IP-адрес хост-машины, то есть на локальный IP-адрес вне контейнера, который обычно является IP-адресом локальной сети.ifconfigкоманда для просмотра.

  • Если вы хотите выполнить развертывание на удаленном хосте для запуска, обычно MongoDB — это адрес, доступный из общедоступной сети, и вы можете изменить его на этот адрес.

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

MONGO_URI = 'mongodb://admin:admin123@120.27.34.25:27017'

Адрес здесь может быть изменен на ваш собственный адрес удаленной базы данных MongoDB.

На этом настройка проекта завершена.

Пять, постройте зеркало

Затем мы создаем образ Docker и выполняем следующую команду:

docker build -t quotes:latest .

Вывод во время выполнения выглядит так:

Sending build context to Docker daemon 191.5 kB
Step 1/6 : FROM python:3.6
 ---> 968120d8cbe8
Step 2/6 : ENV PATH /usr/local/bin:$PATH
 ---> Using cache
 ---> 387abbba1189
Step 3/6 : ADD . /code
 ---> a844ee0db9c6
Removing intermediate container 4dc41779c573
Step 4/6 : WORKDIR /code
 ---> 619b2c064ae9
Removing intermediate container bcd7cd7f7337
Step 5/6 : RUN pip3 install -r requirements.txt
 ---> Running in 9452c83a12c5
...
Removing intermediate container 9452c83a12c5
Step 6/6 : CMD scrapy crawl quotes
 ---> Running in c092b5557ab8
 ---> c8101aca6e2a
Removing intermediate container c092b5557ab8
Successfully built c8101aca6e2a

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

docker images

Строка кода в возвращаемом результате выглядит так:

quotes  latest  41c8499ce210    2 minutes ago   769 MB

Это наш недавно построенный образ.

6. Операция

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

docker run quotes

Таким образом, мы используем этот образ для создания и запуска контейнера Docker, и эффект запуска точно такой же, как показано на следующем рисунке.

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

7. Отправить в Docker Hub

После завершения сборки мы можем отправить образ на платформу размещения образов Docker, такую ​​как Docker Hub или частный реестр Docker, чтобы получить образ с удаленного сервера и запустить его.

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

Сначала зарегистрируйте учетную запись на https://hub.docker.com и создайте новый репозиторий с именем quotes. Например, мое имя пользователя — germey, а имя только что созданного Репозитория — кавычки, тогда адрес этого Репозитория можно представить как germey/quotes.

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

docker tag quotes:latest germey/quotes:latest

Просто отправьте образ в Docker Hub, команда выглядит следующим образом:

docker push germey/quotes

Новый образ Push Docker появится в Docker Hub, как показано на следующем рисунке.

Если мы хотим запустить этот образ на другом хосте, после установки Docker на хост мы можем напрямую выполнить следующую команду:

docker run germey/quotes

Это автоматически загрузит образ и запустит контейнер. Нет необходимости настраивать среду Python и не нужно беспокоиться о конфликтах версий.

Эффект операции показан на рисунке ниже.

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

8. Заключение

Мы объяснили процесс преобразования проекта Scrapy в образ Docker и его развертывания на удаленном сервере для запуска. Таким образом, проблемы, которые мы перечислили в начале этого раздела, решаются.


Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми

Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.

WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)