Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Synapse и получение кода веб страницы


Автор: AnalogXP 8.9.2010, 19:06
Здравствуйте!

Получаю исходник веб страниц таким способом:
Код

function GetHTML(URL: string): RawByteString;
var Synapse: THTTPSend;
    NewUrl: string;
    n: integer;
    FStream: TMemoryStream;
    temp: RawByteString;
begin
    Synapse := THTTPSend.Create;
    try
        try
            if Synapse.HTTPMethod('GET', URL) then
            begin
                case Synapse.Resultcode of
                301,
                302,
                307:
                    begin
                        n := FoundLocationStrNum(Synapse.Headers, 'Location: ');
                        if (n >= 0) and (n <= Synapse.Headers.count-1) then
                        begin
                            NewUrl := StringReplace(Synapse.Headers.Strings[n],'Location: ','', [rfIgnoreCase]);
                           
                            result := GetHTML(NewUrl);
                        end;
                    end;
                200:
                    begin
                        FStream := TMemoryStream.Create;
                        try
                            FStream.LoadFromStream(Synapse.Document);
                            temp := StreamToRawByteString(FStream);

                            SetCodePage(temp, 65001, false);
                            Result := temp;
                        finally
                            FStream.Free;
                        end;
                    end;
                end;
            end;
        except
        end;
    finally
        Synapse.Free;
    end;
end;

Все работает отлично, но... Есть некоторые страницы которые зацикливают мою фукнцию. Например 
http://www.dofus.com/de
А вот данная страничка - https://www.allianz.de/ - при проверке кода ответа:
Код

if Synapse.HTTPMethod('GET', url) then
       Response := Synapse.Resultcode;

возвращяет код 404, хотя страница существует и здравствует.
Подскажите, в чем может быть проблема. Буду всем очень признателен.

Автор: Matematik 8.9.2010, 22:11
Цитата(AnalogXP @  8.9.2010,  19:06 Найти цитируемый пост)
Подскажите, в чем может быть проблема

- неправильно устанавливаются куки.
- серверу не нравятся заголовки запроса, например user-agent.

Сниффером посмотри чем отличаются запросы браузера и твоей программы.

Автор: AnalogXP 8.9.2010, 22:42
Matematik, я как-бы, новичек в веб технологиях.

Вот что получаю  для http://www.dofus.com/de

От Synapse, после GET запроса (до этого, заголовки Synapse пусты):
http://ipicture.ru/uploads/100908/6zjV54U4cr.jpg

А это от HttpFox:
http://ipicture.ru/uploads/100908/NZSRG755mF.jpg

И от Http Analyzer:
http://ipicture.ru/uploads/100908/mSMeLQjT6V.jpg
http://ipicture.ru/uploads/100908/iHsLvTLs33.jpg
http://ipicture.ru/uploads/100908/8Lsvr7D1DC.jpg

Автор: AnalogXP 10.9.2010, 19:55
С первым сайтом разобрался.
Решение:
Synapse.Cookies

А второй хитер, зараза.

Автор: diam80 15.9.2010, 13:50
Цитата(AnalogXP @ 10.9.2010,  17:55)
С первым сайтом разобрался.
Решение:
Synapse.Cookies

Так опубликуйте, пожалуйста, ваше решение. В чем была проблема?

Автор: Matematik 15.9.2010, 18:41
Цитата(diam80 @  15.9.2010,  13:50 Найти цитируемый пост)
Так опубликуйте, пожалуйста, ваше решение. В чем была проблема? 

Каждый вызов GetHTML() создается свой экземпляр THTTPSend со своим отдельным списком печенек.

Автор: AnalogXP 15.9.2010, 19:00
Цитата(diam80 @  15.9.2010,  11:50 Найти цитируемый пост)
Так опубликуйте, пожалуйста, ваше решение. В чем была проблема? 


Измененная функция:
Код

function GetHTML(URL: string; Kuki: TStrings): RawByteString;
var Synapse: THTTPSend;
    NewUrl: string;
    n: integer;
    FStream: TMemoryStream;
    temp: RawByteString;
begin
    Synapse := THTTPSend.Create;
    try
        Synapse.Cookies.AddStrings(Kuki);
        try
            if Synapse.HTTPMethod('GET', URL) then
            begin
                case Synapse.Resultcode of
                301,
                302,
                307:
                    begin
                        n := FoundLocationStrNum(Synapse.Headers, 'Location: ');
                        if (n >= 0) and (n <= Synapse.Headers.count-1) then
                        begin
                            NewUrl := StringReplace(Synapse.Headers.Strings[n],'Location: ','', [rfIgnoreCase]);
                           
                            result := GetHTML(NewUrl, Synapse.Cookies);
                        end;
                    end;
                200:
                    begin
                        FStream := TMemoryStream.Create;
                        try
                            FStream.LoadFromStream(Synapse.Document);
                            temp := StreamToRawByteString(FStream);
                            SetCodePage(temp, 65001, false);
                            Result := temp;
                        finally
                            FStream.Free;
                        end;
                    end;
                end;
            end;
        except
        end;
    finally
        Synapse.Free;
    end;
end;


Вызов:
Код

    str := TStringList.Create;
    try
        str.Text:='';
        HTMLCode := GetHTML(url, str);
    finally
        str.Free;
    end;


Matematik, спасибо за подсказку, дал бы плюс да не положено.

Автор: Isaev 21.4.2011, 00:44
Цитата(AnalogXP @  8.9.2010,  19:06 Найти цитируемый пост)
 n := FoundLocationStrNum(Synapse.Headers, 'Location: ');

В каком модуле эта функция находится?
или она просто самописная?

Автор: Akella 21.4.2011, 08:50
Меньше минуты в гугле и ....
http://parsing-and-i.blogspot.com/2010/02/synapse-in-delphi-first-steps.html

Код

function FoundLocationStrNum(Headers: TStringlist): integer;
var
  FoundStrPos, i   : integer;
begin
  Result:= -1;
  // ищем в заголовке строку, начинающуюся с "Location: "
  for i := 0 to Headers.Count do
  begin
    FoundStrPos := Pos('Location: ', Headers.Strings[i]);
    if FoundStrPos > 0 then
    begin
      Result:= i; // номер строки, в которой указан Location
      exit;
    end;
  end;
end;

Автор: Isaev 21.4.2011, 22:08
Цитата(Akella @  21.4.2011,  08:50 Найти цитируемый пост)
Меньше минуты в гугле и ....

я тоже гуглил... там всего 3 ссылки было и не нашёл
потому написал сам, в общем то же самое и вышло
просто не люблю тратить время на изобретения колёс, думал может стандартное что-то используется.

При написании всплыло пару странных косяков...
вообще изначально была идея сделать Headers.Sort и Headers.Find
но почему-то не сработало... видимо он не ищет вхождения, а только полную строку

и во вторых почему при вызове 
Headers.ValueFromIndex[i] вместо Strings[i] строки возвращаются без первого символа?

Автор: MetalFan 22.4.2011, 11:20
Цитата(Isaev @  21.4.2011,  22:08 Найти цитируемый пост)
была идея сделать Headers.Sort и Headers.Find

Headers там обыкновенный TStringList (afaik), так что понятно, почему не заработало.

Цитата(Isaev @  21.4.2011,  22:08 Найти цитируемый пост)
ValueFromIndex[i] вместо Strings[i] строки возвращаются без первого символа? 

TStrings.ValueFromIndex + F1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)