В этой статье я попробую научить вас основам парсинга с помощью Indy. Парсить информацию мы будем из сайта [Ссылки могут видеть только зарегистрированные пользователи. ].
Переходим на сайт [Ссылки могут видеть только зарегистрированные пользователи. ]. Вы не должны быть авторизованы на сайте! Если вы авторизованы на сайте, тогда выйдите со своего профиля.
Включаем Charles. Ждем пока он включится и, когда он включился, нажимаем на кнопочку: Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Должен засветится красный огонёк посередине кнопочки: Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
В дальнейшем я буду называть эту кнопку кнопкой "Запись", а её состояние на первом рисунке - выключенной, на втором - включенной.
Переходим в окно браузера и авторизуемся на сайте [Ссылки могут видеть только зарегистрированные пользователи. ]. Когда авторизовались, переходим на страницу настроек профиля.
Теперь переходим в окно Charles и выключаем "Запись".
Теперь мы можем переходить к анализу полученных данных. В поле вкладки "Structure" должны были появится адреса сайтов: Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Из этих адресов, нас интересует только "http://dump.ru/". Кликаем на нем: Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь поясню что же появилось:
В папке "profile" лежит наш запрос на переход на страницу профиля;
[Ссылки могут видеть только зарегистрированные пользователи. ]
Мы увидели, что при переходе на страницу настроек, в адресе, на который отсылается запрос, присутствует ник пользователя.
Теперь переходим на вкладку "Response": Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
На скрине видно, то, что в Response этого запроса лежит почта: Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь, когда мы собрали всю нужную информацию, можно приступать к написанию кода.
Кидаем на форму два компонента Edit, два компонента Label один компонент Button и один компонент CheckBox из вкладки "Standart": Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Кидаем на форму один компонент IdHTTP из вкладки "Indy Clients": Скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Создаем обработчик событий OnClick на компоненте Button(два раза кликаем по Button'у);
Теперь нам нужно написать исполняемый код.Но для этого надо знать, что писать:
Для начала я вставлю код авторизации из моей предыдущей статьи:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Data:TStringList;
Request:String;
HTTP:TIdHTTP;
begin
Data:=TStringList.Create;
HTTP:=TIdHTTP.Create(nil);
HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)';
Data.Add('auth_login='+Edit1.Text);
Data.Add('auth_password='+Edit2.Text);
if CheckBox1.Checked then
begin
Data.Add('auth_remember=ok');
end;
try
Request:=HTTP.Post('http://dump.ru/',Data);
if Pos('http://dump.ru/profile/',Request)<>0 then
begin
ShowMessage('Авторизация прошла успешно');
end
else
begin
ShowMessage('Авторизация не удалась');
end;
finally
Data.Free;
Request:='';
HTTP.Free;
end;
end;
Теперь мы будем копировать ник пользователя из переменной "Request" в переменную "s" и выводить его в Label1:
Выделенные числа определены подбором
В этом коде мы копируем текст из переменной "Request" в переменную "s". Начальной позицией для копирования является позиция, которая на 35 больше позиции текста:
в переменной "Request". Конечной позицией для копирования является позиция, которая на 798 меньше позиции строки:
в переменной "Request";
Теперь мы будем отправлять Get запрос на адрес настроек профиля:
Выделенные числа определены подбором
В этом коде мы копируем текст из переменной "Request" в переменную "s", подчищая лишнее. Начальной позицией для копирования является позиция, которая на 22 больше позиции текста:
в переменной "Request1". Конечной позицией для копирования является позиция, которая на 16700 меньше позиции текста:
в переменной "Request1";
Дальнейшие наши действия совпадают с теми, которые я описывал в своей предыдущей статьи, поэтому расписывать я их не буду.
Полный код процедуры нажатия на кнопку:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Data:TStringList;
Request,s,Request1:String;
HTTP:TIdHTTP;
begin
Data:=TStringList.Create;
HTTP:=TIdHTTP.Create(nil);
HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)';
Data.Add('auth_login='+Edit1.Text);
Data.Add('auth_password='+Edit2.Text);
if CheckBox1.Checked then
begin
Data.Add('auth_remember=ok');
end;
try
Request:=HTTP.Post('http://dump.ru/',Data);
s:=copy(Request,pos('!-- profile',Request)+35,pos('/edit/ -->',Request)-798);
Label1.Caption:='Ник: "'+s+'"';
Request1:=HTTP.Get('http://dump.ru/profile/'+s+'/edit/');
s:=copy(Request1,pos('user_reg_email',Request1)+22,
pos(' style="width: 300px" disabled>',Request1)-16700);
Delete(s,Pos(' style',s),Pos(': 300px',s));
Label2.Caption:='e-mail: '+s;
if Pos('http://dump.ru/profile/',Request)<>0 then
begin
ShowMessage('Авторизация и сбор данных прошли успешно');
end
else
begin
ShowMessage('Авторизация и сбор данных не удались');
end;
finally
Data.Free;
Request:='';
s:='';
Request1:='';
HTTP.Free;
end;
end;
Теперь, когда мы закончили написание программы, запускаем программу и смотрим, что получилось.
Скачать исходник([Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ]);
Скачать скриншоты([Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ],[Ссылки могут видеть только зарегистрированные пользователи. ]);
Статья писалась VeTaL_UA для Zhyk.RU. При копировании указывать ссылку на данную тему.
Хорошая статья. Особенно порадовало то, что юзаешь copy pos delete
А то все регулярки юзают. ИМХО легче вышеуказанными функциями, да и при больших объёмах, например парсинге xml файлов(каталог товаров большого магазина например) скорость работы данных функций будет гораздо быстрее регулярок. Так, что я обеими руками за написания подобных статей, молодцом!
З.Ы. А то новички уже скоро всё будут писать на готовых компонентах, не понимая, что делают)
KsenomorFFF, копируй код с темы, в конце же есть полный код
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
VeTaL_UA, чарлик не ловит пакеты,возможно что-то не установил?скачал их пробную версию с офф сайта,зашел в мозилу,включил запись ,ну всё по вашему описанию,а пакеты так и не ловились,в чем можно быть проблема?
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
В настройках браузера проставь использование прокси 127.0.0.1 с портом 8888
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
VeTaL_UA, а что делать,если я поймал пакеты,а там нет папки profile,пытаюсь не на dump авторизоваться.
Пффф... Это же пример, в 99% случаев не будет папки profile, надо просто найти нужный запрос и скопироваться его
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Мы увидели, что при переходе на страницу настроек, в адресе, на который отсылается запрос, присутствует ник пользователя.
Теперь переходим на вкладку "Response":
Скрин