Все привет! Пишу парсер магазина, но что-то он слишком долго как по мне работает.
Алгоритм парсинга следующий:
Количество страниц категорий мне известно, поэтому прохожусь по ним через for, все ссылки на товары записываю в массив, далее прохожусь по нему через foreach, получаю нужные данные - картинки сохраняю в папку, характеристики пишу в csv.
Скрипт запускаю открытием страницы на локальном сервере, т.е весь код пишу в index.
Такая логика обрабатывает 1500 страниц за ~350 секунд. А что, если сайт на 30 000 страниц, как в таком случае быть? Подозреваю, что работу можно разбить на несколько итераций, например сначала сохранить массив ссылок, отдельно по нему проходиться, но не хочу особо костылить, поэтому спрашиваю вашего совета.
В работе использую phpquery.
~4-5 товаров / сек - это ахренеть как довольно быстро. Видимо мало картинок или вы миниатюры сохраняете только... В принципе основное время уходит на скачивание полноразмерных изображений, а все остальное так... пыль))
Я как-то помню качественно парсил качественный магазин, в котором на каждом товаре ~3-6 фоток в приличном разрешении, при ~15Мбитах получалось в среднем 2-4 сек/товар, т.к. получил html, разобрал и распихал данные по запросам, и скачиваю большие фотки, получил фотки, и каждую програмно:
- уникализировал
- налепил ватермарки (вообще нагло конечно, но так клиент захотел:))
- сгенерил миниатюры
- ну и плюс время на сохранение на диск (hdd 7200rpm)
Так что вы со своими 350 секундами радуйтесь! Наверно... т.к. скорее всего вы не настолько качественно парсите...
Спасибо за ответ, но такой нюанс, при парсинге, у меня страница в браузере весь период работы скрипта находиться в процессе загрузки, я боюсь что на больших количествах какой-то timeout у браузера точно вылетит и не даст мне завершить работу. Скрипт можно как-то запустить фоново, консольно?
Можно и консольно. Но если запускать консольно, и также возникнет какая-то ошибка (например интернет отпадет) - то что будет с результатами вашего процесса ?
Поэтому придумали такую штуку под названием "Очередь".
Максим Осадчий, не надо ничего консольно-фоново запускать (точнее не в этом вопрос вообще), у вас просто напросто отсутствует контроль выполнения "итерации" (хотя в вашем случае без кавычек). Вы "выпускаете пулю" и не удостоверившись и не дождавшись подтверждения, что она попала в цель - отмечаете ее "пораженной" переходя к следующей цели.
Я бы делал так (возможно и вам что-то будет полезным из этого):
- во-первых, посмотрел есть ли sitemap и если да - проверил его качество (сравнил с индексом ПС), если все ок - список урлов товаров готов и не надо парсить никакие категории для этого. Если нет - в моем случае (поскольку лень было в парсер дописывать граббинг урлов) запустил бы xenu и получил список урлов товаров.
- в произвольной БД создал таблицу со структурой типа: id, url, status, comments где основным по смыслу является status например enum('wait', 'parsing', 'done', 'error')
- запускал бы экземпляры парсера обрабатывая первый урл со статусом 'wait' из таблицы и ... ну думаю дальше все понятно....
При такой схеме мы можем контролировать (перезапускать если надо) парсинг каждого урла, также опираясь на кол-во одновременных записей со статусом 'parsing' можем контролировать кол-во потоков ну и по завершении формировать отчет какой-то и что еще в больную голову взбредет...