Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.12.2011, 19:19
Pcrepair
 
Сообщения: n/a
По умолчанию idHTTP1 и закачка стр. из ЯНДЕКС.ру

Добрый день
Есть компонент idHTTP1, с помощью которого можно закачать код ХТМЛ-страницы, указав УРЛ страницы. В общем все работает (кроме фреймов, сайтов с редиректом, и есть проблемы со шрифтами)
НО, если задать адрес Ya.ru, выскакивает 301 ошибка и страница сервиса не загружается.
Вопрос для знатоков ИНДИ 10 (РАД2010):
1. если предварительно отослать запрос (через POST ввести словосочетание для поиска, ну скажем "купить телевизор") в строку ввода поиска на Яндексе, получится ли закачать первую страницу ответа Яндекса? Или всетаки нужно это делать через ТВебБраузер?
2. что то страницы с отдельных сайтов закакчиваются с кракозябрами, или вообще тексты с кириллицей не закачиваются, закачиваются только то что написано латиницей. С этим что то сделать можно? Если можно, то как?
Всем ответившим по делу спасибо.
Ответить с цитированием
  #2  
Старый 26.12.2011, 08:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

- IdHTTP1.HandleRedirects:=True;
- :=UTF8Decode(IdHTTP1.Get(''));
- да, вернется первая страница результатов поиска
- фреймы нужно запрашивать отдельно (разбирать страницу). это уже HTML, а не HTTP
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 26.12.2011, 16:43
Pcrepair
 
Сообщения: n/a
По умолчанию

NumLock, спасибо
еще вопрос
что лучше с точки зрения неполучения бана по ИП-адресу от поисковой системы
- использовать стандартный метод (ПОСТ) для вставки словосочетания в строку запроса ПС
или так
- http://yandex.ru/yandsearch?text=%EA... %E8%E7%EE%F0
конечно если кто в курсе
Ответить с цитированием
  #4  
Старый 26.12.2011, 16:53
Pcrepair
 
Сообщения: n/a
По умолчанию

Дополнительно
:=UTF8Decode(IdHTTP1.Get('')); - не работает
так же как и System.Utf8ToAnsi(IdHTTP1.Get(''));, причем одинаково
к примеру на http://forums.kuban.ru вообще кириллицу не грузит, пустые места вместо букв, зато латиница в норме
в других случаях грузит каркозябры
Ответить с цитированием
  #5  
Старый 26.12.2011, 17:25
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Как я вижу, используется RAD Studio 2010. У него Unicode включен по умолчанию. Так что тут, в случае с кракозябрами, стоит преобразовывать строку наоборот: UTF8Encode.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 26.12.2011, 17:54
Pcrepair
 
Сообщения: n/a
По умолчанию

Результаты:
если использовать
Код:
Memo1.Text := IdHttp1.Get(text);
, то вместо кириллицы идут i"?i^n~i`i^o`? и все такое
если использовать
Код:
Memo1.Text := UTF8Encode(IdHttp1.Get(text));
то кириллицы нет вообще, это результат для контрольного сайта
http://delphiexpert.ru/view_download.php?id=112
Что бы это все значило?
Ответить с цитированием
  #7  
Старый 26.12.2011, 18:23
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А что в IdHTTP1.Response.ContentType? После выполнения запроса.
Подозреваю, что "text/html; charset=windows-1251".
Поищи в гугле "RAD Studio 2010 IdHTTP cp1251".
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #8  
Старый 26.12.2011, 18:37
Pcrepair
 
Сообщения: n/a
По умолчанию

там где в заголовке charset=UTF-8, или вообще ничего - все нормально
а там где charset=windows-1251 - там или краки или вообще пусто
искать будем, вот только точно решение есть?
Ответить с цитированием
  #9  
Старый 26.12.2011, 18:42
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Решение есть. Сам делал такую фигню. Только не помню, как
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #10  
Старый 26.12.2011, 19:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

почему у меня все работает?
http://zalil.ru/32378711
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 26.12.2011, 20:28
Pcrepair
 
Сообщения: n/a
По умолчанию

DJ PhoeniX

наверно в поток закачивал, что то вроде
Код:
var rcvrdata: TStringStream;
....
   rcvrdata := TStringStream.Create('');
   try
     HTTP.Get('http://сайт.ру', rcvrdata);
   except
     //FrmMain.WriteToLog('Не удалось посетить страницу');
     exit;
   end;
Ответить с цитированием
  #12  
Старый 26.12.2011, 20:33
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну поток-то там был, только, по-моему, MemoryStream. А потом я просто хитро из него загружал. Как-то так:
1. Читаем из потока блок данных в AnsiString
2. Конвертируем AnsiString в WideString
3. Работаем.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #13  
Старый 27.12.2011, 20:22
Pcrepair
 
Сообщения: n/a
По умолчанию

Решение задачи следующее:
Использование TStringStream для решения проблем с кодировкой
Код:
Код:
var
  mStream: TStringStream;
  URL : string;
begin
 mStream := TStringStream.Create;
 URL := Edit1.Text;
 idHttp1 := TIdHTTP.Create(nil);
 idHttp1.Get(URL, mStream);
 Memo1.Clear;
 Memo1.Text := mStream.DataString; // вариант1, кодировка charset=windows-1251
  //или
 Memo1.Text := UTF8Decode (mStream.DataString); // вариант2, кодировка charset=UTF-8
end;
Результаты: код страницы в ПЕРЕМ типа TStringStream закачивается нормально, но может имееть две(или больше) разновидностей кодировки
1. если кодировка charset=windows-1251, то нужно использовать вариант1
2. если кодировка charset=UTF-8, то вариант1 (Utf8ToAnsi или UTF8Decode)
3. для универсальности нужен дополнительный код: вначале читать в ХТМЛ коде тип кодировки и делать выбор с применением доп. обработки
Если кому не лень, модифицируйте код в стиле обработки исключений, но без вывода сообщений
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:03.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025