Здравствуйте, в этой статье я хотел бы поговорить как можно в своих проектах использовать рейтинг КиноПоиск.РУ. Да, конечно, самый простой способ — это отправить запрос на КиноПоиск, затем получить данные пропарсить, затем открыть найденную ссылку на фильм и там уже пропарсить (получить) рейтинг фильма. Но зачем так? если КиноПоиск.РУ предоставляет возможность получения рейтинга в xml-формате, что очень удобно парсить, нам для этого только остается узнать идентификатор фильма (его код, номер) — его можно получить пропарсив страницу поиска. Для этого нам понадобится
- IdHTTP
- IXMLHttpRequest (библиотека MSXML_TLB)
Ну и конечно TButton, TLabel и так далее, с помощью TidHTTP - мы будем посылать запрос на сервер на фильм, которого нам необходимо получить, а IXMLHttpRequest нам понадобиться для работы с XML-данными, которые предоставляет нам КиноПоиск.РУ. Да конечно можно было и с помощью IXMLHttpRequest также послать запрос, а затем его обработать, но не будем мудрить.
КиноПоиск.РУ предоставляет следующие вид получения рейтинга — https://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('https://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:='https://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('https://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:='https://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-адрес. Ну и также после того как вы получили результат останется Вам его только пропарсить