Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Tools (http://mangos.ytdb.ru/forumdisplay.php?f=22)
-   -   WoWHead Data parser (http://mangos.ytdb.ru/showthread.php?t=5443)

Lordronn 15.05.2012 20:35

WoWHead Data parser
 
Вложений: 2
Представляю вам свой WoWHead Data parser, который я пишу уже довольно долго, когда только появляется свободное время.

Ссылка на репозиторий: https://github.com/Lordron/WoWHead-data-parser
Бинарники в аттаче (.NET 4.0 Client Profile)

Парсер поддерживает 4 вида парсинга:
-По одному Id
-По диапазону Id
-По списку Id
-По фильтру вовхеда (только некоторые парсеры)

Хочу обратить внимание, что список Id я получил с вовхеда, а не брал его из головы.

http://filebeam.com/d0439975dbb3fb96...b992ba73f9.jpg

В первом выпадающем меню выбирается локализация и, соответственно, сервер.
Во втором выпадающем меню выбирается парсер

Single, Multiple, List, WoW Head Filter - вид парсера, я описывал выше.
(Если вы выбрали тип List, то в выпадающем меню в этой вкладке выбирайте ту строку, которая похожа на парсер. Т.е для парсера тренеров - trainer.welf, а для книжек - page.welf)

Программа поддерживает следующие парсеры
http://filebeam.com/354fad0c6d8357cc...f284dca6c6.jpg


С версии 2.1 добавлен конфиг файл, в котором мы можете настроить вывод sql запросов
http://filebeam.com/9a4ec1dd71be3db5...1b1c0ab0d4.jpg

Welf format


Пожалуйста тестируйте и отписывайтесь о том, что не исправно и чего не хватает. Очень жду ваших отзывов!

Changelog


partizanes 15.05.2012 21:06

1)не хватает наверно ,или кнопки about или версии в заголовке
2)запретить развертку во все окно ,так как становиться криво.
3)
4)Multiple->1-50->start->abort->yes-abort->yes->crash
вообщем везде если прервать операцию и повторно нажать прервать да ->краш.

5)м.б сохранять последний язык парсинга в конфиге?
6)
p.s В Любом случае интересный продукт ,удачного развития проекта.

add.

7) не помешало бы определенное положение формы (about) и запоминать положение main окна.
8)от опции русского языка я думаю тоже не стоит отказываться :pardon:


тестирую....

Lordronn 15.05.2012 21:28

Цитата:

3)не нашел как работает wowheadFilterTab(WoW head Filter)
он работает только для npc\quest locale\data парсера и только, это для экономии времени. Уже переделываю

add:
1,2,4,5 - готово!
сделал сохранение последнего выбранного парсера и языка
файл добавил

жду еще предложений!

add:
6.Он заблокирован) + так выходит значительно быстрее, чем каждый раз преобразовывать число в текст
7.Не думаю что это нужно
8.Сделаю, как с локализациями разберусь. Тогда все сообщения и интерфейс переведу

partizanes 15.05.2012 22:50


Lordronn 15.05.2012 23:12

Почему, варианта. Просто в случае с нумерикАпДаун-ом мы увеличиваем каждый раз число на 1 - просто и быстро. А в случае с лейблом надо сначала нужно перевести число в строку, и уже поставить ее лейблу, что значительно медленнее.
Жду дальше предложений и багов!

partizanes 18.05.2012 13:15

очень долго загружается 15-20 сек на очень мощных машинах (release/debug)
вопрос что так долго подгружает и нельзя ли вынести в отдельный поток *?

Lordronn 18.05.2012 13:51

Хм и правда. Я бы подумал, что дело в дб2 файлах, но тут на них тратиться 36мс. Сейчас покопаю

Нашел! Вся задержка из-за загрузки welf файла. При запуске он автоматом грузит первый файл из списка, и получается так, что этот файл как-раз item.welf, а там 60к записей.

Можно попробовать вынести загрузку в отдельный поток, но может произойти так(как раз таки на такой файле), что он еще будет грузиться, а вы уже будете его использовать. Так что думаю это не вариант.
Думаю надо придумывать какой нибудь другой способ хранения, уже вроде и структуру придумал

Код:

struct MainHeader
{
    string Name; // Имя парсера, для автоассоциации парсера и файла
    int length; // Кол-во записей
}

Код:

struct Block
{
    uint Id
}


Lordronn 18.05.2012 15:20

https://github.com/Lordron/WoWHead-d...a6718dd6e4bfa4

Исправил, пока welf-ы не переделывал.

Думаю та проверка и вовсе не нужна была. Если генерировать файлы welf креатор (надо будет кстати его переписать основательно), то даблов вообще быть не может

