Здравствуйте, в этой статье я хотел бы поговорить как можно в своих проектах использовать рейтинг КиноПоиск.РУ. Да, конечно, самый простой способ — это отправить запрос на КиноПоиск, затем получить данные пропарсить, затем открыть найденную ссылку на фильм и там уже пропарсить (получить) рейтинг фильма. Но зачем так? если КиноПоиск.РУ предоставляет возможность получения рейтинга в xml-формате, что очень удобно парсить, нам для этого только остается узнать идентификатор фильма (его код, номер) — его можно получить пропарсив страницу поиска.  Для этого нам понадобится

  • IdHTTP
  • IXMLHttpRequest (библиотека MSXML_TLB)

Ну и конечно TButton, TLabel и так далее, с помощью TidHTTP - мы будем посылать запрос на сервер на фильм, которого нам необходимо получить, а IXMLHttpRequest нам понадобиться для работы с XML-данными, которые предоставляет нам КиноПоиск.РУ. Да конечно можно было и с помощью IXMLHttpRequest также послать запрос, а затем его обработать, но не будем мудрить.

КиноПоиск.РУ предоставляет следующие вид получения рейтинга — http://www.kinopoisk.ru/rating/507.xml и так для каждого фильма, только необходимо знать его идентификатор, в нашем случае мы его парсим (то есть получаем его)

Про работу с библиотекой MSXML_TLB я прочитал на блоге WebDelphi. Там автор довольно подробно описал возможности по работе с XML-данными с помощью это библиотеки, причем без использования Indy, Synapse для получения данных с сервера. Поэтому рассказывать подробно как и что про данную библиотеку не буду, хочу добавить одно, что в Delphi 7, по крайней мере у меня, подключив модуль в uses MSXML_TLB будет выдавать ошибку, что не найден модуль, поэтому, чтобы эту библиотеку создать необходимо выполнить следующее Project-Import Type Library и в появившемся окне находим там библиотеку — Microsoft XML, version 2.0 (Version 2.0), если ее выделить, то можно увидеть какие классы в нее входят, далее в данном же окне нажимаем на «Create Unit» тут же будет создан модуль MSXML_TLB, которые можно теперь безо всяких проблем подключать в uses.

Теперь давайте вернемся к нашему рейтингу фильмов. Тут также есть еще один небольшой нюанс, если мы будем использовать Indy, которые по умолчанию в Delphi 7, а также User-Agen, который по умолчанию стоит, то мы не сможет послать запрос, так как КиноПоиск.РУ просто посчитает нас роботом, для этого необходимо свойство User-Agent заполнить следующим

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.55 Safari/533.4

Чтобы получить XML с помощью IXMLHttpRequest необходимо написать следующий код

procedure TForm1.Button1Click(Sender: TObject);
var
 PostData:TStringList;
 logIMDB,ratingKP,url,ratingIBDM:WideString;
 req: IXMLHttpRequest;
 XMLpage:String;
begin
   try
    PostData:=TStringList.Create;
    PostData.Clear;
    PostData.Add('first=no');
    PostData.Add('kp_query='+AnsiToUtf8(Edit1.Text));
    logIMDB:=IdHTTP1.Post('http://kinopoisk.ru/index.php',PostData);
    PostData.Free;
    if pos('К сожалению, по вашему запросу ничего не найдено...',logIMDB)<>0 then
     begin
      exit;
     end;
    if pos('/level/1/film/',logIMDB)<>0 then
     begin
      Delete(logIMDB,1,pos('/level/1/film/',logIMDB)+length('/level/1/film/')-1);
      Delete(logIMDB,pos('/sr/1/',logIMDB),length(logIMDB));
      req := {$IFDEF VER210}CoXMLHTTP{$ELSE}CoXMLHTTPRequest{$ENDIF}.Create;
      url:='http://www.kinopoisk.ru/rating/'+logIMDB+'.xml';
      req.open('GET', url, false, EmptyParam, EmptyParam);
      req.send(EmptyParam);
      XMLpage:=req.responseText;
      ShowMessage(XMLpage);
     end
    else
     exit;
   except
    on e:Exception do
     PostData.Free;
   end;
end;

Чтобы получить с помощью TIdHTTP напишем следующий код

procedure TForm1.Button1Click(Sender: TObject);
var
 PostData:TStringList;
 logIMDB,ratingKP,url,ratingIBDM:WideString;
 XMLpage:String;
begin
   try
    PostData:=TStringList.Create;
    PostData.Clear;
    PostData.Add('first=no');
    PostData.Add('kp_query='+AnsiToUtf8(Edit1.Text));
    logIMDB:=IdHTTP1.Post('http://kinopoisk.ru/index.php',PostData);
    PostData.Free;
    if pos('К сожалению, по вашему запросу ничего не найдено...',logIMDB)<>0 then
     begin
      exit;
     end;
    if pos('/level/1/film/',logIMDB)<>0 then
     begin
      Delete(logIMDB,1,pos('/level/1/film/',logIMDB)+length('/level/1/film/')-1);
      Delete(logIMDB,pos('/sr/1/',logIMDB),length(logIMDB));
      url:='http://www.kinopoisk.ru/rating/'+logIMDB+'.xml';
      XMLpage:=IdHTTP1.Get(url);
      ShowMessage(XMLpage);
     end
    else
     exit;
   except
    on e:Exception do
     PostData.Free;
   end;
end;

Да и кстати с одного ip-адреса Вы сможете в течении 10 минут отправлять запросы порядка 20 не больше, после чего необходимо менять ip-адрес. Ну и также после того как вы получили результат останется Вам его только пропарсить

Исходники статьи качаем тут

Автор статьи - Andrey53

Метки: , , ,

Комментарии закрыты.