Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Практически готовое приложение на НБ выполняющее автоматизацию в наполнении интернет магазина, а так же его администрировании. Что умеет: Главное окно 1) Записывать прайсы в базу данных как общую так и для каждого поставщика отдельную (из csv) 2) Контроль от дублирования товаров 3) Обновление базы 4) Корректная работа с утф8 Окно Базы 1) Поиск по базе 2) Генератор ссылок 3) Редактирование базы Окно парсера 1) Парсинг 2) Контроль цен по хотлайн.юа
Это пожалуй самые основные функции. Остальное дорабатываю, а именно: 1) импорт из екселя 2) крон задачи 3) експорт в xml
Выкладываю компилированную версию и исходник для тех кому нужен, совершенно бесплатно Не судите строго, пытаюсь довести все до ума но много нюансов которые не дают этого сделать. Хелпа тоже покамест нету, но скоро будет.
Добавлено (17 Февраля 2014, 18:39) --------------------------------------------- Очень попрошу местных знатоков помочь в одном очень щепетильном деле. Закачав прайс тест, выбрав разделителем ; (точка с запятой) создаются записи в базе созданной и артикульной базе, находящейся в правом верхнем углу главного окна кнопка [V] покажет ее. Записи создаются верные и правильные. Выбрав в парсере чекбокс "APC", с парраметром парсинга "Hotline_apc" и для чекбокса "из бд" ссылкой "hotline.ua/sr/?q=[1]&tab=pr&sort=0", происходит парсинг. сейчас я его активно "мучаю" на предмет правильной записи в артикульную базу. Спарсив цены должна происходить запись в базу этих цен в соответствии с артикулами, но возникает казус и артикулы перезаписываются. Соответственно получается каша. В примере все очень печально в плане кода и переменных. Если есть желание помочь - буду очень признателен.
За парсинг цен из базы отвечает исходник "pars", а точнее subroutine "pars_bd_start" А в основном окне все операции с парсингом обрабатывает subroutine "parser_run"
Понимаю что пример совсем не пример, и там много всего. Но если возникнут вопросы - я сразу же отвечу что и зачем там написано.
Добавлено (17 Февраля 2014, 18:41) --------------------------------------------- Приложение
Добавлено (17 Февраля 2014, 18:47) --------------------------------------------- Программа весит 4,5 мб ограничение к загрузке 1000 кб как правильно поступить чтоб не заливать на файлообменники?
Добавлено (17 Февраля 2014, 18:52) --------------------------------------------- Скачать программу
Прикольно, жаль только не хрена не понятно, в исходнике не хватает картинок и какой то функции. Да и в описании не помешало бы указать какие плагины использовал при создании.
И к программе явно будит нужен кокретный такой ХЕЛП. Как парсить, что парсить, и зачем парсить я вообще не понял. "Вы знаете, нам очень понравились все варианты, что вы прислали. Даже не знаем, что выбрать… А может попробуем объединить все три логотипа в один?"
Сообщение отредактировано anton - Пн, 17 Февраля 2014, 19:07
Добавлено (17 Февраля 2014, 19:08) ---------------------------------------------
Цитатаanton ()
Участник Прикольно, жаль только не хрена не понятно, в исходнике не хватает картинок и какой то функции. Да и в описании не помешало бы указать какие плагины использовал при создании.
используются hpwutility, и zmfunctions
Добавлено (17 Февраля 2014, 19:15) --------------------------------------------- Расскажу предысторию. Есть интернет магазин. Меня попросили наполни его 50к товарами. В прайсах есть имена, ссылки на картинки и артикулы. Цен и описаний нет. Магазин на опен карте. Использован модуль автонаполнения товарами. Задача сделать так чтоб цены автоматом проставлялись в магазине и было всем товарам описание. Парсер собственно и выполняет эти задачи, а чтоб контролировать наличия и товары на которые все делается вручную и создана программа прайс миксер.
Добавлено (17 Февраля 2014, 19:18) --------------------------------------------- А так же, имея НБ не имеющий многозадачности, было придуманно использовать парсер ка маленькую утилитку запускающуюся Nое количество раз и общающуюся с основным приложением через файл pars, в который передаются нужные для запуска и действий параметры
Добавлено (17 Февраля 2014, 19:20) --------------------------------------------- Еще я так и не придумал как отлавливать приложения парсера которые запустились но не появились в окошках. Сейчас я их отключаю вручную через диспетчер задач, что не по феншую, но реализацию не придумал еще
А так же, имея НБ не имеющий многозадачности, было придумано использовать парсер ка маленькую утилитку запускающуюся Nое количество раз и общающуюся с основным приложением
Это понятно, и тут не поспоришь, для ускорения процесса это единственное верное решение. Только у меня парсинг не завелся... Вернее все пошло, но данные ни какие не считывались по ссылке "hotline.ua/sr/?q=[1]&tab=pr&sort=0"
Цитатаwi1w ()
Расскажу предысторию. Есть интернет магазин. Меня попросили наполни его 50к товарами. В прайсах есть имена, ссылки на картинки и артикулы. Цен и описаний нет. Магазин на опен карте. Использован модуль автонаполнения товарами. Задача сделать так чтоб цены автоматом проставлялись в магазине и было всем товарам описание.
Ну теперь чуть более понятно что за зверь. Завтра покурю твой код, только выложи исходник в соответствии с рекомендациями mishem, "Вы знаете, нам очень понравились все варианты, что вы прислали. Даже не знаем, что выбрать… А может попробуем объединить все три логотипа в один?"
Ну теперь чуть более понятно что за зверь. Завтра покурю твой код, только выложи исходник в соответствии с рекомендациями mishem,
сообщением выше в прикреплении возьми.
Для того чтоб завелась ссылка эта нужно загрузить тестовый прайс в базу. Для этого выбери Артикул и Название в главном окне слева. справа увидишь подсказку что да как ибо там первая строка из прайса. Далее в Парсере отметь APC, Из БД и выбери параметр парсинга хотлайн апц
Добавлено (17 Февраля 2014, 19:32) --------------------------------------------- в папке парсрезулт будет результат парсинга, в файле not_found, возле екзешки получишь ненайденные ссылки.
как правильно поступить чтоб не заливать на файлообменники?
wi1w, раздел "Готовые проекты" предназначен для исходников, а не исполняемых файлов. Скомпилированные проекты (программы) выкладывать в разделе "Свободное общение". Пожалуйста, выложите проект в виде исходного кода, тогда тема будет перенесена в "Проекты NeoBook" - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
В первом посте это "Прикрепления: Sors.zip(25Kb)" - не полный исходник В шестом посте это "Прикрепления: 3487451.zip(861Kb)" - полный исходник "Вы знаете, нам очень понравились все варианты, что вы прислали. Даже не знаем, что выбрать… А может попробуем объединить все три логотипа в один?"
Сообщение отредактировано anton - Пн, 17 Февраля 2014, 19:52
wi1w, раздел "Готовые проекты" предназначен для исходников, а не исполняемых файлов. Скомпилированные проекты (программы) выкладывать в разделе "Свободное общение". Пожалуйста, выложите проект в виде исходного кода, тогда тема будет перенесена в "Проекты NeoBook"
Цитатаwi1w ()
Прикрепления: 3487451.zip(861Kb)
Добавлено (17 Февраля 2014, 19:49) --------------------------------------------- Прав для редактирования шапки не имею
Я добавил в первое сообщение полный исходник. Тема перенесена в "Проекты NeoBook".
Добавлено (17 Февраля 2014, 20:08) ---------------------------------------------
Цитатаanton ()
Peter, так он выложил и то и то...
К сожалению, прикрепления к постам не всегда заметны, и без специального пояснения-напоминания об их присутствии и содержании, можно их проглядеть. Например, я всегда в своих постах специально указываю на наличие прикрепления. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
По поводу ошибки с парсером я расскажу какие действия я выполняю и что хочу получить. Имеем несколько колонок в базе: 1) это артикул с которого получается ссылка и который служит идентификатором 2) всякая фигня (несколько колонок часть скрытых) 3) цена (скрытая) 4) имя (скрытая) 5) инструкция парсера (скрытая) Парсер берет первый артикул и создает ссылку, переходит ... делает нужное действие ... получает цену Записывает цену в поле цена в базу. И таких 20 "потоков" тоесть базу открываю в мультиюзере. рефрешу вначале, получаю запись которую еще не проходил парсер методом проверки булевого значения в колонке 5. Устанавливаю False в поле 5 этого товара. В конце же записываю методом сетвар "[база.цена]" "результат парсера".
И каково же мое разочарование когда я вижу что в базе появляются "дубли" тоесть по факту не дубли, а строки которые перезаписаны. В начале я имею к примеру 5000 уникальных строк, а в конце получаю 1500 уникальных, а все остальные - дубли этих полторатыщ.
Знаю что проблема именно в мультиюзере. При работе в 1 поток такого нету. Пробовал уже много чего, автоедит запрещал и сохранял только при установке False, и самой цены; и дбквери прописывал по полю 5; И удалять рекорд и восстанавливать в порядковую запись откуда считал. Вобщем попыток было много Отчаялся и прошу помощи. Описал я это все потому что исходник плохо закомментирован. Выложил гораздо раньше чем планировал ибо в панике просто.
Так, код у тебя голову сломаешь (это не значит что он плохой, это значит что он большой и писался не мной), в тонкостях не стал разбираться но в суть вьехал. Сейчас постараюсь пояснить какой подход к скачиванию данных в несколько потоков я бы применил.
Начнем с разбора урл адреса: hotline.ua/sr/?sort=0&q=p&tab=pr&p=n
Итак: p - это поисковый запрос, в принципе он нам особенно не нужен n - это номер страницы на сайте от 0 до общего количества найденных согласно поисковому запросу, вот он нам и нужен.
Теперь посмотрим на саму страницу. На каждой страницы выводится по 20 найденных товаров.
Соответсвено что мы делаем. Пишем парсер который будит считывать данные со страницы и помещать в текстовый документ в соответствии с логикой csv файлов. Т.е. представим что нам надо запустить парсинг в 3 потока. Каждый запущенный парсер открывает свою страницу просто заменив значение n в адресе сайта, первый открывает нулевую второй первую, треитий вторую. Первый парсер считывает все 20 товаров и помещает их в текстовый документ в строки с 1 по 20. Второй парсер считывает так же 20 товаров и помещает их в строки с 21 по 40. Тртитий в строки с 41 по 60.
Когда первый парсер отработает он переходит на страницу 1+3 (прибавляем именно три потому что парсинг в 3 потока) т.е. он переходит на 4 страницу и начинает записывать данные в строки с 61 по 80. (Переходит на 4 страницу и пишет именно в строки с 61 по 80 вне зависимости от того отработали второй и третий парсер свои 20 товаров) Второй когда отработает, переходит на страницу 2+3 т.е на страницу 5 и начинает записывать товары в строки с 81 по 100, третий переходит на страницу 6 и пишет в строки со 101 по 120.
И так продолжается пока не пропарсятся все страницы. Когда парсинг завершен, на всякий случай очищаем полученный файл от пустых строк и импортируем его в пустую Базу данных.
При такой логике не должно будит быть дублей и замен. Надеюсь я понятно описал мое представления данной задачи.
Сейчас пока нет времени делать пример, как маленько освобожусь сделаю, но это не раньше чем после завтра.
P.S. --------------------------- сейчас попробовал реализовать. просто несколько потоков записи в файл... Выяснилось что в несколько потоков (программ) с одним текстовым фалом работать не получиться. Забыл что когда файл открыт в одной программе для других он становиться только для чтения. Так что вариант 1 вижу, разбиваться парсинг по фалам, а потом по окончанию вгружать поочередно в 1БД. А в остальном логика таже. "Вы знаете, нам очень понравились все варианты, что вы прислали. Даже не знаем, что выбрать… А может попробуем объединить все три логотипа в один?"
Сообщение отредактировано anton - Вт, 18 Февраля 2014, 17:14
Небольшие пояснения по ходу и костыли. Запустив например те же 3 потока (тоесть 3 программы выполняющие одну и ту же задачу.) Не три потока как их представляют себе многи а именно 3 программы.
Костыль с обработкой в последовательности открытия страниц: Если вдруг одно из приложений запустилось но не работает, что бывает. Тогда не получится отследить сколько страниц пройдено, а сколько пропущено из-за "зависшего" приложения\потока. Поиск следующих страниц происходит в самом приложении потока - а соответственно обработчик не знает сколько страниц найдено 1 или 100. У меня это так: гружу первую страницу по запросу hotline.ua/sr/?sort=0&q=[фраза]&tab=pr и тут же в потоке ищу сколько страниц найдено. Так как все цены не нужны, а нужно например всего 5 ключевых цен, а все остальные это мусор. То и ищу их, но не просто ищу, а в том порядке в каком указано в опции. Например: 1) цена магазина розетки, 2) цена 5ок магазина. В разнобой нельзя ибо на последнем этапе происходит сравнение цен по процентному соотношению чтоб отсечь слишком мелкие и не поставить большую цену. Но считая все же приоритетом именно первую цену.
в цсв вывожу посковый запрос по которому искал, цену выбранную, и все найденные цены в их порядке установленном в настройке парсинга.
Добавлено (18 Февраля 2014, 15:12) --------------------------------------------- В один поток работает все верно, но стоит включить хотя бы 2 - то возникают перезаписи. В моем представлении это происходит в силу того что переменные базы (типа [база.код товара]) не очищаются и при переходе на следующую строку по условиям наличия (а именно если в поле наличие или в поле каталог в данной строке стоит значение False то переход на следующую строку, и так пока не найдет не спарсенный еще товар), происходит перезапись строки на которую переходим значениями из строки выше.
Но по личным наблюдениям определил что не всегда, а предположительно, только если другой любой поток выполняет сейведитс. Опять же не уверен что это так, но очень похоже.
Тоесть получается что нужно "пролистать" 20 строк и пока 1 поток листает до не парсенного, другие потоки сейвят и получается так что некоторые строки перезаписаны, а некоторые нет.
Добавлено (18 Февраля 2014, 15:16) ---------------------------------------------
Цитатаmishem ()
Вы мне объясните, что значит в несколько потоков.
Это условное обозначение попытки обойти монопоточность запуском 1 екзешки много раз. В моем случае мощность компьютера позволяет выполнять в 15 "потоков" без потери производительности и в 20 но с тормозами системы. Такое действие очень грузит процессор но по другому никак, по крайней мере я ничего не придумал. каждый поток занимает около 25мб оперативной памяти компьютера и очень много процессорного времени.
Но тут пока ничего поделать не могу.... Очень много логики в парсинге цен.
Я так думаю, что с одной и той же базой много поточность не получится сделать. Нельзя одновременно читать и записывать несколько записей сразу.
Можно что сделать. Прочитать все записи во временый файл. Разбить этот файл на несколько файлов, или читать из этого файла (опять же, получится ли читать одновременно? чтение файла, это его открытие. А если файл открыт одной программой, то я не знаю, сможет ли тоже самое сделать другая).
Разбиваем файл на двадцать файлов по строкам 1 файл, строки 1-100, второй 101-200 и т.д. (это к примеру) после обрабатывать именно файлы а не базу. После обработки собирать в один файл и импортировать в базу.
Просто прежде чем это делать решил с вами посоветоваться, ведь есть же в базе мультиюзерность. НеобукДБ якобы позволяет открывать нескольким юзерам одну Бд.
На эту тему пробовал замыкать запись до сохранения, что-то не очень получилось. Только скорость падает, а толку 0
Хотя может не так делал. Делал так: открывал базу перед считыванием. Читал запись, замыкал ее, вносил изменения если нужны (проставлял что эта запись спарсенна, чтоб другие не смотрели ее) экспортировал в переменную, сохранял обрабатывал все с переменной, а потом снова открывал базу, замыкал, вносил результат, сохранял изменения и закрывал базу.
Во первых, лично мое мнение. Выкинул бы вообще из головы затею многопоточности. Во вторых, использовал бы плагин hpwControl для извлечения данных методом регулярных выражений, что в разы ускорило бы процесс поиска данных. Или на крайний случай использовал бы только два потока, где обрабатывались бы в одном четные, в другом нечетные строки. Не хочешь читать хелп?
В 2 потока конечно быстрее, чем вручную, можно и поставить на первое время, но если делать сетевую версию редактора товаров для манагеров то печально получается. Про регулярки думал, но тут опять таки нужна скорость но не перебор, дабы сервер донора не расценил как ддос атаку и не заблокировал ип. И так если в 20 потоков делаю то получается 1-2 товара в секунду спарсивает. А это не факт что на 1 странице
wi1w, Вообще конечно для твоей программы мощности NeoBook впритык, а скорости откровенно маловато... Потоки через отдельные программы делать можно конечно, но тяжко, а если еще и учесть логику которая должна отрабатываться в твоей софтине, то вообще жуть...
"Вы знаете, нам очень понравились все варианты, что вы прислали. Даже не знаем, что выбрать… А может попробуем объединить все три логотипа в один?"
Тогда не получится отследить сколько страниц пройдено, а сколько пропущено
Цитатаwi1w ()
соответственно обработчик не знает сколько страниц найдено
Ой, как вот это:
Цитатаmishem ()
Выкинул бы вообще из головы затею многопоточности
верно!
Ох, уж эта многопоточность... Много раз уж было повторено, что скриптовые языки в принципе не способны на многопоточность. Да и в нормальных языках, реализация многопоточности требует немалого опыта и мастерства, т.к. помимо плюсов, многопоточность имеет и минусы, а при неумелом использовании принесет только вред, начиная с зависания и вплоть до полного вылета приложения. Это так, мысли вслух... Одна из основных задач при использовании многопточности заключена в синхронизации работы потоков, поскольку их нельзя (и бессмысленно) пускать на самотек. В нормальных языках возможность согласованной работы нескольких потоков имеется (иначе в них не было бы смысла), а вот в варианте "несколько приложений" она отсутствует. Можно, конечно попробовать использовать плагин (по-моему от HPW, название точно не вспомню сейчас, mishem, должен знать ) для обмена данными между двумя приложениями NB (применик/передатчик), но только боюсь это не решит проблему согласованной работы, да и слишком мудрено будет.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться