Далее мы будем использовать Scrapy-Redis для распределенной стыковки.
1. Подготовка
Убедитесь, что сканер Scrapy Sina Weibo успешно внедрен и библиотека Scrapy-Redis установлена правильно.
Во-вторых, создайте сервер Redis.
Чтобы добиться распределенного развертывания, несколько хостов должны совместно использовать очереди сканирования и повторную трансляцию, и две части экспортируются в базу данных Redis, и нам нужно создать публичный доступ к серверу Redis.
Рекомендуется использовать сервер Linux.Вы можете приобрести облачные хосты, предоставляемые Alibaba Cloud, Tencent Cloud, Azure и т. д., которые обычно имеют общедоступный IP-адрес.Чтобы узнать о конкретном методе построения, обратитесь к методу установки Redis. базы данных в главе 1.
После завершения установки Redis вы можете подключиться удаленно.Обратите внимание, что серверы некоторых продавцов (например, Alibaba Cloud и Tencent Cloud) должны быть настроены с помощью группы безопасности, чтобы разрешить удаленный доступ к работающему порту Redis. Если вы столкнулись с проблемой, что не можете подключиться удаленно, вы можете проверить настройки группы безопасности.
Необходимо записать работающий IP, порт и адрес Redis для последующей настройки распределенных сканеров. Текущий настроенный IP-адрес Redis — это IP-адрес сервера 120.27.34.25, порт по умолчанию — 6379, а пароль — foobared.
3. Разверните пул прокси и пул файлов cookie
Проект Sina Weibo должен использовать пул прокси-серверов и пул файлов cookie до того, как наш пул прокси-серверов и пул файлов cookie будут запущены локально. Поэтому нам нужно запустить их на сервере, к которому можно получить доступ из общедоступной сети, загрузить код на сервер, изменить конфигурацию информации о соединении Redis и запустить пул прокси и пул файлов cookie таким же образом.
Удаленный доступ к интерфейсу, предоставляемому пулом прокси и пулом файлов cookie, для получения случайных прокси и файлов cookie. Если удаленный доступ невозможен, убедитесь, что он запущен на узле 0.0.0.0, а затем проверьте конфигурацию группы безопасности.
Например, текущие IP-адреса пула прокси-серверов и пула файлов cookie, которые я сейчас настроил, — это IP-адрес сервера 120.27.34.25, а порты — 5555 и 5556 соответственно, как показано на следующем рисунке.
Далее нам нужно изменить ссылку доступа в проекте Scrapy Sina Weibo следующим образом:
PROXY_URL = 'http://120.27.34.25:5555/random'
COOKIES_URL = 'http://120.27.34.25:5556/weibo/random'
Конкретный метод модификации настраивается в соответствии с фактически настроенными IP-адресом и портом.
В-четвертых, настройте Scrapy-Redis.
Настроить SCRAPI-Redis очень просто, просто измените профиль settings.py.
1. Основная конфигурация
Прежде всего, вам нужно заменить класс планировщика и класс дедупликации на класс, предоставляемый Scrapy-Redis, и добавить следующую конфигурацию в settings.py:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
2. Конфигурация соединения Redis
Затем настройте информацию о подключении Redis.Существует два метода настройки.
Первый способ — настройка строки подключения. Мы можем создать строку подключения Redis с адресом, портом и паролем Redis.Поддерживаемые формы подключения следующие:
redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db
password
— это пароль. Например, он должен начинаться с двоеточия. Скобки означают, что этот параметр является необязательным.host
это адрес Redis,port
рабочий порт,db
— код базы данных, по умолчанию его значение равно 0.
Согласно моей информации о подключении к Redis, упомянутой выше, строка подключения для создания этого Redis выглядит следующим образом:
redis://:foobared@120.27.34.25:6379
Настройте его прямо в settings.py какREDIS_URL
переменные могут быть:
REDIS_URL = 'redis://:foobared@120.27.34.25:6379'
Второй метод конфигурации заключается в индивидуальной настройке элементов. Эта конфигурация более интуитивно понятна и понятна, например, согласно моей информации о подключении к Redis, в settings.py можно настроить следующий код:
REDIS_HOST = '120.27.34.25'
REDIS_PORT = 6379
REDIS_PASSWORD = 'foobared'
Этот код настраивает адрес, порт и пароль Redis отдельно.
Обратите внимание, что если вы настраиваетеREDIS_URL
, то Scrapy-Redis будет иметь приоритетREDIS_URL
Соединение переопределит три указанные выше конфигурации. Если вы хотите настроить элементы отдельно, пожалуйста, не настраивайтеREDIS_URL
.
В этом проекте я решил настроитьREDIS_URL
.
3. Настройте очередь отправки
Эта конфигурация не является обязательной, по умолчаниюPriorityQueue
. Если вы хотите изменить конфигурацию, вы можете настроитьSCHEDULER_QUEUE_CLASS
переменная следующим образом:
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'
Вы можете переключить режим хранения очереди сканирования, выбрав одну из трех вышеперечисленных строк.
В этом проекте нет конфигурации, мы используем конфигурацию по умолчанию.
4. Настройте постоянство
Эта конфигурация не является обязательной, по умолчаниюFalse
. Scrapy-Redis очистит очередь сканирования и по умолчанию выполнит дедупликацию сбора отпечатков пальцев после завершения всего сканирования.
Если вы не хотите автоматически очищать очередь сканирования и дедуплицировать сбор отпечатков пальцев, вы можете добавить следующую конфигурацию:
SCHEDULER_PERSIST = True
будетSCHEDULER_PERSIST
Установить какTrue
После этого очередь сканирования и сбор отпечатков пальцев дедупликации не будут автоматически очищаться после завершения сканирования.Если не настроено, по умолчаниюFalse
, который автоматически очищается.
Стоит отметить, что если сканер будет принудительно прерван, очередь сканирования и коллекция отпечатков дедупликации не будут автоматически очищены.
В этом проекте нет конфигурации, мы используем конфигурацию по умолчанию.
5. Настроить повторное лазание
Эта конфигурация не является обязательной, по умолчаниюFalse
. Если настроено сохраняемость или работа сканера принудительно прервана, очередь сканирования и коллекция отпечатков пальцев не будут очищены, и сканер возобновит последнее сканирование после перезапуска. Если мы хотим выполнить повторное сканирование, мы можем настроить параметры повторного сканирования:
SCHEDULER_FLUSH_ON_START = True
Это будетSCHEDULER_FLUSH_ON_START
Установить какTrue
После этого при каждом запуске сканера очередь сканирования и сбор отпечатков пальцев будут очищаться. Таким образом, для выполнения распределенного сканирования мы должны убедиться, что его можно очистить только один раз, иначе каждая задача сканера будет очищаться один раз при ее запуске, а предыдущая очередь сканирования будет очищена, что неизбежно повлияет на распределенное сканирование.
Обратите внимание, что эта конфигурация более удобна для автономного сканирования и редко используется для распределенного сканирования.
В этом проекте нет конфигурации, мы используем конфигурацию по умолчанию.
6. Конфигурация конвейера
Эта конфигурация не является обязательной, и Pipeline не запускается по умолчанию. Scrapy-Redis реализует конвейер элементов, который хранится в Redis. Если этот конвейер включен, сканер будет хранить сгенерированный элемент в базе данных Redis. В случае относительно большого объема данных мы обычно этого не делаем. Поскольку Redis основан на памяти, мы используем его высокую скорость обработки. Слишком расточительно использовать его для хранения. Конфигурация выглядит следующим образом:
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
Этот проект не выполняет никакой настройки, то есть не запускает Pipeline.
На этом настройка Scrapy-Redis завершена. Некоторые параметры мы не настроили, но эти конфигурации могут использоваться в других проектах Scrapy, в зависимости от конкретной ситуации.
Пять, настройте цель хранения
Хранилище, используемое ранее проектом сканера Scrapy Sina Weibo, — это MongoDB, а MongoDB работает локально, то есть соединение — localhost. Однако, когда программа искателя распространяется на каждый хост для запуска, искатель подключается к соответствующей MongoDB. Поэтому нам необходимо установить MongoDB на каждый хост, что имеет два недостатка: во-первых, громоздкость построения среды MongoDB;
Поэтому нам лучше оставить цель хранения в одном и том же месте, например, в одной и той же базе данных MongoDB. Мы можем настроить службу MongoDB на сервере или напрямую приобрести службы хранения данных MongoDB.
Здесь используется сервис MongoDB, построенный на сервере, IP по-прежнему 120.27.34.25, имя пользователя admin, пароль admin123.
Изменить настройкуMONGO_URI
следующее:
MONGO_URI = 'mongodb://admin:admin123@120.27.34.25:27017'
На данный момент мы успешно завершили настройку распределенного сканера Scrapy.
6. Операция
Затем разверните код на каждом хосте. Помните, что каждый хост должен быть оснащен соответствующей средой Python.
Выполните следующую команду на каждом хосте, чтобы начать сканирование:
scrapy crawl weibocn
После того, как каждый хост запустит эту команду, он отправит запрос из конфигурации базы данных Redis, выполнит совместное использование очередей обхода и совместное использование сбора отпечатков пальцев. В то же время у каждого хоста своя занятая полоса пропускания и процессор не будут влиять друг на друга, увеличив эффективность сканирования.
7. Результаты
Через некоторое время мы можем использовать RedisDesktop для просмотра информации из удаленной базы данных Redis. Здесь будет два ключа: один называется weibocn:dupefilter, который используется для хранения отпечатков пальцев, а другой называется weibocn:requests и представляет собой очередь сканирования, как показано на следующем рисунке.
Со временем коллекция отпечатков будет продолжать расти, очередь сканирования будет динамически изменяться, а просканированные данные также будут храниться в базе данных MongoDB.
Восемь, этот код раздела
Кодовый адрес этого раздела: https://github.com/Python3WebSpider/Weibo/tree/distributed, обратите внимание, что это распределенная ветка.
9. Заключение
Этот раздел через стыковку Scrapy-Redis успешно реализует распределенный поисковый робот, но все же есть много мест для развертывания неудобно. Кроме того, при сканировании особенно большого количества слов память Redis также является проблемой. Позже мы продолжим оптимизировать понимание соответствующей программы.
Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми
Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.
WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)