многопоточный парсинг

AgentRassilok

Известная личность
Регистрация
08.11.2016
Сообщения
1 272
Благодарностей
466
Баллы
83
хай, есть 2 млн айди, их надо спарсить и засунуть в файл.
шаблон - ниче особенного - гетзапрос->дом->регекс>положить в список>увеличить счетчик


в 1 поток на запросах норм, как сделать многопоточно если будет к примеру 30 млн айди?

может есть готовое решение? пасиб
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Вариант 1. Вместо счётчика создать список страниц
C#:
IZennoList pageList = project.Lists["PageList"];
pageList.AddRange(Enumerable.Range(0, 10000).Select(x => x.ToString()));
и брать строки с удалением в переменную номера страницы.

Вариант 2. Использовать глобальную переменную для увеличения счетчика.

Вариант 3. Параллельные запросы
 
  • Спасибо
Реакции: AgentRassilok

AgentRassilok

Известная личность
Регистрация
08.11.2016
Сообщения
1 272
Благодарностей
466
Баллы
83
пока придумал задавать входные настройки откуда парсить

например первый шаб парсит с 1 по 200 к
второй с 200 к по 400 к
третий с 400 по 600
и так дальше.

выходит все должны быть переименованы pars1/pars2/pars3 и для всех разные файлы

эпопея блин
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Я не понял тему. Есть список с урлами, которые надо парсить, и вся проблема только в том, что список оооочень большой, и его трудно загрузить в зенку целиком, и брать нормально с удалением строки?
Я в таких случаях разбивал файл текстовыми утилитами на 1000 штук (по 10 мб) под названием файл1, файл2…. файл100. Потом подключал в шаблоне блок с алгоритмом взятия строк по очереди с файла1, если файл пустой, то ищем файл2, и т.д. Давать?
 
  • Спасибо
Реакции: AgentRassilok

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
  • Спасибо
Реакции: AgentRassilok

AgentRassilok

Известная личность
Регистрация
08.11.2016
Сообщения
1 272
Благодарностей
466
Баллы
83
Я не понял тему. Есть список с урлами, которые надо парсить, и вся проблема только в том, что список оооочень большой, и его трудно загрузить в зенку целиком, и брать нормально с удалением строки?
Я в таких случаях разбивал файл текстовыми утилитами на 1000 штук (по 10 мб) под названием файл1, файл2…. файл100. Потом подключал в шаблоне блок с алгоритмом взятия строк по очереди с файла1, если файл пустой, то ищем файл2, и т.д. Давать?
у тебя есть vk.com/piter , vk.com/moskva,vk.com/tailand

в гетзапросе меняется vk.com/variable.city, ты регексом ищещь на странице нужные вхождения и ложишь их в файл
например со страницы vk.com/piter у тебя возьмет 20 телок

ssilka-1 - lena
ssilka 2 - olya
ssilka 3 - lera
ssilka 20 - oksana

дальше меняешь город. и снова 20 значений ложишь в файл. таких городов у тебя к примеру 50 000

так вот как сделать это в многопотоке а не как сейчас
Проблема со счетчиком в многопотоке. Значение счетчика, как я понял - это номер страницы, с которой парсятся id'шки.
да
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
С vk не работаю и особо не в курсе, что там и как, но думаю, что парсинг лучше реализовать через API или может есть сервис, где данные можно получить в JSON формате.
 
  • Спасибо
Реакции: AgentRassilok

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43
шаблон - ниче особенного - гетзапрос->дом->регекс>положить в список>увеличить счетчик
а если отказаться от цикла? (и добавить в шаблон выход по красной линии при отсутствии строк в файле)
Делаешь в шаблоне 1 заход выполнения и все? У тебя 2 млн. строк, значит надо выполнить соответствующее количество раз (запускаешь выполнить без ограничений) в любое количество потоков. Строки из файла берутся с удалением, значит сложность будет одна - блокировать файл, чтобы та же самая строка не бралась разными потоками одновременно. В C# вроде есть возможность блокировки файла для других потоков (но тут я не специалист), либо через БД можно такое же организовать. Ну это мое видение решения для многопотока.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
значит сложность будет одна - блокировать файл, чтобы та же самая строка не бралась разными потоками одновременно. В C# вроде есть возможность блокировки файла для других потоков
Использовать стандартный кубик взятия строки из списка - в нём реализована данная блокировка.
 
  • Спасибо
Реакции: kapelan28

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43

AgentRassilok

Известная личность
Регистрация
08.11.2016
Сообщения
1 272
Благодарностей
466
Баллы
83
а если отказаться от цикла? (и добавить в шаблон выход по красной линии при отсутствии строк в файле)
Делаешь в шаблоне 1 заход выполнения и все? У тебя 2 млн. строк, значит надо выполнить соответствующее количество раз (запускаешь выполнить без ограничений) в любое количество потоков. Строки из файла берутся с удалением, значит сложность будет одна - блокировать файл, чтобы та же самая строка не бралась разными потоками одновременно. В C# вроде есть возможность блокировки файла для других потоков (но тут я не специалист), либо через БД можно такое же организовать. Ну это мое видение решения для многопотока.
лол файла нету. как вам обьяснить я хз ))

есть посты на зеннолабе post-313386
post-313385
post-313384
post-313383

в каждом посте ты парсишь ники обсуждающих и ложишь в файл.

вопрос как это сделать в многопотоке. Вон сказали уже через глобалку либо C#) вопрос решен спасибо )
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Для нормальной работы в многопотоке лучше использовать БД, а не файлы.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)