Имеется сайт, допустим -http://megashara.com/ Интерес представляют профиля пользователей. Профиля имеют такую структуру = http://megashara.com/member/7074819. Нужно пройтись по всем профилям, начиная от member/1 до member/700000 и спарсить все емайлы и имена пользователей. Записи сохранять в таком виде: name;email Подскажите пожалуйста, как правильно настроить парсер для этой задачи?
Заходим в Тестовый парсинг - там будем настраивать новый пресет Выбираем парсер Net::HTTP - этот парсер просто парсит содерживое указанной страницы Далее добавляем опцию Parse custom result - с помощью этой опции мы можем используя регулярные выражения выделить со страницы нужную информацию Выбираем какой результат мы будем обрабатывать - {data} - содержимое скачанной страницы, указываем следующее регулярное выражение: Код: участнике <b>(.*?)<.*?Имя: <b>(.*?)< Указываем флаг s - поиск с учетом переноса строки. В нашем регулярном выражении 2 захватыющие группы - первую мы сохраняем в переменную name, вторую в mail Далее переопределяем формат результата: {name};{mail}\n В качестве запроса указываем адрес страницы профиля, на которой мы будем тестировать парсинг Запускаем тест - проверяем что в результат сохраняются необходимые нам данные(последняя строка в логе) После чего нажимаем иконку сохранить(справа вверху) и все настройки перенесутся в добавление задания(Add task) Из условий задачи нам надо перебрать пользователей от 1 до 700000 - указываем ссылку и макрос {num:1:700000} собственно и все
Разбор полетов породил несколько вопросов 1. Можно обойтись без регулярок при определении границ парсинга? В ContentDownloader для юзабельно сделан этот нюанс. Или же без регулярок не обойтись и лучше потратить время на их изучение? 2. Второй вопрос вытекает из первого, флаг ' s ' - это символ из регулярок или же это что-то из внутренней логики парсера? Что означают другие символы? 3. Код: участнике <b>(.*?)< Эта регкулярка ищет, как я понимаю, любые символы, до первого символа? Код: < Если в качестве имени будет указан [email protected] - будет ли сохранен данный майл ? 4. На мегашаре емайлы в профилях попадаются еще и в других полях, например: http://megashara.com/member/7195980 - тут емайл адрес прописан в поле Email: - Код: Email: <b><a href="mailto:syrotyuk020895%40mail.ru" target="_blank" rel="nofollow">[email protected]</a></b></div> http://megashara.com/member/7069431 - на этой страничке юзер оставил свое мыло в поле Откуда: http://megashara.com/member/787466 - а тут юзер перепутал поля и прописал свой емайл вместо адреса сайта - Сайт: http://[email protected]. Такое мыло тоже нужно спарсить и преобразовать в нормальный вид http://megashara.com/member/7134313 - в этом примере емайл записан в поле = Вконтакте: [email protected] http://megashara.com/member/6977724 - тут мыло записано вместо моего мира - Мой мир: [email protected] http://megashara.com/member/7173809 - на это страничке мыло вообще неприкаянное в самом низу профиля записано Собственно вопрос, имеет ли смысл прописывать каждое из возможных условий парсинга или же проще будет прописать одну регулярку, которая будет искать емайлы в любых произвольных местах странички?
без регулярок не обойтись, всмысле кастомный парсинг в апарсере реализован только с их помощью, скоро будет еще xpath это флаг регулярок, подробнее тут http://a-parser.com/wiki/customresult/ 3. Да, на оба вопроса 4. Проще последний вариант, т.е. собирать все емейлы по регулярке со страницы
А можно пример регулярки, которая будет вытаскивай майл из любого блока со странички? И еще вопрос, запустил парсер на 1000 потоков для парсинга майлов с другого крупного сайта, посмотрел собранные результаты. Для сравнения запустил Content Downloader на 50 потоков, подождал подольше, пока тотже объем страничек спарсится. В результате, CD собрал в несколько раз больше данных. Я так понимаю, что это может быть связано с тем, что А-парсер перегружает сервер на 1000+ потоках и сервер выдает нам 403 или 500 ошибки? Для такого кол-ва потоков нужно прокси использовать, или тут единственный вариант - уменьшать потоки?
Обычно нет необходимости выставлять столько потоков при парсинге какого либо сайта без прокси. 50 потоков апарсера будут в 5-100 раз быстрее любого парсера потипу Content Downloader, которые используют браузерные движки Примеры и обсуждение регулярок в этой теме http://a-parser.com/posts/1240/
Такой еще вопрос возник. Настроил парсер, в первом parse result вытаскиваю никнейм, во втором - любой емайл на страничке. Запускаю в тестовом режиме, все парсит отлично. Добавляю парсер в очередь заданий, запускаю. В результате, ники не парсятся, только емайлы... Где тут баг?