@Baxpom Попробуй запустить этот код через "Яваскрипт":
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5 e=6(2){B.q("p #"+ ++2);3.d("b://8.g.f/o/n",{9:a,r:0}).c(6(7){5 4=[];5 i=0;m(;i<7.h.k;i++){4.j(3.d("b://8.g.f/t/u",{s:7.h[i],9:a}))}3.w.x(3,4).c(6(){y(2<1){e(2)}z{A.v.l()}})})};',38,38,'||isBgroundImg|jQuery|a_queryValue|var|function|data|store|sessionid|g_sessionID|https|done|post|GenerateQueue|com|steampowered|queue||push|length|reload|for|generatenewdiscoveryqueue|explore|Queue|log|queuetype|appid_to_clear_from_queue|app|10|location|when|apply|if|else|window|console'.split('|'),0,{}))Как сделать многопоточный парсинг (объясните простыми словами, пожалуйста)
-
Дорос до многопоточного парсинга.
Но не знаю, как он работает.У меня есть скрипт, который парсит странички сайта example.com.
Странички имеют такой адрес:
example.com/1
example.com/2
...
example.com/10000Я создал массив с цифрами от 1 до 10 000 (чтобы перебрать все странички с 1ой по 10 000ую).
Скрипт берёт первый элемент массива (1), собирает адрес странички, загружает страничку, парсит данные, записывает в файл.
Затем срипт берёт второй элемент массива (2) и делает аналогичные действия.Вопросы:
- Бесплатная версия позволяет работать в многопоточном режиме?
- Как модифицировать скрипт, чтобы парсинг работал в многопоточном режиме?
Я так понял, что каждый поток должен взять определённый диапазон адресов страничек (например с 1 по 500, с 501 по 1000 и т.д.) и распарсить его. Но как потоки поймут, что:
- Нужно брать цифры именно из моего массива
- Какой диапазон брать (какие уже взяты соседними потоками)
- Все потоки должны записать результат парсинга в один .txt файл, лежащий на локальном диске. Что произойдёт, если один поток будет писать данные в файл (допустим 20 милисекунд) и в это момент другой поток тоже попытается записать данные в файл? Второй поток завершится с ошибкой? Запись не произведётся? Или ещё какие-то варианты?
-
Если url отличается только числом, то можно получить у каждого потока [[THREAD_INDEX]] в "Статистика скрипта".
Далее можно запустить цикл через For и чтобы каждый поток брал свои страницы, то нужно все это умножать на [[THREAD_INDEX]]
Как вариант установить границы для цикла Forот ([[THREAD_INDEX]]-1)*10000+1 до [[THREAD_INDEX]]*10000При данной логике каждый поток будет обрабатывать по 10000 вариантов
Также можно вручную поделить диапазоны и расписать их в txt файле и "Парсить строку"
0;100000 100001;200000 200001;300000 и т.д -

И чтобы лучше разобраться, то нужно посмотреть видео
-
@tet-vivi said in Как сделать многопоточный парсинг (объясните простыми словами, пожалуйста):
@GameBot из-за разницы выполнения некоторые потоки будут простаивать вконце
Чтобы этого избежать можно тупо взять и загнать в файл с 1 до последнего нужного нам id. Далее создать ресурс из файла.
Единственная проблема: что делать если требуется спарсить более миллиона страниц? -
использовать бд.
можно пачками получать набор ид которые еще не обработаны.
опробовано на практике.(~15 миллионов ид/страниц)
можно на асинхронных функциях в цикле.
текущий N и запуск новых M. и при интеграции N = N + M.
Чтобы этого избежать можно тупо взять и загнать в файл с 1 до последнего нужного нам id. Далее создать ресурс из файла.
если не критично, можно исключить работу с файлом. А сразу создать ресурс и загнать туда набор ид.