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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Synapse и получение кода веб страницы 
V
    Опции темы
AnalogXP
Дата 8.9.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

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

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, хотя страница существует и здравствует.
Подскажите, в чем может быть проблема. Буду всем очень признателен.
PM MAIL   Вверх
Matematik
Дата 8.9.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

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



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

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

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

Это сообщение отредактировал(а) Matematik - 8.9.2010, 22:11
PM MAIL WWW ICQ   Вверх
AnalogXP
Дата 8.9.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Matematik, я как-бы, новичек в веб технологиях.

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

От Synapse, после GET запроса (до этого, заголовки Synapse пусты):
Synapse

А это от HttpFox:
HTTPFox

И от Http Analyzer:
HTTP Analyzer 1
HTTP Analyzer 2
HTTP Analyzer 3

PM MAIL   Вверх
AnalogXP
Дата 10.9.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

А второй хитер, зараза.
PM MAIL   Вверх
diam80
Дата 15.9.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Так опубликуйте, пожалуйста, ваше решение. В чем была проблема?
PM MAIL   Вверх
Matematik
Дата 15.9.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

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



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

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

Это сообщение отредактировал(а) Matematik - 15.9.2010, 18:45
PM MAIL WWW ICQ   Вверх
AnalogXP
Дата 15.9.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(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, спасибо за подсказку, дал бы плюс да не положено.

PM MAIL   Вверх
Isaev
Дата 21.4.2011, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

В каком модуле эта функция находится?
или она просто самописная?
PM MAIL ICQ   Вверх
Akella
Дата 21.4.2011, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Меньше минуты в гугле и ....
http://parsing-and-i.blogspot.com/2010/02/...irst-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;

PM MAIL   Вверх
Isaev
Дата 21.4.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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

и во вторых почему при вызове 
Headers.ValueFromIndex[i] вместо Strings[i] строки возвращаются без первого символа?
PM MAIL ICQ   Вверх
MetalFan
Дата 22.4.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(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


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

Запрещено:

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

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

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

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

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


 




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


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

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