Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2015, 12:55   #1
sasha0808
Новичок
Джуниор
 
Регистрация: 04.10.2015
Сообщений: 7
По умолчанию сканирование сайта

Добрый день.
Как сделать чтоб вводишь URL сайта а тебе выдавало все найденные внутренние страницы на сайте?
я вроде написал, но работает некорректно.
пробовал писать не главную страницу а ссылку на карту сайта, в этом случае количество найденных ссылок правильно пишет, а выводит только 1!
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls, RegExpr, XPMan;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    SaveDialog1: TSaveDialog;
    Label2: TLabel;
    Label3: TLabel;
    procedure Linker(URL:String);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  Checked,Remain:TStringlist;

procedure TForm1.Linker(URL:String);
var
  Cache,link: string;
  i:integer;
  reg: TRegExpr;
begin

  try
  Cache:=Form1.IdHttp1.Get(URL);
  reg:=TRegExpr.Create;
    reg.Expression:='(?i)(href=)([^ >]+)';
    if reg.Exec(Cache) then
    begin
      repeat
        link:=reg.Match[0];
        delete(link,1,5);
        for i:=1 to length(link) do
        begin
          if link[i]='"' then delete(link,i,1);
          if ord(link[i])=39 then delete(link,i,1);
        end;
        if  ((link[1]='/')or (link[1]='\')) then
          link:=Form1.Edit1.text+link;
        if  ((link[1]<>'/') and (link[1]<>'\')) and (pos('http://',link)=0) then
          link:=Form1.Edit1.text+'/'+link;
       if (pos('mailto:',link)=0) and (pos('ftp://',link)=0) and
          (pos(Form1.edit1.text,link)<>0) and (pos(link,checked.Text)=0) then
            begin
             Checked.Add(link);
             Form1.Memo1.lines.Add(link);
             linker(link);
            end;
      until not reg.ExecNext;
    end;
  finally
    reg.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
linker(edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Checked:=TStringList.create;
Remain:=TStringList.create;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1.SaveDialog1.FileName + '.');
end;

end.

Последний раз редактировалось Stilet; 04.10.2015 в 13:11.
sasha0808 вне форума Ответить с цитированием
Старый 04.10.2015, 13:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
delete(link,1,5);
А зачем это? Если делать по старинке без регулярок, то:
Код:
Cache:=Form1.IdHttp1.Get(URL);
i:=pos('href="',Cache);
while i<>0 do begin
 delete(Cache,1,i+6);
 i:=pos('"',Cache);
 Checked.Add(copy(Cache,1,i-1));
 i:=pos('href="',Cache);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2015, 13:26   #3
sasha0808
Новичок
Джуниор
 
Регистрация: 04.10.2015
Сообщений: 7
По умолчанию

Немного доработал. там выдавало ошибку и процесс не происходил.
вот доработанный код, но проблема все равно осталась.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls, RegExpr, XPMan;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    SaveDialog1: TSaveDialog;
    Label2: TLabel;
    Label3: TLabel;
    procedure Linker(URL:String);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  Checked,Remain:TStringlist;

procedure TForm1.Linker(URL:String);
var
  Cache,link: string;
  n,i:integer;
  reg: TRegExpr;
begin
  Cache:=IdHttp1.Get(URL);
  Checked.Add(url);
  Memo1.Lines.Add(url);
  reg:=TRegExpr.Create;
  memo1.Clear;
  n:=0;
  try
    reg.Expression:='<a[^>]+href=([^ >]+)';
    if reg.Exec(Cache) then begin
      repeat
        link:=reg.Match[0];
        //Äîðàáàòûâàåì ññûëêó
        if (ord(link[length(link)])=39) or (link[length(link)]='"')
        or (link[length(link)]=' ') or (link[length(link)]='>') then
          delete(link,length(link),1);
        delete(link,1,pos('href=',link)+4);
        if (ord(link[1])=39) or (link[1]='"')
        or (link[1]=' ') or (link[1]='>') then
          delete(link,1,1);
        //Äîáàâëÿåì íà÷àëî ñàéòà
        if (pos('http://',link)=0) and ((link[1]='\') or (link[1]='/')) then link:=Edit1.Text+link;
        if (pos('http://',link)=0) and (link[1]<>'\') and (link[1]<>'/') and (Edit1.Text[length(edit1.text)]<>'/') then link:=Edit1.Text+'/'+link;
        //Ïîñëåäíÿÿ ïðîâåðêà è
           äîáàâëÿåì â ìåìî
        if (pos('mailto:',link)=0) and (pos(edit1.text,link)<>0) then
          if (pos(link,checked.Text)=0) and (pos(link,remain.Text)=0) then
            Remain.Add(link);
        n:=n+1;
      until not reg.ExecNext;
    end else
      Memo1.Lines.Add('Ññûëêè íå íàéäåíû!');
  finally
    reg.Free;
  end;
  Label3.Caption:=IntToStr(n);
  Cache:='';
if remain.Count<>0 then
  for i:=0 to remain.Count-1 do
   Memo1.Lines.Add(remain[i]);
    //linker(remain[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
linker(edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Checked:=TStringList.create;
Remain:=TStringList.create;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1.SaveDialog1.FileName + '.');
end;

end.

Последний раз редактировалось Stilet; 04.10.2015 в 13:36.
sasha0808 вне форума Ответить с цитированием
Старый 04.10.2015, 13:37   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я правильно понял - регулярками принципиально?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2015, 14:06   #5
sasha0808
Новичок
Джуниор
 
Регистрация: 04.10.2015
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я правильно понял - регулярками принципиально?
нет не принципиально, я просто не понял что вы предлагаете!?
sasha0808 вне форума Ответить с цитированием
Старый 04.10.2015, 14:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я предлагаю все что у тебя между repeat...until выкинуть
Замену я предложил выше.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2015, 14:48   #7
sasha0808
Новичок
Джуниор
 
Регистрация: 04.10.2015
Сообщений: 7
По умолчанию

Stilet, в таком случае программа вообще виснет, и только снятие задачи через диспетчер помогает!
sasha0808 вне форума Ответить с цитированием
Старый 04.10.2015, 16:16   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дай угадаю: отладка - зло?
Хотя бы покажи как переделал, может копипасте втупую подгадило ))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2015, 16:30   #9
sasha0808
Новичок
Джуниор
 
Регистрация: 04.10.2015
Сообщений: 7
По умолчанию

Сейчас программа возвращает урл тот который вводишь
Цитата:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, StdCtrls, RegExpr, XPMan;

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
IdHTTP1: TIdHTTP;
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
SaveDialog1: TSaveDialog;
Label2: TLabel;
Label3: TLabel;
procedure Linker(URL:String);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
Checked,Remain:TStringlist;

procedure TForm1.Linker(URL:String);
var
Cache,link: string;
n,i:integer;
reg: TRegExpr;
begin
Cache:=IdHttp1.Get(URL);
Checked.Add(url);
Memo1.Lines.Add(url);
reg:=TRegExpr.Create;

n:=0;
try
reg.Expression:='<a[^>]+href=([^ >]+)';
if reg.Exec(Cache) then begin
repeat
Cache:=Form1.IdHttp1.Get(URL);
i:=pos('href="',Cache);
while i<>0 do begin
delete(Cache,1,i+6);
i:=pos('"',Cache);
Checked.Add(copy(Cache,1,i-1));
i:=pos('href="',Cache);
end;
until not reg.ExecNext;
end else
Memo1.Lines.Add('!');
finally
reg.Free;
end;
Label3.Caption:=IntToStr(n);
Cache:='';
if remain.Count<>0 then
for i:=0 to remain.Count-1 do
Memo1.Lines.Add(remain[i]);
//linker(remain[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
linker(edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Checked:=TStringList.create;
Remain:=TStringList.create;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1. SaveDialog1.FileName + '.');
end;

end.

В общем я хочу сделать чтоб все адреса вытаскивала программа вместе с title страницы

Последний раз редактировалось sasha0808; 04.10.2015 в 16:33.
sasha0808 вне форума Ответить с цитированием
Старый 04.10.2015, 22:13   #10
sasha0808
Новичок
Джуниор
 
Регистрация: 04.10.2015
Сообщений: 7
По умолчанию

Кто поможет написать такую программу?
sasha0808 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканирование по сетке Viwwna Windows 0 03.03.2015 11:41
сканирование памяти neeble Общие вопросы Delphi 15 01.11.2011 09:47
Сканирование портов -Flasher- Работа с сетью в Delphi 5 03.08.2010 10:47
Сканирование экрана pecson Общие вопросы Delphi 5 13.12.2008 07:25