Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  14:32[Войти] | [Зарегистрироваться]
Ответ на вопрос № 37747

16-11-2005 01:01
Здравствуйте.У меня такой вопрос: Надо чтобы в моем приложении Дельфи принимались данные из интернета (например со странички - http://weather.yandex.ru/city.xml?city=28224) о погоде в моем городе (Пермь). Конкретно - температура, давление. Как это можно "вытащить" эти данные? С помощью каких компонентов? Если можно то небольшой пример...

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

17-11-2005 07:00
2 al_mt:
Спасибо за информацию

16-11-2005 07:11
P.S. Этот прикол яндексы учинили недавно, раньше я тоже конец загрузки отслеживал, и вдруг всё перестало работать :(

16-11-2005 07:09
Именно для яндекса задержка нужна, т.к. там грузится не одна страница, а несколько клиентскими скриптами. Эти меры яндекс принимает специально против роботов, так что... Смысл задержки в том, что это самый простой способ сэмулировать поведение человека.

16-11-2005 03:21
А вот еще способ получить страницу с помощью компонента TcpClient с закладки Internet (Дельфи 7). Проверил на ссылке из вопроса - работает.
var Client: TTcpClient;
св-ва
RemotePort='80';
RemoteHost='www.yandex.ru';
(у меня на работе прокси-сервер, поэтому эти значения настроены по-другому, но аналогичное проверялось дома на других сайтах)


function TForm1.GetWebText(Address: string): string;
var
  s: array[1..128] of Char;
  i, PrevLen: integer;
begin
  if not Client.Connect
  then Raise Exception.Create('Can''t connect.');
  try
    with Client do
    begin
      SendLn('GET ' + Address + ' HTTP/1.1'); //посылаем запрос
      //SendLn('Host: '+edHost.Text);
      //SendLn('Accept-Charset: windows-1251');
      SendLn('');
      Result:='';
      repeat i:=ReceiveBuf(s, SizeOf(s)); //получаем ответ
        PrevLen:=Length(Result);
        SetLength(Result, Length(Result)+i);
        if i>0
        then Move(s[1], Result[PrevLen+1], i);
        Application.ProcessMessages;
      until i=0;
    end;
  finally
    Client.Disconnect;
  end;
end;

Address подставляем http://weather.yandex.ru/city.xml?city=28224

16-11-2005 02:47
Я делал без TWebBrowser

unit HTTPReader;

{
  05.10.2005
  Получение HTML страниц из интернета и разбор их с помощью MSHTML, без
  использования TWebBrowser.
  Как-то понадобилось вытягивать курсы валют с одной веб странички, причем не
  хотелось тянуть графику и использовать TWebBrowser.
  Вот что из этого получилось.

  Разработал: Федоров А.
}


interface

uses
  Windows, MSHTML;

{
Пример:
var
  ht: THTTPReader;
  doc: IHTMLDocument2;
begin
  ht := THTTPReader.Create;
  try
    ht.Get(Handle, 'www.delphikingdom.com', '/index.asp');
    doc := ht.Parse;
    ShowMessage(doc.body.innerHTML);
  finally
    ht.Free;
  end;
end;
}


type
  THTTPReader = class
  private
    FBuffer: string;
    FDocument: IHTMLDocument2;
  public
    // Get - читает html-документ
    // Handle - дескриптор окна, относительно которого будут выводится сообщения
    // ServerName - имя сервера, например www.delphikingdom.com
    // Путь к html-документу, относительно имени сервера, например /index.asp
    procedure Get(Handle: THandle; ServerName, RelativePath: string);

    // HTMLDocument - разбирает html-код, хранящийся в буфере
    // и возвращает IHTMLDocument2
    function Parse: IHTMLDocument2;

    procedure LoadFromFile(const FileName: string);
    procedure SaveToFile(const FileName: string);

    // Буфер для хранения HTML кода
    property Buffer: string read FBuffer write FBuffer;
  end;

implementation

uses
  WinInet, SysUtils, ActiveX, Classes;

{ THTTPReader }

procedure THTTPReader.Get(Handle: THandle; ServerName,
  RelativePath: string);
const
  BUF_SIZE = 65536;
var
  Internet, Connection, Request: HINTERNET;
  ErrorCode: Integer;
  Data: Pointer;
  Buf: string;
  bytes_read: Cardinal;
begin
  FBuffer := EmptyStr;
  Internet := InternetOpen('HTTP Reader', INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  if not Assigned(Internet) then
    RaiseLastWin32Error;
  try
    Connection := InternetConnect(Internet, PChar(ServerName),
      INTERNET_INVALID_PORT_NUMBER, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    if not Assigned(Connection) then
      RaiseLastWin32Error;
    try
      Request := HttpOpenRequest(Connection, 'GET', PChar(RelativePath),
        nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
      if not Assigned(Request) then
        RaiseLastWin32Error;
      try
        repeat
          if not HttpSendRequest(Request, nil, 0, nil, 0) then
            RaiseLastWin32Error;
          Data := nil;
          ErrorCode := InternetErrorDlg(Handle, Request, ERROR_SUCCESS,
            FLAGS_ERROR_UI_FILTER_FOR_ERRORS or
            FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS or
            FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, Data);
        until ErrorCode <> ERROR_INTERNET_FORCE_RETRY;

        SetLength(Buf, BUF_SIZE);
        while InternetReadFile(Request, PChar(Buf), BUF_SIZE, bytes_read)
          and (bytes_read > 0) do
          FBuffer := FBuffer + Copy(Buf, 1, bytes_read);
      finally
        InternetCloseHandle(Request);
      end;
    finally
      InternetCloseHandle(Connection);
    end;
  finally
    InternetCloseHandle(Internet);
  end;
end;

procedure THTTPReader.LoadFromFile(const FileName: string);
var
  fs: TFileStream;
begin
  FBuffer := EmptyStr;
  fs := TFileStream.Create(FileName, fmOpenRead);
  try
    SetLength(FBuffer, fs.Size);
    fs.Read(PChar(FBuffer)^, fs.Size);
  finally
    fs.Free;
  end;
end;

function THTTPReader.Parse: IHTMLDocument2;
const
  IID_IPersistStreamInit: TGUID = (
    D1:$7FD52380;D2:$4E07;D3:$101B;D4:($AE,$2D,$08,$00,$2B,$2E,$C7,$13));
var
  pst: IPersistStreamInit;
  ws: WideString;
  mk_start, mk_finish: IMarkupPointer;
  ms: IMarkupServices;
  mc: IMarkupContainer;
begin
  Result := nil;
  CoCreateInstance(CLASS_HTMLDocument, nil, CLSCTX_INPROC_SERVER,
    IID_IHTMLDocument2, FDocument);
  if Assigned(FDocument) then
  begin
    FDocument.QueryInterface(IID_IPersistStreamInit, pst);
    if Assigned(pst) then
    begin
      pst.InitNew;
      pst := nil;
      FDocument.QueryInterface(IID_IMarkupServices, ms);
      if Assigned(ms) then
      begin
        ms.CreateMarkupPointer(mk_start);
        ms.CreateMarkupPointer(mk_finish);
        ws := FBuffer + #0;
//        ms.ParseString(PWideString(@ws[1]), 0, mc, mk_start, mk_finish); // pchHTML: PWideString;
        ms.ParseString(PWord(@ws[1])^, 0, mc, mk_start, mk_finish); // var pchHTML: Word;
        if Assigned(mc) then
          mc.QueryInterface(IID_IHTMLDocument, Result);
      end;
    end;
  end;
end;

procedure THTTPReader.SaveToFile(const FileName: string);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    fs.Write(PChar(FBuffer)^, Length(FBuffer));
  finally
    fs.Free;
  end;
end;

end.


16-11-2005 02:44
Можно вместо TWebBrowser использовать idHTTP из Indy Clients.
Примерно так:

HTTPClient.Get('http://weather.yandex.ru/city.xml?city=28224')


После вызова Get, страница (ее <body>...</body>) хранится в HTTPClient.Body

Задержка не нужна, т.к. Get возвращает управление в процедуру только после окончания загрузки.

2 al_mt^
делаешь паузу секунд на 20 (отслеживать окончание загрузки на этом сайте бесполезно) Эт как?

16-11-2005 01:57
Конкретно с яндексом и его уродской противороботовой защитой есть только один способ:
- берёшь TWebBrowser
- говоришь ему Navigate(твоя ссылка)
- делаешь паузу секунд на 20 (отслеживать окончание загрузки на этом сайте бесполезно)
- потом парсишь страницу загруженную в браузер...

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования