Воскресенье, 01.12.2024, 22:27
Главная Регистрация RSS
Приветствую Вас, Заглянувший
Меню сайта
Программирование
Для студента
Познавательно
Опросник
Лучшая, на ваш вгляд, среда разработки?
Всего ответов: 63
Поддержать проект
Благодарность выразило,чел: 7
Статистика

Полная статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Delphi

Пишем парсер вопросов с сервиса otvet.mail.ru

Вступление

На дворе 2011 год, самый разгар интернет технологий, web-приложения вытесняют прикладные программы. Единственная возможность ПП оставаться "на плаву", организовать работу с всемирной сетью. 
Идея написания парсера вопросов пришла мне совсем внезапно, а писать я его начал для ознакомительных целей. 

 Как он работает?! После запуска программы, пользователь выбирает категорию и активизирует кнопку "Начать". После на форму грузиться вопрос и аватар. При желании можно ответить на вопрос, используя при этом браузер.

Для написания парсера на понадобятся:

- 2 TCombobox-а;
- Timage (90x90);
- 2 TLabel;
- 3 TBitBtn (кнопка с рисунком вкладка Additional);
- TTimer, TidHTTP, idAntiFreeze, TXPManifest;

всё остальное по вашему вкусу и усмотрению.

Предварительная настройка компонентов

Timer:
Interval - 5000
Enabled - false

Организация категорий в приложении

1. Событие OnChange, возникающее после выбора в списке ComboBox1:

Код: 
procedure TForm1.ComboBox1Change(Sender: TObject); 
begin
//---------выбор категории------------
if ComboBox1.ItemIndex=0 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/auto/';
end;
if ComboBox1.ItemIndex=1 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/business/';
end;
if ComboBox1.ItemIndex=2 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/countries/';
end;
if ComboBox1.ItemIndex=3 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/magic/';
end;
if ComboBox1.ItemIndex=4 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/relax/';
end;
if ComboBox1.ItemIndex=5 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/food/';
end;
if ComboBox1.ItemIndex=6 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/animals_plants/';
end;
if ComboBox1.ItemIndex=7 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/love/';
end;
if ComboBox1.ItemIndex=8 then begin
if ComboBox2.Visible=true then ComboBox2.Visible:=false;
razd:='http://otvet.mail.ru/culture/';
end;
if ComboBox1.ItemIndex=9 then begin
ComboBox2.Visible:=true;
if ComboBox2.ItemIndex=-1 then
razd:='http://otvet.mail.ru/it/';
end;


2. Событие OnChange, возникающее после выбора в списке ComboBox2:

Код: 
procedure TForm1.ComboBox2Change(Sender: TObject); 
begin
if
ComboBox2.ItemIndex=0 then begin
razd:='http://otvet.mail.ru/webdesign/';
end;
if ComboBox2.ItemIndex=1 then begin
razd:='http://otvet.mail.ru/hardware/';
end;
if ComboBox2.ItemIndex=2 then begin
razd:='http://otvet.mail.ru/internet/';
end;
if ComboBox2.ItemIndex=3 then begin
razd:='http://otvet.mail.ru/pc_games/';
end;
if ComboBox2.ItemIndex=4 then begin
razd:='http://otvet.mail.ru/programming/';
end;
if ComboBox2.ItemIndex=5 then begin
razd:='http://otvet.mail.ru/software/';
end;
if ComboBox2.ItemIndex=6 then begin
razd:='http://otvet.mail.ru/pc_other/';
end;


Парсинг вопросов

1. Функция Pars

Код:
function Pars(T_, ForS, _T: string): string; 
var
  a, b: integer;
begin
  Result := '';
  if (T_ = '') or (ForS = '') or (_T = '') then
  Exit;
  a := Pos(T_, ForS);
  if a = 0 then
  Exit
  else
  a := a + Length(T_);
  ForS := Copy(ForS, a, Length(ForS) - a + 1);
  b := Pos(_T, ForS);
  if b > 0 then
  Result := Copy(ForS, 1, b - 1);
end;


2. Событие OnTimer возникаючее при включении Таймера:

Прогресбар реализован для визуализации выполняемого процесса.

Код:
procedure TForm1.Timer1Timer(Sender: TObject); 
var sc,p, q, ur:string;
captcha:TStream;
jpg:TJPEGImage;
begin
ProgressBar1.Max:=9;
Label1.Height:=90;
Label1.Width:=400;
jpg:=TJPEGImage.Create;
p:=Form1.idhttp1.get(razd);
sc:=Pars('class="subj" id="qheader:',p,'">');
if sc<>Label2.Caption then begin
ProgressBar1.Position:=ProgressBar1.Position+1;
Label2.Caption:=sc;
ProgressBar1.Position:=ProgressBar1.Position+1;
q:=Pars('<index>',p,'</index>');
ProgressBar1.Position:=ProgressBar1.Position+1;
if q<>Label1.Caption then begin
sc:=Pars('class="subj" id="qheader:',p,'">');
Label2.Caption:=sc;
end;
ProgressBar1.Position:=ProgressBar1.Position+1;
Label1.Caption:=q;
ProgressBar1.Position:=ProgressBar1.Position+1;
ur:=Pars('<a href="/mail/',p,'/">');
ProgressBar1.Position:=ProgressBar1.Position+1;
captcha:=TStringStream.Create(IdHTTP1.Get('http://avt.foto.mail.ru/mail/'+ur+'/_avatarsmall.jpg'));
ProgressBar1.Position:=ProgressBar1.Position+1;
jpg.LoadFromStream(captcha);
ProgressBar1.Position:=ProgressBar1.Position+1;
Image1.Picture.Assign(jpg);
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Position:=0;
end;
end;


3. Событие OnClick возникаючее при активизации кнопки "Начать":

Код:
procedure TForm1.BitBtn1Click(Sender: TObject); 
begin
if ComboBox1.ItemIndex=-1 then
ShowMessage('Выберите категорию');
Timer1.Enabled:=true;
end; 


4. Событие OnClick возникаючее при активизации кнопки "Стоп":

Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Timer1.Enabled:=false;
end;

5. Событие OnClick возникаючее при активизации кнопки "Ответить":

Код:
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
ShellExecute(handle, 'open', PChar('http://otvet.mail.ru/question/'+label2.Caption+'/?begin_reply=1#reply'), nil, nil, SW_SHOW);
end;

Всё. Программой пользоваться несложно, если есть какие то вопросы - пишите.

Если что то неполучиться вот исходник программы.

        
Категория: Delphi | Добавил: Freeman (11.07.2011)
Просмотров: 2586 | Комментарии: 2 | Теги: Парсер вопросов, Delphi+соц. сети, delphi | Рейтинг: 3.7/3
Всего комментариев: 2

Добавил: MNC
+1

if ComboBox2.ItemIndex=0 then begin
razd:='http://otvet.mail.ru/webdesign/';
end;
if ComboBox2.ItemIndex=1 then begin
razd:='http://otvet.mail.ru/hardware/';
end;

Отучайся от такого китайского кода. Раз уж выкладываешь именно исходник, постарайся, чтобы он был хотя бы читабелен.
Дата публикации: 18.07.2011 в 17:52 [Материал]

Добавил: Freeman
0

А никто и не говорит, что это готовый ПП, это наброски, чем проще, тем лучше.
Дата публикации: 18.07.2011 в 18:16 [Материал]
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]