Как сделать многопоточный парсинг (объясните простыми словами, пожалуйста)



  • Дорос до многопоточного парсинга.
    Но не знаю, как он работает.

    У меня есть скрипт, который парсит странички сайта example.com.
    Странички имеют такой адрес:
    example.com/1
    example.com/2
    ...
    example.com/10000

    Я создал массив с цифрами от 1 до 10 000 (чтобы перебрать все странички с 1ой по 10 000ую).

    Скрипт берёт первый элемент массива (1), собирает адрес странички, загружает страничку, парсит данные, записывает в файл.
    Затем срипт берёт второй элемент массива (2) и делает аналогичные действия.

    Вопросы:

    1. Бесплатная версия позволяет работать в многопоточном режиме?
    2. Как модифицировать скрипт, чтобы парсинг работал в многопоточном режиме?

    Я так понял, что каждый поток должен взять определённый диапазон адресов страничек (например с 1 по 500, с 501 по 1000 и т.д.) и распарсить его. Но как потоки поймут, что:

    • Нужно брать цифры именно из моего массива
    • Какой диапазон брать (какие уже взяты соседними потоками)
    1. Все потоки должны записать результат парсинга в один .txt файл, лежащий на локальном диске. Что произойдёт, если один поток будет писать данные в файл (допустим 20 милисекунд) и в это момент другой поток тоже попытается записать данные в файл? Второй поток завершится с ошибкой? Запись не произведётся? Или ещё какие-то варианты?


  • @morozover

    1. да
    2. использовать ресурсы
    3. оба запишут в файл. вопрос очередность записи, т.е. что первым запишеся.


  • Если url отличается только числом, то можно получить у каждого потока [[THREAD_INDEX]] в "Статистика скрипта".
    Далее можно запустить цикл через For и чтобы каждый поток брал свои страницы, то нужно все это умножать на [[THREAD_INDEX]]
    Как вариант установить границы для цикла For

    от
    ([[THREAD_INDEX]]-1)*10000+1 
    до 
    [[THREAD_INDEX]]*10000
    

    При данной логике каждый поток будет обрабатывать по 10000 вариантов

    Также можно вручную поделить диапазоны и расписать их в txt файле и "Парсить строку"

    0;100000
    100001;200000
    200001;300000
    и т.д
    


  • Ребята, простите, но всё равно не понятно.

    Как эти потоки создать?
    Какие конкретно блоки нужно вставить в скрипт, чтобы этот многопоток заработал?
    Как это будет выглядеть? Можно хотя бы какой-то минималистичный пример?



  • b8f37112-5e15-4484-84cc-416e6f03dafa-image.png

    И чтобы лучше разобраться, то нужно посмотреть видео



  • @GameBot из-за разницы выполнения некоторые потоки будут простаивать вконце



  • @tet-vivi said in Как сделать многопоточный парсинг (объясните простыми словами, пожалуйста):

    @GameBot из-за разницы выполнения некоторые потоки будут простаивать вконце

    Чтобы этого избежать можно тупо взять и загнать в файл с 1 до последнего нужного нам id. Далее создать ресурс из файла.
    Единственная проблема: что делать если требуется спарсить более миллиона страниц?



  • @GameBot


    использовать бд.
    можно пачками получать набор ид которые еще не обработаны.
    опробовано на практике.(~15 миллионов ид/страниц)


    можно на асинхронных функциях в цикле.
    текущий N и запуск новых M. и при интеграции N = N + M.


    Чтобы этого избежать можно тупо взять и загнать в файл с 1 до последнего нужного нам id. Далее создать ресурс из файла.

    если не критично, можно исключить работу с файлом. А сразу создать ресурс и загнать туда набор ид.


Log in to reply