Поиск нужного текста на сайте (на примере поиска пользователей Zhyk.ru)
Приветствую , многие новички может задавились вопросом : "Как найти нужную инфу на сайте ?лол"... Сейчас расскажу самый простой и не затратный по усилиям способ написания простенькой программки , у нас это будет поиск пользователей с любимого сайта Zhyk.Ru
Тема ориентирована на новичков в этом деле , матерые программеры , не закидывайте меня грязюкой =( , я не буду пояснять как работает та или иная строчка кода досконально , напишу лишь об основных положениях в самой программе
Скрин работы программы :
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сразу хочу оговориться по поводу пользователей с спец. символами на примере MecaгА - Страшные цифры сбоку , это код тех символов, лень матушка не позволила доработать
Что тут находится :
1 Edit (для ввода количества пользователей которых нужно найти)
3 Memo (Для вывода пользователей , вывода "битых ID" и хранения кода сайта (из него сделал красоту , где выводятся ники) )
3 Button (Для начала поиска , остановки и сохранения в файл)
1 IdHTTP (Он то и будет главным актером)
1 SaveDialog (Для сохранения пользователей в файлик)
1 ProgressBar (Для красоты )
Куча Label (Для отображения информации о поиске и тд)
Что же делает данный "механизм" ?=> Открывает код сайта , для нас это Zhyk.ru ищет нужный кусок кода (который вы прописываете сами) и копирует нужное , остальное удаляет
Что нам потребуется для данного действа (знатоки могут и в других средах работать )
embarcadero rad studio xe7
Любой браузер показывающий исходный код (У меня на примере Chrome)
Хорошее настроение
I Подготовка формы :
Расположите все вышеуказанные объекты на форме, как вам нравится , у меня это получилось так :
[Ссылки могут видеть только зарегистрированные пользователи. ]
Label's для вывода уже найденных пользователей расположите где вам надо , у меня их не видно , так как параметр Caption не имеет значения;
Настройте ReadOnly на Memo для вывода списка пользователей и у Memo c битыми ID , поставьте у Memo для приема кода сайта значение false
[Ссылки могут видеть только зарегистрированные пользователи. ]
Можно приступать к написанию кода ...
II Написание кода
1) Нажатие на кнопку СТАРТА
Код:
procedure TForm1.Button1Click(Sender: TObject);
var k,input:integer;
begin
Button1.Enabled:=False; // Делаем кнопку неактивной , чтоб еще раз не запустить всё это
val(Edit1.Text,Input,k); // Проверяем на корректность ввода , мол если не цифры , то идите лесом
if (k<>0) or (input < 0) then
begin
ShowMessage('Вы ввели некорректное значение!');
Button1.Enabled:=True; // Делаем кнопку активной
end
else
begin
if NumberUser = 0 then
Memo1.Clear;
if input > 0 then
NumberUser:=input; // передаем значение введённых пользователей глобальной переменной
MyThread:=TMyThread.Create(False);// Запускаем поток
MyThread.Priority:=tpHighest; // даем ему приоритет (можно и маленький)
ButtonSave.Enabled:=false;// Кнопка сохранить вырубается
Button3.Enabled:=True; // кнопка остановить врубается
end;
end;
2) Кнопка СТОП
Она просто меняет флаг условия выполнения потока на false , в моем случае это так ....
Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
FlagExit:=false;
end;
3) Кнопка СОХРАНЕНИЯ
Код:
procedure TForm1.ButtonSaveClick(Sender: TObject);
var FName:string;
begin
saveDialog1.Filter := 'Text|*.txt|'; // Создаем фильтр-формат, это у нас будет текстовой документ
saveDialog1.Title := 'Сохранение найденных пользователей'; // Заголовок диалога сохранения
with SaveDialog1, Memo1 do
if SaveDialog1.Execute then
begin
FName := SaveDialog1.FileName+'.txt';// Сохраняем с таким именем ... Filename.txt
Memo1.Lines.SaveToFile(FName); // Сохраняем каждую новую строчку из Memo в файл
ShowMessage('Файл сохранен успешно : ' + FName); // Сообщение о сохранении файла
end;
saveDialog1.Free; // Освобождаем память , занятую на диалог сохранения
end;
4) Создание потока
А теперь самое страшное , но в то же время самое нужное в нашей программе ... Исполнительный поток ))
Рассказывать про создание потоков глупо , я и не буду , всю необходимую информацию найдете [Ссылки могут видеть только зарегистрированные пользователи. ]
Код:
procedure TMyThread.Execute;
var
f:TextFile;
LeftPos,User,Predel:integer;
FileDir,left,rigth,site,userID:string;
begin
Inc(iFind);
Form1.Label2.Caption:= 'Идет поиск'; // Информируем о том где идет поиск
FlagExit:=True;
Form1.Memo1.Enabled:=True; // Включаем Memo
rigth:='"Ответ от сервера не получен. Пожалуйста, попробуйте снова."';
LeftPos:=9661; // Позиция с которой идет копирование (Непосредственно для сайта Zhyk)
site:='http://zhyk.ru/forum/member.php?u='; //Шаблон сайта .... после "=" идет ID пользователя , что по сути для нас будет представлять обычный счетчик , который будет увеличиваться с каждой итерацией цикла
User := 1;
Predel := 0;
While((User <=NumberUser)and (FlagExit) and (Predel < 10)) do //Пока мы не нашли нужное кол-во юзеров и не пора выходить и не больше 10 битых то можно крутануть цикл
begin
userID:=IntToStr(iFind); // переводим счетчик пользователей в тип str чтобы вставить его в адрес с которого будет браться код
Form1.Memo2.Text :=Form1.idHTTP1.Get(site+userID); // Закидываем в memo код сайта
Form1.memo2.Text := copy(Form1.memo2.Text,Leftpos,pos(rigth,Form1.memo2.Text)-leftpos-99 ); //Копируем нужный кусок кода, выверял вручную * Ниже покажу как
if Length(Form1.Memo2.Text) > 0 then
begin
Form1.Memo1.Lines.Add(Form1.Memo2.Text);
Inc(User);
Predel:=0;
Inc(UF);
end
else
begin
Inc(Predel);
Inc(PR);
Form1.Memo3.Enabled:=True;
Form1.Memo3.Lines.Add(inttostr(iFind)); // ID битого
end;
Inc(iFind);
Form1.Progressbar1.Position:=Round(100*User/NumberUser); //Увеличиваем наш прогресс бар
Form1.Label1.Caption:= IntToStr(UF); //Информируем о том что и как нашли
Form1.Label3.Caption:= IntToStr(PR);
Form1.Label2.Caption:= IntToStr(User-1) + ' из ' + IntToStr(NumberUser);
end;
Form1.Label2.Caption:= 'Готово'; // заканчиваем работу , включаем/выключаем нужные кнопки
Form1.Button1.Enabled:=True;
Form1.ButtonSave.Enabled:=True;
Form1.Button3.Enabled:=False;
Form1.Progressbar1.Position:=0; // зануляем прогресс бар
Form1.Memo2.Clear; // Чистим Memo
end;
P.S Поиск необходимого куска кода , работа ручками ...
1) Открываем страницу любого пользователя и смотрим на адрес ...
[Ссылки могут видеть только зарегистрированные пользователи. ]
Далее открываем код страницы и ищем наш ник пользователя
[Ссылки могут видеть только зарегистрированные пользователи. ]
С левой стороны мы знаем что позиция под номером 9661 и пишем ее в код
Цитата:
LeftPos:=9661; // Позиция с которой идет копирование (Непосредственно для сайта Zhyk)
С правой же стороны мы не знаем позицию и нам надо ее найти по куску кода , который мы можем единственно правильно отыскать ...
Цитата:
rigth:='"Ответ от сервера не получен. Пожалуйста, попробуйте снова."';
Но если так оставить то в ники попадут и еще куски кода , так что нам надо уменьшить позицию на количество символов в этих строках ... опять же считаем вручную ... что у нас получается при копировании ....
Что мы тут делаем ... Копируем текст из кода с левой позиции , длинной равной позиции нашей строки "Ответ от сервера ...." минус левая позиция, минус количество лишних символов кода , там их 99
Все , мы получили нужный Ник пользователя =)
Способ очень ламерский , но он работает , без взлома и тд ) , я не претендую на идею , но данный код был написан мной , если в нем есть ошибки или какие то недочеты или же вы можете предложить модификацию ... пишите ниже , всем интересно узнать .
Задавайте свои вопросы ниже , постараюсь ответить , может чего сам нового узнаю , критика приветствуется ))
Спасибо за внимание , надеюсь я вам помог. Всем добра! ^^
ИСХОДНИКИ ПО ДАННОЙ ТЕМЕ : [Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось Dessanndes; 19.12.2014 в 08:00.
Причина: Добавлял ссыль на ВТ