partizanes 18.05.2012 15:21

Почему бы у пользователя при надобности не спросить загрузить или нет?
или при первом вызове?*

Lordronn 18.05.2012 15:31

Смысла нету. Сейчас уже загрузка идет меньше чем за секунду, по этому никто этого не заметит

Lordronn 21.05.2012 00:23

https://github.com/Lordron/WoWHead-d...bf1ad6d5a46206

Обновил юзер агенты, и увеличил их кол-во до 20.
Взял теперь новые юзер агенты для новых браузеров (сафари, мозила, опера, хром)
+ фиксы по мелочи

lovepsone 21.05.2012 18:18

Неплохо, пару недель я хотел написать что-то похожее на Delphi, но решил изучать c++.
Насчет проги:
1) хотелось бы видеть русскую прогу;
2) прога немного тормозит, хотя машина у меня не слабая.

Lordronn 21.05.2012 19:00

1.Сделаю, как только пойму как сделать локализацию нормально
2.Что именно? Знаю парсеры почему-то тормозят дойдя до опр. уровня. Например вендор парсер всегда почему-то тормозит на 950-980 ентри (если использовать список), не знаю даже почему.

lovepsone 21.05.2012 19:38

а если локализацию пихать в отдельный файл, к примеру lang/russian.xml? Далее в настройках пользователь сам будет выбирать нужный ему язык. Правда наверное это увеличит нагрузку, при передачи значений в опции формы. Я наверное так и сделал бы.

Lordronn 21.05.2012 22:13

Тут есть и стандартные средства. Я начал локализацию потихоньку, но что-то не пойму как программно сменить язык.

Lordronn 23.05.2012 17:28

Сделал! Смотрите последние коммиты. Жду отзывов.
Пока нашел только 1 баг: после смены локализации консоль очищается, но в лог файл все пишеться

Lordronn 24.05.2012 19:04

Вложений: 1
Обновил библиотеку Newtonsoft.Json.dll с 4.0.8.14612 до 4.5.5.14917
Как видно разница большая. Вы почувствуйте уменьшенную нагрузку на процессор при парсинге.
Также новые бинарники 2.3.1

2.3.1
-Обновление библиотеки Newtonsoft.Json.dll, что даст множество улучшений
-Локализация приложений
-Сохранение последнего использованного парсера и локаля
-Исправлено 2 краша
-Добавлена About окошко
-Исправлены найденные баги
-Небольшая оптимизация

Lordronn 27.05.2012 14:01

Что-то вовхед тупит последнее время, работает медленно. Сильно мешает в разработке npc parser-а. У меня одного такая проблема? А то вдруг они мне что-то сделали, за то что я постоянно парсю вовхед)

Amaru 27.05.2012 15:58

Открыл, нажал List, выбрал item.welf, нажал Start.
И уже часа как полтора Parsing на 64750

Lordronn 27.05.2012 16:00

Вот и я о том же. вовхед тупит жестко. Надо будет сделать максимальное время ожидания. Если больше N минут, то останавливать

+ надо будет Abort кнопку переделать, чтобы не ожидать завершения всех операций, а самому их завершать. Придется тогда при создании реквеста помещать его в массив, а после удалять. И после остановки приложения останавливать все существующих на данный момент реквесты

Amaru 27.05.2012 17:13

Цитата:

Сообщение от Lordronn (Сообщение 27444)
Вот и я о том же. вовхед тупит жестко. Надо будет сделать максимальное время ожидания. Если больше N минут, то останавливать

+ надо будет Abort кнопку переделать, чтобы не ожидать завершения всех операций, а самому их завершать. Придется тогда при создании реквеста помещать его в массив, а после удалять. И после остановки приложения останавливать все существующих на данный момент реквесты

Как я понял, 64750 это последний айди

Lordronn 27.05.2012 17:16

Угу. Там вовхед глючит, и не отправляет ответ. А пока ответ не придет так и будет весеть 64750). Хз почему так, всмысле почему вовхед не отдает.

64750 - это не ласт ИД, это последний Ид в списке под номером 64750. На самом деле последний Ид - 79062

Lordronn 02.06.2012 23:33

Обновил DBFilesClient.NET.dll
https://github.com/Lordron/WoWHead-d...18c494471f7244

благодаря новой версии парсинг вендоров теперь не так сильно нагружает процессор

Lordronn 03.06.2012 12:27

