Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
1

Парсинг характеристик товара с Яндекс.Маркета

21.05.2012, 23:07. Показов 5166. Ответов 17
Метки нет (Все метки)

Здравствуйте...
Не уверен, правильно ли выбран раздел. Если ошибся, то извиняюсь заранее.

Мой вопрос заключается в следующем:
Хочу сделать простенький парсер для товаров с яндекс.маркета, т.е. чтобы можно было закинуть в программку ссылку на товар, а на выходе получить характеристики товара в виде таблицы на HTML.

На пример:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<div id="zhead">Технические характеристики:</div>
<table id="zebra">
<colgroup><col class="firstcol"></col>
</colgroup>
<tbody>
<tr class="odd">
<td class="leftcol">Модель</td>
<td class="ritecol">Thermaltake VL70001W2Z V5</td>
</tr>
<tr class="nodd">
<td class="leftcol">Форм-фактор</td>
<td class="ritecol">ATX, mATX</td>
</tr>
<tr class="odd">
<td class="leftcol">Типоразмер</td>
<td class="ritecol">Midi-Tower</td>
</tr><!---->
<tr class="nodd">
<td class="leftcol">Блок питания</td>
<td class="ritecol">нет</td>
</tr>
<tr class="odd">
<td class="leftcol">Габариты (ШхВхГ), Вес</td>
<td class="ritecol">223x508x490 мм, 7.1 кг</td>
</tr>
<tr class="nodd">
<td class="leftcol">Материал корпуса</td>
<td class="ritecol">сталь</td>
</tr>
<tr class="odd">
<td class="leftcol">Толщина стенок</td>
<td class="ritecol">0.7 мм</td>
</tr><!--
<tr class="nodd">
<td class="leftcol">Число внешних отсеков 3,5"</td>
<td class="ritecol">1</td>
</tr>
<tr class="odd">
<td class="leftcol">Число внутренних отсеков 3,5"</td>
<td class="ritecol">5</td>
</tr>-->
<tr class="nodd">
<td class="leftcol">Число отсеков 5,25"</td>
<td class="ritecol">9</td>
</tr>
<tr class="odd">
<td class="leftcol">Слоты расширения</td>
<td class="ritecol">7, безвинтовое крепление</td>
</tr>
<tr class="nodd">
<td class="leftcol">Встроенные вентиляторы</td>
<td class="ritecol">1 x 120x120 мм</td>
</tr>
<tr class="odd">
<td class="leftcol">Места для доп. вентиляторов</td>
<td class="ritecol">2 x 120x120 мм</td>
</tr>
<tr class="nodd">
<td class="leftcol">Возможность установки системы жидкостного охлаждения</td>
<td class="ritecol">нет</td>
</tr>
<tr class="odd">
<td class="leftcol">Разъемы на лицевой панели</td>
<td class="ritecol">USB x2, наушники, микрофон, eSATA</td>
</tr>
<tr class="nodd">
<td class="leftcol">Цвет корпуса</td>
<td class="ritecol">черный</td>
</tr>
<tr class="odd">
<td class="leftcol">Расположение блока питания</td>
<td class="ritecol">горизонтальное</td>
</tr>
<tr class="nodd">
<td class="leftcol">Дополнительная информация</td>
<td class="ritecol">200 мм вентилятор сверху, съёмная корзина для 3,5-дюймовых накопителей, ручка для переноски на верхней панели, защелки для 5.25” устройств, один отсек 2.5” конвертируется из 5.25” отсека</td>
</tr>
<tr class="odd">
<td class="leftcol">Сайт производителя</td>
<td class="ritecol"><a href="http://ru.thermaltake.com/" target="_blank">Thermaltake Россия</a></td>
</tr>
</tbody>
</table>
Решил спросить сначала тут, может кто-нибудь подскажет с чего начать хотя бы, т.к. в программировании я разбираюсь хреново. Интересует, как работать с сайтом на Си++ ну и может есть уже не сложные готовые решения для подобного рода вещей, чтобы не изобретать свой велосипед...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2012, 23:07
Ответы с готовыми решениями:

Парсинг отзывов о магазине с Яндекс-Маркета
Подскажите как организовать сбор данных о отзывах магазина, с Яндекс-Маркета. Реализация нужна на...

Коменнтарии с Яндекс маркета
Здравствуйте! Как можно добавить комментарии яндекса на свой сайт? Вот например на этом сайте уже...

Парсер Яндекс.Маркета из прайса
Короче попытался навоял скриптец парсера ямаркета, не могу победить следующее 1. не хочет...

Удаление отзывов с Яндекс.Маркета
Всем привет. Реальный клиент пишет нам и говорит, что не размещают отзыв о работе магазина. Он...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
17
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
21.05.2012, 23:19 2
Закачать страницу IdHTTP комонентом.
Парсить используя boost/regex. - основная сложность составить регулярное выражение правильно
Выводить в StringGrid можно...

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

Можно открыть ссылку прямо в программе через WebBrowser и смотреть от туда (если это допустимо)
1
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 00:56 3
Вот пример (парсит файл 1.html,вывод в ListView)
0
Вложения
Тип файла: rar 2.rar (360.4 Кб, 156 просмотров)
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 01:08  [ТС] 4
Спасибо, не совсем то что нужно, но пример полезный, буду пробовать
0
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 01:11 5
А что требовалось?
(Вы не указали сам сайт поэтому я не использовать IdHTTP, но это не проблема...)
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 01:18  [ТС] 6
Цитата Сообщение от Avazart Посмотреть сообщение
А что требовалось?
(Вы не указали сам сайт поэтому я не использовать IdHTTP, но это не проблема...)
Сайт - яндекс.маркет, это я указал в начале. Идея - вытаскивать подробные характеристики товара со страницы типа этой. А на выходе получать хтмл-код, желательно сразу в буфер для последующей вставки. Ваш пример мне помог понять, как это реализовать, так что дальше я наверное справлюсь сам.
0
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 01:30 7
Сайт - яндекс.маркет, это я указал в начале.
Я имел ввиду конкретнуюю страницу которую надо парсить.

На этой странице совсем другой код нежели вы привели в начале, для нее будет другая регулярка
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 01:31  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
Я имел ввиду конкретнуюю страницу которую надо парсить.

На этой странице совсем другой код нежели вы привели в начале, для нее будет другая регулярка
Ну да, код что я привел - это предполагаемый результат парсинга.
0
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 14:59 9
Ну это уже не парсинг, а преобразование....
Т.е то что можно получить используя результат парсинга.

Добавлено через 13 часов 20 минут
А почему бы прото не выдрать имеющуюся таблицу со страници?
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 15:01  [ТС] 10
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это уже не парсинг, а преобразование....
Т.е то что можно получить используя результат парсинга.

Добавлено через 13 часов 20 минут
А почему бы прото не выдрать имеющуюся таблицу со страници?
Ну у меня шаблон определенный на сайте, нужно под него подстроить...
0
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 15:25 11
Ну вывести под шаблон не проблема...
Проблема отпарсить уже имеющуюся страницу...

Тем более я пердпологаю что нужно будет парсить разные страници а не одну конкретную? - поэтому задача практически не выполнима ( по крайней мере лишена смысла)
0
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 478
22.05.2012, 15:31 12
а разве у яндекс маркета нету своих решений для сайтов партнеров ?
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 15:42  [ТС] 13
Цитата Сообщение от Avazart Посмотреть сообщение
Ну вывести под шаблон не проблема...
Проблема отпарсить уже имеющуюся страницу...

Тем более я пердпологаю что нужно будет парсить разные страници а не одну конкретную? - поэтому задача практически не выполнима ( по крайней мере лишена смысла)
Да, страниц будет много, но ведь код таблицы у яндекса везде одинаков, меняются лишь характеристики.
У меня получилось выдернуть нужную таблицу (тут правда две оговорки: 1 - проблема с кодировкой, думаю поправимо, 2 - поскольку делфи мне понятней, сделал это на нем )

Вот табличка, выдернутая из яндекса:
HTML5
1
<table class="b-properties"><tbody><tr><th colspan="2" class="b-properties__title">Форм-фактор Рё размеры</th></tr><tr><th class="b-properties__label b-properties__label-title"><span>Форм-фактор</span></th><td class="b-properties__value">ATX, mATX</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Типоразмер</span></th><td class="b-properties__value">Midi-Tower</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Блок питания</span></th><td class="b-properties__value">нет</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Габариты (РЁС…Р’С…Р“)</span></th><td class="b-properties__value">223x508x490 РјРј</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Вес</span></th><td class="b-properties__value">7.1 РєРі</td></tr><tr><th colspan="2" class="b-properties__title">Конструкция</th></tr><tr><th class="b-properties__label b-properties__label-title"><span>Материал РєРѕСЂРїСѓСЃР°</span></th><td class="b-properties__value">сталь</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>РћРєРЅРѕ РЅР° Р±РѕРєРѕРІРѕР№ стенке</span></th><td class="b-properties__value">есть</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Число отсеков 5,25"</span></th><td class="b-properties__value">9</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Слоты расС?ирения</span></th><td class="b-properties__value">7, безвинтовое крепление</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Количество замков</span></th><td class="b-properties__value">1</td></tr><tr><th colspan="2" class="b-properties__title">Охлаждение</th></tr><tr><th class="b-properties__label b-properties__label-title"><span>Встроенные вентиляторы</span></th><td class="b-properties__value">1 x 120x120 РјРј</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Места для РґРѕРї. вентиляторов</span></th><td class="b-properties__value">2 x 120x120 РјРј</td></tr><tr><th colspan="2" class="b-properties__title">Дополнительно</th></tr><tr><th class="b-properties__label b-properties__label-title"><span>Р*азъемы РЅР° лицевой панели</span></th><td class="b-properties__value">USB x2, науС?РЅРёРєРё, микрофон, eSATA</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Цвет РєРѕСЂРїСѓСЃР°</span></th><td class="b-properties__value">черный</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Р*асположение блока питания</span></th><td class="b-properties__value">горизонтальное</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Блок питания РІРЅРёР·Сѓ</span></th><td class="b-properties__value">есть</td></tr><tr><th class="b-properties__label b-properties__label-title"><span>Дополнительная информация</span></th><td class="b-properties__value">200 РјРј вентилятор сверху, съёмная РєРѕСЂР·РёРЅР° для 3,5-дюймовых накопителей, ручка для переноски РЅР° верхней панели, защелки для 5.25” устройств, РѕРґРёРЅ отсек 2.5” конвертируется РёР· 5.25” отсека</td></tr></tbody></table>
Осталось по сути только правильно разобрать ее и подогнать под шаблон из первого поста, так что щас буду думать как это сделать... Ну и кодировка :/

Цитата Сообщение от koldun Посмотреть сообщение
а разве у яндекс маркета нету своих решений для сайтов партнеров ?
Честно говоря не знаю, но даже если так, то мне этот вариант не подойдет, я всего-лишь фрилансер, который должен копипастить эти характеристики, картинки и т.д. )
0
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 15:45 14
Да, страниц будет много, но ведь код таблицы у яндекса везде одинаков
Ну если точно одинаковый код то можно браться делать, но я чет сходу не могу пока придумать регулярку.
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 15:53  [ТС] 15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну если точно одинаковый код то можно браться делать, но я чет сходу не могу пока придумать регулярку.
А не подскажете насчет кодировки, куда копать?
Вот мой корявый код на всякий случай
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
unit yandex;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ActiveX, Vcl.StdCtrls, Vcl.ComCtrls,
  Vcl.ToolWin, Vcl.OleCtrls, SHDocVw, Web.HTTPApp, RegExpr;
 
type
  TForm1 = class(TForm)
    CoolBar1: TCoolBar;
    ComboBox1: TComboBox;
    Button1: TButton;
    Button2: TButton;
    WebBrowser1: TWebBrowser;
    Memo1: TMemo;
    Button3: TButton;
    Memo2: TMemo;
    procedure ComboBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
 
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    { Private declarations }
  public
 
  end;
  //procedure Search(Sender: TObject);
 
var
  Form1: TForm1;
  code: string;
 
implementation
 
{$R *.dfm}
function WB_SaveHTMLCode(WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
 var
   ps: IPersistStreamInit;
   fs: TFileStream;
   sa: IStream;
 begin
   ps := WebBrowser.Document as IPersistStreamInit;
   fs := TFileStream.Create(FileName, fmCreate);
   try
     sa := TStreamAdapter.Create(fs, soReference) as IStream;
     Result := Succeeded(ps.Save(sa, True));
   finally
     fs.Free;
   end;
 end;
 
 function WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
 var
   ps: IPersistStreamInit;
   ss: TStringStream;
   sa: IStream;
   s: string;
 begin
   ps := WebBrowser.Document as IPersistStreamInit;
   s := '';
   ss := TStringStream.Create(s);
   try
     sa := TStreamAdapter.Create(ss, soReference) as IStream;
     Result := Succeeded(ps.Save(sa, True));
     if Result then ACode.Add(ss.Datastring);
   finally
     ss.Free;
   end;
 end;
 
 function Pwner (const AInputString : string) : string;
 const
  RE = '<table class="b-properties">(.*?)</table>';
 var
  r : TRegExpr;
 begin
  Result := '';
  r := TRegExpr.Create;
  try 
     r.Expression := RE;
     if r.Exec (AInputString) then
       Result := Result + r.Match [0];
    finally r.Free;
   end;
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
   WB_SaveHTMLCode(Webbrowser1, 'c:\test.txt');
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
   WB_GetHTMLCode(Webbrowser1, Memo1.Lines);
   Code := Memo1.Lines.Text;
 end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
   Memo2.Lines.Text := Pwner (Memo1.Lines.Text);
end;
 
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = VK_RETURN then
    WebBrowser1.Navigate(ComboBox1.Text);
end;
 
end.
0
Эксперт С++
8358 / 6096 / 610
Регистрация: 10.12.2010
Сообщений: 28,405
Записей в блоге: 30
22.05.2012, 15:58 16
А в выложеном мною проекте есть ф-ция преобразования Utf в Unicode

Добавлено через 2 минуты
К стати у вас нет ссылки на то как пользоваться TRegExpr? в Builder же он тоже работает?
0
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 478
22.05.2012, 15:59 17
в коде все новые записи имеют предшествующий им одинаковый код.

Код
b-properties__title
я делал похожее таким способом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TStringList* list = new TStringList;
/*
обьяви глобально гдето 
*/
 
void parser(AnsiString text ){
AnsiString helptext;
 
helptext = text.SubString(text.Pos("b-properties__title"),100500  )
text = text.SubString(text.Pos("b-properties__title") + 10 ,100500  )
list->Add(helpstring); 
if (text.Pos("b-properties__title") > 5){
parser(text);
}
}
в результате получишь StringList с количеством строк равной количству встречающихся записей.
после чего каждую строчку обрабатываешь уже как хочешь, можешь еще раз переразбить ее на кусочки помельце, или напрямую вытаскивать значения...

можт и криво написано, но у меня так работает, нареканий на быстродействие нету.
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 15
22.05.2012, 16:17  [ТС] 18
Цитата Сообщение от Avazart Посмотреть сообщение
К стати у вас нет ссылки на то как пользоваться TRegExpr? в Builder же он тоже работает?
Брал его где-то тут, в архиве есть хелп, да и на сайте инфа разная. У меня в RAD Studio XE2 нормально работает.

Добавлено через 12 минут

Извиняюсь, ссылку забыл вставить ) Брал тут
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2012, 16:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Переадресация с гугла на go.mail.ru, тулбар яндекс.маркета
Словил вирус, не уверен как, т.к. программ в последнее время не устанавливал, была только передача...

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

Как можно программно изменить настройки Яндекс.Маркета
Всем привет. Подскажите, плиз, как можно программно изменить настройки Яндекс.Маркета на странице...

Как добавить описание характеристик товара?
Доброго дня. Подскажите, возможно ли добавить характеристике товара дополнительное поле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.