Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получить ссылки 
:(
    Опции темы
AlexeyShestchenko
Дата 2.3.2008, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



Передо мной встала задача: получить список всех доступных ссылок на сайте. ничего толкового не придумал как тупо заходить на главную страницу, получать все ссылки с нее, далее проходить по каждой ссылке брать с той страницы все ссылки и т.д....
но это же бесконечный цикл получается, как мне решить свой вопрос, принимаю любые ответы, по теме разумеется ;)
Заранее благодарен!

Добавлено через 2 минуты и 27 секунд
забыл сказать, хочу сделать аналог teleport pro,web transporter etc
PM MAIL   Вверх
MetalFan
Дата 2.3.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(AlexeyShestchenko @  2.3.2008,  02:55 Найти цитируемый пост)
но это же бесконечный цикл получается

почему же бесконечный?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
diamondd
Дата 2.3.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 11.9.2007

Репутация: нет
Всего: нет



Цитата(MetalFan @  2.3.2008,  10:37 Найти цитируемый пост)
почему же бесконечный?


потому что есть обратные ссылки...

AlexeyShestchenko,
а ты попробуй запоминать все пройденные страницы в какой-нибудь список и прежде чем переходить по ссылке, сверяйся со списком, чтобы не переходить на одну страницу многократно
PM MAIL   Вверх
Akella
Дата 2.3.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



честно говоря, н пойму, в чем проблема-то? Проверяй, что-бы все ссылки принадлежали конкретному сайту, а на другий сайты ни ногой smile 
Или у  тебя пробела с поиском ссылок? Используй регулярки.
PM MAIL   Вверх
MetalFan
Дата 2.3.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(diamondd @  2.3.2008,  13:35 Найти цитируемый пост)
потому что есть обратные ссылки...

запоминай обработанные ссылки.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bems
Дата 2.3.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(MetalFan @  2.3.2008,  15:00 Найти цитируемый пост)
запоминай обработанные ссылки
и лучше чтобы список был хэшированый



--------------------
Обижено школьников: 8
PM MAIL   Вверх
AlexeyShestchenko
Дата 2.3.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



зачем хешированные, так лучше поиск чтоли осущевствлять? 
PM MAIL   Вверх
bems
Дата 2.3.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



AlexeyShestchenko,  быстрее, если их много



--------------------
Обижено школьников: 8
PM MAIL   Вверх
AlexeyShestchenko
Дата 3.3.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



а в данном случае каким алгоритмом лучше хэшировать?
и потом просто проверять if list.indexof(hash) <> -1 ?

Добавлено через 1 минуту и 43 секунды
а с регулярками я замучился, не получается правильно составить шаблон и потом не понятно как все это дело организовать,чтобы работало (найти ссылку,убрать лишние символы или слова,проверить нету ил повторных ссылок)...
PM MAIL   Вверх
MetalFan
Дата 3.3.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(AlexeyShestchenko @  3.3.2008,  11:31 Найти цитируемый пост)
а в данном случае каким алгоритмом лучше хэшировать?
и потом просто проверять if list.indexof(hash) <> -1 ?

в IniFiles есть класс THashedStringList
можешь его запользовать


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
AlexeyShestchenko
Дата 4.3.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



делаю так: захожу на главную страницу,забираю оотуда все ссылки, заношу в грид и ставлю рядом в колонке их глубину(1), затем прохожусь по следующим ссылкам в этом же гриде и забираю оотуда ссылки,опять закидываю их в грид.
кому нетрудно взгляните и скажите как улучшить, а то работает медленно и похоже не совсем верно:

Код


var
  j, p, w, g, a, n, h, l, b: integer;
  s: string;
  i, q: Integer;
  pos_2: string;
  pos_1: Tstringlist;
  list_nalichie: TStringList;
  povtor_ssilki: Boolean;
  url, url_: string;
  list: wideString;
  glubina: Integer;
  xz,gg: boolean;
  col_cd,cx:Integer;
begin

  url := 'http://www.firsthealthgallery.com';
  url_ := url;
  list := GetUrl(url);
  list_nalichie := TStringList.Create; // тута содержиться текст который я ищу в ссылке(в нашем случае это php,html)
  list_levak := TStringList.Create;
  list_nalichie.Add('.htm');
  list_nalichie.Add('.php');
  pos_1 := TStringList.Create; //  с чего начинаются ссылки
  pos_1.Add('href="');
  pos_1.Add('action="');
  pos_1.Add('value="');
  glubina := -1;

  if Posex('/', url, 8) > 0 then
    Delete(url, Posex('/', url, 8), lengtH(url));

  gg:=False;

  pos_2 := '"';
  povtor_ssilki := True;
  j := 0;

  for b := 0 to 2 do
  begin
    Inc(glubina);



    for l := 0 to StringGrid1.RowCount - 1 do
    begin

      if glubina <> 0 then
      begin
        url := StringGrid1.Cells[0, l];
        list := GetUrl(url);
        if PosR2L('/', url) >= 7 then
          url := Copy(url, 1, PosR2L('/', url) - 1);
      end;
      if list <> '' then
        for h := 0 to pos_1.Count - 1 do
        begin
          j := 0;
          while j <> lengtH(list) do
          begin
            Application.ProcessMessages;
            col_cd := 0;
            inc(j);
            S := '';
            if PosEx(pos_1.Strings[h], list, J) > 0 then
            begin
              for P := PosEx(pos_1.Strings[h], list, J) + length(pos_1.Strings[h]) to
                Length(list) do
                if list[P] <> pos_2 then
                  S := S + list[P]
                else
                  break;
              J := P;
              q := 0;
              col_cd := 1;

              for a := 1 to length(s) do
              begin
                if Copy(s, 1, 3) = '../' then
                begin
                  Delete(s, 1, 3);
                  Inc(col_cd);
                end
                else
                  Break;
              end;

              if glubina <> 0 then
              begin
                url := StringGrid1.Cells[0, l];
                for n:=0 to col_cd - 1 do
                  if PosR2L('/', url) >= 7 then
                    Delete(url, PosR2L('/', url),Length(url));
              end;


              if (Copy(s, 1, 3) <> 'www') and (Copy(s, 1, 3) <> 'WWW') and (Copy(s, 1, 4) <> 'http') and (Copy(s, 1, 4) <> 'HTTP') then
                s := url + '/' + s;


              if Copy(s,1,Length(url_)) = url_ then
              if list_nalichie.Count <> 0 then
              begin
                for i := 0 to list_nalichie.Count - 1 do
                  if PosEx(list_nalichie.Strings[i], s, 1) <> 0 then
                  begin

                    label1.Caption := IntToStr(StringGrid1.RowCount);
                    if povtor_ssilki then
                    begin
                      if not ADDString(StringGrid1, s, 0) then
                      begin
                        if StringGrid1.Cells[0, 0] = '' then
                          StringGrid1.RowCount := StringGrid1.RowCount
                        else
                          StringGrid1.RowCount := StringGrid1.RowCount + 1;

                        StringGrid1.Cells[0, StringGrid1.RowCount - 1] := S;
                        StringGrid1.Cells[2, StringGrid1.RowCount - 1] := IntToStr(Glubina);
                      end;
                    end
                    else
                    begin
                      StringGrid1.RowCount := StringGrid1.RowCount + 1;
                      StringGrid1.Cells[0, StringGrid1.RowCount - 1] := S;
                      StringGrid1.Cells[2, StringGrid1.RowCount - 1] := IntToStr(Glubina);
                    end;
                  end;
              end else
                if povtor_ssilki then
                begin
                  if not ADDString(StringGrid1, s, 0) then
                  begin
                    if StringGrid1.Cells[0, 0] = '' then
                      StringGrid1.RowCount := StringGrid1.RowCount
                    else
                      StringGrid1.RowCount := StringGrid1.RowCount + 1;


                    StringGrid1.Cells[0, StringGrid1.RowCount - 1] := S;
                    StringGrid1.Cells[2, StringGrid1.RowCount - 1] := IntToStr(Glubina);

                  end
                  else
                  begin
                    StringGrid1.RowCount := StringGrid1.RowCount + 1;
                    StringGrid1.Cells[0, StringGrid1.RowCount - 1] := S;
                    StringGrid1.Cells[2, StringGrid1.RowCount - 1] := IntToStr(Glubina);
                  end;
                end;
            end;
          end;
        end;
    end;


  end;


  label1.Caption := 'end : ' + IntToStr(StringGrid1.RowCount);

  list_nalichie.Free;
  list_levak.Free;
  pos_1.Free;


функции для работы
Код