Просматривал кол-во открытых соединений и выяснил причину висяков. Я про те висяки, когда прога бесконечно ожидала данные. Когда висела на 2599 из 2600 например.
Причина такого бага в том, что из-за какой-то неизвестной х**ни кол-во открытых соединений равно 0, в то время как программа еще работает. По какой-то причине новые подключения больше не создаются или же уже были закрыты раньше.
Программа ждет пока все семафоры будут освобождены. Семафоры я освобождаю вместе с закрытием подключения. По этому я думаю, что программа перестает создавать подключения. Только в такой случае может быть такое разногласие, когда семафоры не высвобождаются из-за того, что новые соединения не создаются.

add: да, все верно

rsa 03.06.2012 12:42

Цитата:

Сообщение от Lordronn (Сообщение 27504)
что из-за какой-то неизвестной х**ни кол-во открытых соединений равно 0, в то время как программа еще работает. По какой-то причине новые подключения больше не создаются или же уже были закрыты раньше.

не из-за какой-то неизвестной х..., а из-за особенностей винсока.
я с ним не работаю уже много лет, поэтому знания относятся ко временам WinXP, но думаю ничего не изменилось. количество доступных для процесса сокетов в винсоке - величина динамическая, и вовсе не равна FFFF-(число открытых), ее надо запрашивать спец. методом, и заранее предполагать что число более 1024 - скорее всего неверное...
в реальности проще вести счетчик в софтине самостоятельно, закладываясь на ограничение 256 для клиентской винды и 1024 для серверной.

Lordronn 03.06.2012 12:58

У меня максимальное кол-во подключений - 100

Lordronn 03.06.2012 13:46

Вложений: 1
Вот бинарники свежие, версию пока не менял.

rsa 03.06.2012 15:03

Цитата:

Сообщение от Lordronn (Сообщение 27507)
У меня максимальное кол-во подключений - 100

в винсоке одно http подключение = 2...4 открытых сокета.

Lordronn 09.06.2012 22:43

Сижу мучаюсь уже 2 вечер. Выслушаю любые предложения и идеи по оптимизации. За 2 вечера ничего толкового не получилось

Lordronn 10.06.2012 14:49

После долгих опытов и тестов выяснил, что основной висяк идет из-за блокировки
Код:

lock (_threadLock)
Если снят блокировку, то вендоры парсятся с той же скоростью, за тоже время 1 минута 14 секунд. Но блокировка нужна. Надо будет тут подумать, как бы лучше сделать.

Йоха 14.06.2012 11:18

Цитата:

Сообщение от rsa (Сообщение 27510)
в винсоке одно http подключение = 2...4 открытых сокета.

Небольшое уточнение: в winsock нет функций для работы с протоколом http.
Этим занимается библиотека Wininet, которая является более высокоуровненвой по сравнению с winsock и включает в себя функции для работы по http и ftp протоколам.

Lordronn 15.06.2012 15:32

Сделал пару изменений, пока не пушал. Уже 2 дня тестирую стабильность и вроде крашей нету. Тестировал на вендорах (2.6к записей). Сейчас начал тестировать на item-ах. Там 64750 записей, как раз протестирую полностью

Вот список запланированных изменений для следующей версии
-Автоматически загружать welf файл при выборе парсера. Если используется кастомный файл, то его можно будет потом поменять.
-Перенос парсинга юнитов и квестов с фильтра на обычный лад
-В связи с предыдущей пунктом расширю возможности парсинга юнитов и квестов. Буду вытягивать побольше данных

Lordronn 17.06.2012 12:13

Набросал кошерный npc парсер, не использующий вовхед фильтры. Удалось вытащить следующие поля

Data:
-Level
-Money
-Currency
-Type
-Quotes

Locale:
-Name

К сожалению SubName вытащить пока не удалось

virusav 17.06.2012 12:46

Я так вытаскиваю name и subname:
Код:

<div class="text">(?:(?!<h1>).+?)<h1>\s*((?!&lt^;|</h1>).+?)\s*(?:&lt^;((?!&gt^;).+?)&gt^;)?<
Далее надо только сделать замены символов и обрезать пробелы по краям.

Пишу на Parser 3.4.1, поэтому спецсимволы экранирую символом ^

Lordronn 29.06.2012 14:09

Вот предварительный вариант скула для Лорда Ребрада (36612)
Хочу еще вытащить ХП

Код:

