среда, 6 мая 2009 г.

Кризис

Парсер задумывался в основном для сопровождения интернет-магазинчиков, которые я начал создавать (и довольно успешно), но как показывает время в нашем государстве успешно и легально вести свой бизнес практически невозможно. 900 евро в месяц с владельца интернет магазина, честно говоря немного многовато, конечно для гигантов этого бизнеса и тех кто уже имеет свою розничную сеть это может и нормально, но для начинающих и ИПэшников, которые были основными моими заказчиками - это мягко говоря многовато. Поэтому парсер при наличии свободного времени будет немного доделан (ограничен в своих возможносях:) и выложен в сеть на всеобщее скачивание.
Основным и разумно-рациональным видом деятельности для "свободного художника" я вижу в создании сайтиков для малого бизнеса, т.е. для автомастиерских и СТО, для фирм занимающихся изготовлением и продажей окон, дверей и т.д.. Тем у кого есть мало-мальский потенциал, кого пока не могут найти ни в рекламных газетах ни в интернете, кому необходим сайт и постоянный приток заинтересованных посетителей на этот сайт (читай "потенциальнях покупателей" товаров и услуг). Поэтому решил серьезно заняться этим делом и создал свой сайт:
web-torpeda.com - Создание сайта, эффективная реклама Вашего бизнеса, увеличение прибыли, привлечение заинтересованных посетителей на сайт.
А парсер .... будет вам парсер и бесплатно :)
Заинтересованные программеры и около-программеры, особенно проживающие в городе-герое Минске оставляем свои координаты, есть задумки для серьезных проектов, пока нас не так много (я один:).

[+/-] Read More...

воскресенье, 29 марта 2009 г.

парсер (дополнение_2)

Есть еще один чудный способ парсить странички, это регулярные выражения. В данном ресурсе описан способ создания такого парсера и даже предлагается скачать класс для вставки его в свой код. Но мы пойдем другим путем, хотелось бы создать универсальный парсер который мог бы парсить любой (почти любой сайт).
В идеале это должно быть как на картинке, только необходимо добавить элемент WebBrowser, т.е. при выборе тэга подсвечивается область в браузере и наоборот при наведении мышки в необходимую область в браузере, подсвечивался бы тэг. Картинка была взята с сайта http://www.codeproject.com.
P.S. Есть готовый вариант парсера для yandex.market.ru заточенный под virtuemart, скриншоты готовятся к бубликации, кому интересно, могу отдолжить протестировать.

[+/-] Read More...

суббота, 14 марта 2009 г.

парсер (основы)

Для наилучшего понимания парсинга разберем основы. Например Вам необходимо извлечь из странички тэг ЖК-телевизор (про библиотеку SGML я напишу в следующий раз):
  1. <div style="display: none;" id="full-spec-cont">
  2. <img class="b-banish" src="http://clck.yandex.ru/click/dtype=stred/pid=47/cid=2073/*http://market.yandex.ru/i/edot.gif"><table border="0" width="48%" cellspacing="0" cellpadding="5" class="modelProperties">
  3. <colgroup span="2"></colgroup>
  4. <tbody>
  5. <tr><td colspan="2" class="title"><b>Основные характеристики</b></td></tr>
  6. <tr>
  7. <td class="label"><span>Тип</span></td>
  8. <td>ЖК-телевизор</td>
  9. </tr>
  10. <tr>
  11. <td> </td>
  12. <td> </td>
  13. </tr>
  14. <tr>
  15. <td class="label"><span>Встроенный DVD-плеер</span></td>
  16. <td>есть</td>
  17. </tr>
  18. <tr>
  19. <td> </td>
  20. <td> </td>
  21. </tr>
  22. </tbody>
  23. </table>
  24. </div>
Будем искать узел ЖК-телевизор, смотрим что он заключен в тэги (по порядку):
  1. <td>...</td>
  2. <tr>...</tr>
  3. <tbody>...</tbody>
  4. <table>...</table>

Значит XPath для искомого текста будет таким: //div[@id='full-spec-cont']/table/tbody/tr/td, где // - означает что будем искать по всему коду полученной странички, а не остановимся на первом же попавшемся тэге. [@id='full-spec-cont'] - означает что будет выбран тэг с атрибутом [@id='full-spec-cont'] и никакой другой. Однако в коде нашей странички присутствуют тэги пустышки (строки 11, 12, 19 и 20), для этого в XPath сообщаем, что будем выбирать тэг который следует сразу за тэгом "td class="label", а никак не пустые тэги, в итоге получим XPath "//div[@id='full-spec-cont']/table/tbody/tr/td[@class=\'label\']/following-sibling::*". В этом посте я указывал ссылку на ресурс разъясняющий основы XPath. Пример кода C# для получения искомого узла:

// определяем строку для поиска в коде html(xml) странички
string xpathOpisanie = "//div[@id='full-spec-cont']/table/tbodi/tr/td[@class=\'label\']following-sibling::*";
string OPISANIE;
// Ищем узел ЖК-Телевизор
try
{
XmlNode node = document.SelectSingleNode(xpathOpisanie);
OPISANIE= node.InnerText;

}
catch(Exception ee)
{
MessageBox.Show (ee.ToString(),"Ошибка");
return;
}Syhi-подсветка кода

[+/-] Read More...

четверг, 12 марта 2009 г.

парсер (дополнение_1)

Дополняю ранее написанную статью о парсере товаров, и приведу несколько примеров для XPath для yandex.market.ru:

//полная таблица содержащая XML краткой характеристики товара (проще записывать целиком
//табличку, а не бегать по нодам
string xpathExpressionTYPEc = ("//div[@id='main-spec-cont']/table");
//полная таблица содержащая XML подробного описания товара
string xpathExpressionTYPE = ("//div[@id='full-spec-cont']//table");
//большое изображение
string xpathExpressionFOTO = "//table[@class='modelpict']//a/@href";
//маленькое изображение
string xpathExpressionIMG = "//table[@class='modelpict']//img/@src";

Полное описание товара выглядит так:

Краткое описание товара соответственно:

Т. е. если устраивает дизайн описания товара предложенный от yandex.market.ru, то можно обойтись и предложенным мной выше XPath, гораздо интереснее использовать свой дизайн в описании товара, но для этого необходимо "бегать по каждым нодам" в полученном коде странички товара.



Я не привожу весь код странички товара с yandex.market.ru, но перед тем как что-то парсить необходимо взглянуть на этот код, открыть его в отдельном редакторе и т. д., найти тот участок кода который необходимо извлечь. Посмотреть в какие тэги он заключен, а так же пробежаться по всей страничке и выявить повторяющиеся тэги, только затем писать XPath. Если будут вопросы по парсингу какой-то странички с примерами, готов расмотреть это в следующих статьях.

[+/-] Read More...

среда, 11 марта 2009 г.

парсер yandex.market.ru

Как я и обещал немного поделюсь рецептом создания парсера yandex.market.ru и вообще HTML страничек. Все дело в XPath, если его осилить, то парсить можно практические любые ресурсы, огромное спасибо автору данного ресурса, где на примерах подробно описана работа XPath вне зависимости от языка программирования.

Привожу пример XPath для парсинга yandex.market.ru, точнее подробного описания товара:

1. XPath для названия характеристики товара:
"//div[@id='full-spec-cont']/table/tbody/tr/td[@class=\'label\']/span"

2. XPath для содержимого характеристики товара:
"//div[@id='full-spec-cont']/table/tbody/tr/td[@class=\'label\']/following-sibling::*"

С таким же успехом парситься краткая характеристика товара, его название, маленькое и большое изображение. Вообще для граббера страничек я использовал Sgml Reader, в отличие от других парсеров HTML все сводится к написанию вышеупомянутого XPath.

Будем к примеру парсить следующую страничку (это разумеется кусок кода полученной странички):

<div style="display: none;" id="full-spec-cont">
<img class="b-banish" src="http://clck.yandex.ru/click/dtype=stred/pid=47/cid=2073/*http://market.yandex.ru/i/edot.gif"><table border="0" width="48%" cellspacing="0" cellpadding="5" class="modelProperties">
<colgroup span="2"></colgroup>
<tbody>
<tr><td colspan="2" class="title"><b>Основные характеристики</b></td></tr>
<tr>
<td class="label"><span>Тип</span></td>
<td>ЖК-телевизор</td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td class="label"><span>Встроенный DVD-плеер</span></td>
<td>есть</td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>

Здесь "Тип" и "Встроенный DVD-плеер" - это название характеристики товара, а "ЖК-телевизор" и "есть" - содержимое характеристики товара.
Я не буду вдаваться в подробности работы XPath, но есть возможность парсить не отдельные названия характеристик и описание товара, а целиком полное или краткое описание товара в табличном виде, как оно представлено на yandex.market.ru.

Пример кода:
//название характеристики товара (полное описание товара)
string xpathExpressionNopis = ("//div[@id='full-spec-cont']/table/tbody/tr/td[@class=\'label\']/span");
//описание характеристики товара(полное описание товара)
string xpathExpressionOpis = ("//div[@id='full-spec-cont']/table/tbody/tr/td[@class=\'label\']/following-sibling::*");
//Получаем текст старницы:
WebClient client = new WebClient();
string Msg;
//Для примера взят BBK LD1506K, сюда вставляется свой искомый товар
Msg = client.DownloadString("http://market.yandex.ru/search.xml?cvredirect=1&text=BBK LD1506K");
//Загружаем страницу в XmlDocument:
SgmlReader reader = new SgmlReader();
reader.InputStream = new StringReader(Msg);
XmlDocument document = new XhtmlDocument(reader.NameTable);
document.Load(reader);
//ищем все ноды с названием характеристики товара
XmlNodeList nodeNopis = document.SelectNodes(xpathExpressionNopis);
//поиск нод с описанием характеристик товара
//XmlNodeList nodeOpis = document.SelectNodes(xpathExpressionOpis);
//Далее делаем с содержимым нод что необходимо...

Естественно весь этот код необходимо заключить в тело цикла, для перебора всего списка искомых товаров, а так же предусмотреть возможность перехвата исключений с помощью try и catch.

[+/-] Read More...

понедельник, 9 марта 2009 г.

Первый блин

Парадокс, учился я и готовился программить на технологии .NET, а свой первый сайт:
avtoevakuator.com -
Эвакуатор авто круглосуточно в Минске, РБ, странах СНГ и Евросоюза (до 5 тонн).
создал на Joomla. На очереди второй
, хотя все же без C# не обойтись, придётся написать толковый парсер HTML для выдирания описания товаров, потому что вручную заполнять интернет магазин на 1000 наименований просто невозможно. Как напишу, то поделюсь информацией, если кто чего подскажет, буду признателен.

[+/-] Read More...