Как да изградите мащабируем робот за обхождане на милиони страници с една машина само за 2 часа

Има много статии за това как да се изгради питон за обхождане. Ако сте начинаещ в python и не сте запознати с мултипроцесора или многопоточността, може би този урок ще бъде подходящ избор за вас.

Не е необходимо да знаете как да управлявате обработка или конци или дори опашка, просто въведете URL адресите, които искате да изстържете, извлечете уеб структурата според нуждите си, променете броя на обхождащите и съвместни валути за генериране, а останалото е всичко "Запали го"!

Целият код тук просто симулира ефективен разпределен робот и научете как да използвате докер и целина. Има няколко неща, които трябва да декларираме, преди да започнем:

1. Без значение кой уебсайт искате да изтриете, моля, получете неговата политика и TOS.
2. Не изпращайте по едно и също време големи заявки към същия уебсайт. Моля, бъдете нежни.
3. Не правете нищо, което нарушава местното законодателство на вашата страна

Този урок е актуализирана версия на предишната публикация, Как да се изгради докер клъстер с целина и RabbitMQ за 10 минути. Има много технически подробности за това как да напишете dockerfile, да използвате docker-compose и как да конфигурирате Celery и RabbiMQ, така че няма да говоря за тях отново.

1. Да вървим

Поради Docker можехме лесно да мащабираме всякакви приложения. Така че в тази статия има само два ключови файла. Проверете предишната публикация за повече подробности.

КЛЮЧОВ ЕДИН:

Списък на URL адреси: можете да получите списък с най-добри домейни на Alexa от 1 милион от този уебсайт, да ги съхраните в базата си данни или текстов файл, както е необходимо. За да имам бърз тест, просто изграждам приветна страница nginx в моя облачен сървър. След това го мащабирайте до списък от 1000000.

След това използвайте longtime_add.delay метод, за да изпратите всички до RabbitMQ, брокер на съобщения.

КЛЮЧ ДВЕ:

С команда на „docker-compose scale worker = 10“, docker-compose ще генерира клъстер на работници с този файл „задачи“. Той ще получи списък с URL адреси и ще го изпрати на заявки, ще върне status_code и ще съхранява status_code с метод time.time (). Ако работи, ще видите нещо подобно в базата данни на Монго:

{ "Състояние": 200, "create_time": 1488271604,63484}

По принцип , поради мрежата на вашия домашен или сървър хост, връзките не винаги са стабилни, след като се провали, трябва да опитаме отново. Така че тук задаваме закъснение за повторен опит до 10 секунди. След като не успее, ще се опита отново 10 секунди по-късно.

@ App.task (свързват = Вярно е, default_retry_delay = 10)

2. Конфигурирайте dockerfile и docker-compose

ENTRYPOINT целина - работник тест_целерия - едновременност = 20 - loglevel = информация

Тук трябва да се забележи нещо: не задавайте прекалено висока съвместимост в dockerfile. В този случай 20 е достатъчно голям за моята машина.

Това, което трябва да добавим в docker-compose файл, е база данни на mongo и да зададем порта „27018: 27017“. Първото число трябва да е същото като това в задачите.

3. Да стартираме

Ако откриете, че е малко трудно да проследите, просто клонирайте кода на вашата локална машина, след което направете същото като предишната статия.

Специфични характеристики на процесора. Източник: Intel

Моята локална машина има два процесора, докато всеки има 12 нишки и 6 ядра, а общата памет е 32G. Той е достатъчно мощен, за да управлява 40 работници, докато всеки от тях има 20 паралелки.

40 работници

Колкото повече валути има за всеки работник, толкова повече памет ще му трябва. За този случай 40-те работници струват общо около 12G памет и остават около половината. Ако увелича малко броя на concurrencies или работници, скоростта на обхождането ще бъде по-бърза, но честотната лента на мрежата в моята къща е само 1 mb / s. Макар и увеличаване на работниците, скоростта изобщо не се увеличава. В този тест, тясното място е моята лоша мрежа.

40 работници и 15 минути по-късно аз получих около 100000 артикула в моята база данни на Монго, използвайки една машина.

заключение

Ако имате мощен сървър или компютър, е необходимо да разгърнете докерни клъстери, за да постигнете максимална производителност на вашата машина или с някакъв малък сървър, като Raspberry Pi, докерът също е по-добър избор. Разбира се, без docker бихте могли да изградите и разпределен робот. Някои софтуер като Fabric ще разположи вашите приложения към сървърни клъстери с няколко команди.

Ако имате въпроси или предложения относно него, моля не се колебайте да отговорите тук и добре дошли да изпратите заявки за изтегляне към този проект. Ще се видим в следващия урок!