-- Dump of 6/29/2012 2:06:48 PM (00:00:02.0161153), Total object count: 1
DROP TABLE IF EXISTS `creature_currency_template`;
CREATE TABLE `creature_currency_template` (
  `entry` int(10) NOT NULL,
  `currencyId` int(10) NOT NULL default '0',
  `currencyAmount` int(10) NOT NULL default '0',
  PRIMARY KEY (`entry`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `creature_quotes`;
CREATE TABLE `creature_quotes` (
  `entry` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `id` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `text` longtext,
  PRIMARY KEY (`entry`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `creature_template` (`entry`, `minlevel`, `maxlevel`) VALUES
('36612', '9999', '9999');

INSERT INTO `creature_template` (`entry`, `mingold`, `maxgold`) VALUES
('36612', '1229967', '1229967');

INSERT INTO `creature_currency_template` (`entry`, `currencyId`, `currencyAmount`) VALUES
('36612', '395', '24');

INSERT INTO `creature_quotes` (`entry`, `id`, `type`, `text`) VALUES
('36612', '0', '14', 'Лорд Ребрад кричит: Костяная хватка!'),
('36612', '1', '14', 'Лорд Ребрад кричит: Кости для жертвоприношений!'),
('36612', '2', '14', 'Лорд Ребрад кричит: Плеть накроет этот мир волной смерти и разрушения!'),
('36612', '3', '14', 'Лорд Ребрад кричит: Постой-ка тут!'),
('36612', '4', '14', 'Лорд Ребрад кричит: Сгинь в вечных муках!'),
('36612', '5', '14', 'Лорд Ребрад кричит: Смертные! Ваш путь закончится, так и не начавшись. Никто не смеет входить в обитель господина!'),
('36612', '6', '14', 'Лорд Ребрад кричит: Я вижу... лишь тьму.'),
('36612', '7', '14', 'Лорд Ребрад кричит: ВИХРЬ КОСТЕЙ!'),
('36612', '8', '14', 'Лорд Ребрад кричит: Единственный выход – это смерть!');


virusav 29.06.2012 20:46

По тому же нпц результаты моего скрипта (может, что-то еще доставать будешь):
Код:

INSERT INTO `creature_template_stat` SET `entry`=36612, `Health_N10`=6972500, `Health_N25`=23706500, `Health_H10`=10458750, `Health_H25`=31376250 ON DUPLICATE KEY UPDATE `entry`=36612, `Health_N10`=6972500, `Health_N25`=23706500, `Health_H10`=10458750, `Health_H25`=31376250;

INSERT INTO `creature_template` SET `entry`='36612', `name`='Lord Marrowgar', `mingold`='1214082', `maxgold`='1214082' ON DUPLICATE KEY UPDATE `entry`='36612', `name`='Lord Marrowgar', `mingold`='1214082', `maxgold`='1214082';

UPDATE `creature_template` SET `faction_a`=14, `faction_h`=14 WHERE `entry`=36612;


Lordronn 29.06.2012 20:55

1.Тебе удобнее, на C# нету такого парсера html
Хп я пока не могу достать, а имя и под_имя - дело локаль парсера, благо он у меня пашет
2.Как ты определил фракцию только по цвету? Не думаю что это верно, есть же куча других factionId которые дают такую же враждебность как и 14 фракция, хотя если фракции вообще нету то как затычка до сниффа сойдет.
Для зеленых и жолтых какие factionId юзаешь?

YuruY 29.06.2012 21:11

Цитата:

хотя если фракции вообще нету то как затычка до сниффа сойдет.
Только для этого, сверху из сниффов шлифуется, а кого недосниффал, пока затычка.))

Lordronn 30.06.2012 19:43

Добавил Health парсер. Поставил парситься. Результат будет через пол часа, надеюсь все предусмотрел

add: Спарсил, обнаружил 9к + мобов у которых я не получил ХП. Проблема вы том что у большенства и правда на вовхеде нету ХП, а у остальных я и не знаю как проверить наличие хп, все 9к страниц я не просмотрю.
Также нашел еще 1 проблему. Я то думал что максимум на вовхеде будет ХП для 4 уровней сложности, а там еще у некоторых есть ХП для поиска рейда, + у некоторых вообще 7 ХП (нормал, героик, 4 сложности + поиск рейда)
http://ru.wowhead.com/npc=14337

Сейчас вроде придумал как распределять ХП
Если кол-во хп = 1, то это обычное ХП
Если кол-во хп = 2, то это обычное и героическое ХП
Если кол-во хп = 4, то это 4 уровня сложности
Если кол-во хп = 5, то это 4 уровня сложности + рандом_рейд
Если кол-во хп = 6, то это нормал, героик + 4 уровня сложности
Если кол-во ХП = 7, то это нормал, героик, 4 уровня сложности + рандом_рейд

Нет, я ошибка.
Может быть и так, что если у моба 6хп, то это нормал, героик, 3 сложности + рандом_рейд
http://ru.wowhead.com/npc=32345

Так что тут придется извратиться

TOM_RUS 30.06.2012 21:40

Какой может быть уровень сложности у non combat петов и рем бота инженерского? Вы о чем вообще?


Текущее время: 06:46. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS