В этой статье я попробую научить вас основам парсинга с помощью 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 больше позиции текста:
Цитата:
!-- profile
в переменной "Request". Конечной позицией для копирования является позиция, которая на 798 меньше позиции строки:
Цитата:
/edit/ -->
в переменной "Request";
Теперь мы будем отправлять Get запрос на адрес настроек профиля:
Выделенные числа определены подбором
В этом коде мы копируем текст из переменной "Request" в переменную "s", подчищая лишнее. Начальной позицией для копирования является позиция, которая на 22 больше позиции текста:
Цитата:
user_reg_email
в переменной "Request1". Конечной позицией для копирования является позиция, которая на 16700 меньше позиции текста:
Цитата:
style="width: 300px" disabled>
в переменной "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. При копировании указывать ссылку на данную тему.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Если бы задействовал ещё Regexpr то вообще было бы красиво
Статья показывает общие принципы, а RegExp их скрывает
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Хорошая статья. Особенно понравилось работа с чарликом, но прошу заметить, лутше бы ты выложил сразу крякнутый чарлик, у многих демка давно кончилась, ну у меня точно
лутше бы ты выложил сразу крякнутый чарлик, у многих демка давно кончилась, ну у меня точно
Это не варезный портал
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Кстати Веталь как правильно определять сколько символов нужно удалять после второго тега?? а то я наугад вписал что бы найти)
Примерно посчитать, а потом подбирать
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Ты делал через анальное отверствие, а я говорю, примерно
Допустим, есть такая строка:
Код:
<blo><name="ololo"><value="1234567890"></blo>
Вспомним, что собой представляет функция Copy:
Код:
Copy({строка с исходным текстом},
{Число, обозначающее позицию первого символа значения, которое мы парсим, в исходном тексте},
{Число, обозначающее количество символов, которые мы будем копировать});
Чтобы узнать второй параметр для функции Copy, программисты чаще всего используют функцию Pos.
Давайте и о ней вспомним:
Код:
Pos({строка, позицию первого символа которой мы будем искать в исходном тексте},
{Строка с исходным текстом});
Теперь давайте подумаем, как всё это использовать.
Засунем в переменную s(string) исходный текст:
Код:
var
s:string;
begin
s:='<blo><name="ololo"><value="1234567890"></blo>';
end;
Теперь давайте выберем из этой строки ориентировочный кусок, который не повторяется и по какому мы будем искать второй параметр для функции Copy. Я бы советовал использовать куски типа "<name="blabla">", так как они, вероятнее всего, не будут повторятся в исходном тексте. В нашем случае мы будем использовать строку:
Код:
<name="ololo">
.
Как же по ней найти первый символ нужного нам значения(1234567890)? Нам поможет функция Pos. С помощью этой функции узнаём позицию первого символа нашей проверочной строки:
Код:
var
s:string;
i:integer;
begin
s:='<blo><name="ololo"><value="1234567890"></blo>';
i:=Pos('<name="ololo">',s);
end;
Дальше будем считать.
Позицией первого символа проверочной строки является число 'i'. Где оно находится на примере:
Код:
<blo><name="ololo"><value='1234567890></blo>
Дальше посчитаем сколько символов находится между этим символом и первым символом нужного нам значения. Я насчитал 22. Если вы насчитали больше/меньше, то причиной этому могут быть магнитные бури или высокая активность солнца. Теперь давайте запишем в 'i' позицию первого символа нужного нам значения:
Код:
var
s:string;
i:integer;
begin
s:='<blo><name="ololo"><value="1234567890"></blo>';
i:=Pos('<name="ololo">',s);
i:=i+22;
end;
Давайте считать дальше.
Мы нашли число, которое нужно для 2 параметра функции Copy. Теперь будем искать 3 параметр. Давайте посчитаем, сколько символов занимает наше значение. Я насчитал 10. Если вы насчитали больше/меньше, то причиной этому могут быть чёртики, которых вы видите ещё после вчерашнего сабантуя.
Теперь, когда мы нашли все параметры для функции Copy, давайте, наконец-то запишем в 's' нужное нам значение, заменив им исходный текст:
Код:
var
s:string;
i:integer;
begin
s:='<blo><name="ololo"><value="1234567890"></blo>';
i:=Pos('<name="ololo">',s);
i:=i+22;
s:=Copy(s,i,10);
end;
Вуаля. Теперь в переменной 's' находится нужное нам значение, то есть "1234567890".
Если вы не поняли это объяснение, то я советую вам закончить 4 класс общеобразовательной школы.
С вами был VeTaL_UA.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
VeTaL_UA, так-же можно использовать HTTP Analyzator ?
Можно использовать любой сниффер. В этой статье я использовал Charles. Главное, чтобы данные запроса были составлены правильно.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Конечно же можно В статье описан процесс авторизации на Indy потому, что он проще
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.