function PosR2L(const FindS, SrcS: string): Integer;
  function InvertS(const S: string): string;
  {Èíâåðñèÿ ñòðîêè S}
  var i, Len: Integer;
  begin
    Len := Length(S);
    SetLength(Result, Len);
    for i := 1 to Len do
      Result[i] := S[Len - i + 1];
  end;
var ps: Integer;
begin
  ps := Pos(InvertS(FindS), InvertS(SrcS));
  if ps <> 0
    then Result := Length(SrcS) - Length(FindS) - ps + 2
  else Result := 0;
end;



function ADDString(Grid: TStringGrid; Text: string; Col: Integer): Boolean;
var
  i: integer;
begin
  Result := False;
  for i := 0 to Grid.RowCount - 1 do
    if Grid.Cells[Col, i] = Text then
    begin
      Result := True;
      Exit;
    end;
end;


const
  HTTP_PORT = 80;
  CLRF = #13#10;
  Header = 'Content-Type: application/x-www-form-urlencoded' + CLRF;


function DelHttp(URL: string): string;
begin
  if Pos('http://', URL) > 0 then Delete(Url, 1, 7);
  Result := Copy(Url, 1, Pos('/', Url) - 1);
  if Result = '' then Result := URL;
end;

function GetUrl(const URL: string): string;
var
  FSession, FConnect, FRequest: HINTERNET;
  FHost, FScript: string;
  Ansi: PAnsiChar;
  Buff: array[0..1023] of Char;
  BytesRead: Cardinal;
begin
  Result := '';
  // Íåáîëüøîé ïàðñèíã
  // âûòàñêèâàåì èìÿ õîñòà è ïàðàìåòðû îáðàùåíèÿ ê ñêðèïòó
  FHost := DelHttp(Url);
  FScript := Url;
  Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));

  // Èíèöèàëèçèðóåì WinInet
  FSession := InternetOpen('DMFR', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if not Assigned(FSession) then Exit;
  try
    // Ïîïûòêà ñîåäèíåíèÿ ñ ñåðâåðîì
    FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil,
      'HTTP/1.0', INTERNET_SERVICE_HTTP, 0, 0);
    if not Assigned(FConnect) then Exit;
    try
      // Ïîäãîòàâëèâàåì çàïðîñ ñòðàíèöû
      Ansi := 'text/*';
      FRequest := HttpOpenRequest(FConnect, 'GET', PChar(FScript), 'HTTP/1.0',
        '', @Ansi, INTERNET_FLAG_RELOAD, 0);
      if not Assigned(FConnect) then Exit;
      try
        // Äîáàâëÿåì çàãîëîâêè
        if not (HttpAddRequestHeaders(FRequest, Header, Length(Header),
          HTTP_ADDREQ_FLAG_REPLACE or
          HTTP_ADDREQ_FLAG_ADD)) then Exit;
        // Îòïðàâëÿåì çàïðîñ
        if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;
        // Ïîëó÷àåì îòâåò
        FillChar(Buff, SizeOf(Buff), 0);
        repeat
          Result := Result + Buff;
          FillChar(Buff, SizeOf(Buff), 0);
          InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
        until BytesRead = 0;
      finally
        InternetCloseHandle(FRequest);
      end;
    finally
      InternetCloseHandle(FConnect);
    end;
  finally
    InternetCloseHandle(FSession);
  end;
end;
//###################################################################################################################################################


PM MAIL   Вверх
AlexeyShestchenko
Дата 4.3.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



все таки прошу помочь, хочется сделать с помощью регулярок, но не могу свараганить шаблон,ведь так много разных вариантов smile 
PM MAIL   Вверх
MetalFan
Дата 5.3.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(AlexeyShestchenko @  4.3.2008,  00:08 Найти цитируемый пост)
забираю оотуда все ссылки, заношу в грид

а зачем для хранения данных использовать визуальный компонент???

Цитата(AlexeyShestchenko @  4.3.2008,  23:06 Найти цитируемый пост)
хочется сделать с помощью регулярок

примеры ссылок какие?
<a href=ссылка>
?
или что?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
AlexeyShestchenko
Дата 5.3.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



их оказывается много очень...
<a value="..">
<a href="..">
<a href='..'>
<a action="..">
PM MAIL   Вверх
MetalFan
Дата 5.3.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



и в чем тут проблема?
примерно так:
<a (value|href|action)=("|'''')(.+?)(\2)(.*?)>
тогда третье(?) подвыражение и будет линком.

Это сообщение отредактировал(а) MetalFan - 5.3.2008, 17:15


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0624 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.