парсинг на файл

 
0
 
Delphi, Kylix and Pascal
ava
Volkogriz | 20.02.2013, 00:41
Доброго времени суток!
Помогите разобраться с парсингом

Вот код куска странички:


 <div class="player">
                                                                                                
                        <div id="player">
                            <div class="no-flash">
                                <a href="http://get.adobe.com/flashplayer" target="_blank" rel="nofollow"><img src="http://st.kinopod.ru/images/flash-player.png" alt="Adobe Flash Player" width="128" height="128" /></a>
                                <p>Для онлайн просмотра необходим <a href="http://get.adobe.com/flashplayer" target="_blank" rel="nofollow">Adobe Flash Player</a> последней версии</p>
                            </div>
                            
                            <script type="text/javascript" src="http://st.kinopod.ru/js/swfobject.js"></script>
                            <script type="text/javascript">
                            var player = new SWFObject('http://st.kinopod.ru/media/player.swf?v=12', 'mediaplayer', '640', '480', '9', '#000000');
                            player.addParam('allowfullscreen', 'true');
                            player.addParam('allowscriptaccess', 'always');
                            player.addParam('wmode', 'opaque');
                            player.addVariable('javascriptid', 'mediaplayer');
                                                        player.addVariable('file', 'http://master.flvstorage.com/get/e25b9238630f47fb07ea2dbb4e88c284/v1/2011/08/21/15243-4gr8.flv');
                                                        player.addVariable('type', 'http');
                                                        player.addVariable('image', 'http://img.kinopod.org/data/2013/01/17/96/m48z1x-640x480.jpg');
                                                        player.addVariable('autostart', 'false');
                            player.addVariable('bufferlength', '10');
                            player.addVariable('duration', '0');
                                                        player.addVariable('skin', 'http://st.kinopod.ru/media/skins/newtubedark_v1.zip');
                            
                            player.addVariable('logo.file', 'http://st.kinopod.ru/images/logo-small.png');
                            player.addVariable('logo.link', 'http%3A%2F%2Fkinopod.ru%2Fvideo.html%3Fid%3D17833');
                            player.addVariable('logo.linktarget', '_blank');
                            player.addVariable('logo.position', 'top-left');
                            player.addVariable('logo.timeout', 10);
                            player.addVariable('logo.about_title', 'KinoPod.ru - Каталог онлайн фильмов');
                            player.addVariable('logo.about_link', 'http://kinopod.ru');
                            
                                                        
                                                        player.addVariable('plugins', 'http://st.kinopod.ru/media/plugins/sharing_v2.swf,http://st.kinopod.ru/media/plugins/stat.swf,http://st.kinopod.ru/media/plugins/feed_v5.swf');
                                                        
                            player.addVariable('stat.link', 'http%3A%2F%2Fkinopod.ru%2Fvideos%2Fstats%2F17833.html');

                                                        player.addVariable('sharing_v2.code', '%3Ciframe+src%3D%22http%3A%2F%2Fkinopod.ru%2Fplayer.html%3Fid%3D17833%26width%3D640%26height%3D480%22+width%3D%22640%22+height%3D%22480%22+frameborder%3D%220%22+scrolling%3D%22no%22%3E%3C%2Fiframe%3E');
                            player.addVariable('sharing_v2.link', 'http%3A%2F%2Fkinopod.ru%2Fvideo.html%3Fid%3D17833');
                            player.addVariable('sharing_v2.title', '%D0%A1%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D1%82%D1%8C+%22%D0%9A%D1%83%D0%BD%D0%B3-%D1%84%D1%83+%D0%9F%D0%B0%D0%BD%D0%B4%D0%B0%C2%A02%22+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD+%D0%BD%D0%B0+KinoPod.ru');
                            player.addVariable('sharing_v2.image', 'http%3A%2F%2Fimg.kinopod.org%2Fdata%2F2013%2F01%2F17%2F96%2Fm48z1x-250x250.jpg');
                            
                                            
                                                                                                                                            player.addVariable('feed_v5.adlabs.fs_bottom', '30');
                            player.addVariable('feed_v5.adlabs.fs_url', 'aHR0cDovL2x1eHVwLnJ1L3Nob3cvMTY3NDY3Lz9kaXY9WG1s');
                                                                                    player.addVariable('feed_v5.marketgid.fs_bottom', '30');
                            player.addVariable('feed_v5.marketgid.fs_url', 'aHR0cDovL2FoLmdvb2RzYmxvY2suZHQwMC5uZXQvai83ODQzLw==');
                                                                                    player.addVariable('feed_v5.visitweb.fs_bottom', '30');
                            player.addVariable('feed_v5.visitweb.fs_url', 'aHR0cDovL3Zpc2l0d2ViLmNvbS92LzEwNzUz');
                                                                                    player.addVariable('feed_v5.teasernet.fs_bottom', '30');
                            player.addVariable('feed_v5.teasernet.fs_url', 'aHR0cDovL2VjaG8udGVhc2VybmV0LmNvbS9mZWVkLnBocD9wPTIwNTgyNiZiPTQyNjkyMiZjPTMmaXA9e2lwX2FkZHJ9JnVhPXt1c2VyX2FnZW50fSZwYWdlPXtwYWdlX3VybH0mcmVmPXtyZWZ9JmNoYXJzZXQ9dXRmLTgmcz0yMDAmbGFuZz1ydQ==');
                                                        player.addVariable('feed_v5.feeds', 'adlabs,marketgid,visitweb,teasernet');
                            player.addVariable('feed_v5.ip_addr', '95.72.248.150');
                            player.addVariable('feed_v5.user_agent', 'Mozilla%2F5.0+%28Windows+NT+5.1%3B+rv%3A18.0%29+Gecko%2F20100101+Firefox%2F18.0');
                            player.addVariable('feed_v5.page_url', 'http%3A%2F%2Fkinopod.ru%2Fvideo.html%3Fid%3D17833');
                            player.addVariable('feed_v5.ref', 'http%3A%2F%2Fkinopod.ru%2Fgenre%2Fcartoon.html%3Fpage%3D3');
                            player.addVariable('feed_v5.timeout', '10');
                                                        
                            player.write('player');
                            </script>
                        </div>
                                                                                    </div>
                                
                <script type="text/javascript">



от сюда:

player.addVariable('file', 'http://master.flvstorage.com/get/e25b9238630f47fb07ea2dbb4e88c284/v1/2011/08/21/15243-4gr8.flv');

Надо вытащить эту ссылку:

http://master.flvstorage.com/get/e25b9238630f47fb07ea2dbb4e88c284/v1/2011/08/21/15243-4gr8.flv

Дошёл до психа, всё что пробовал в обще не работает или выдаёт полный код страницы(
Сам запутался но и теперь в обще не чего не понимаю.
google не чего не выдаёт толкового!
Помогите плиз понять как это сделать, дайте простенький пример.
За ранее благодарен!
С уважением,
Volkogriz!

Ответы (15)
ava
Данкинг | 20.02.2013, 00:32 #
Для примера сначала нужно одинарные кавычки поменять на двойные. Будем считать, что это сделано:
player.addVariable("file", "http://master.flvstorage.com/get/e25b9238630f47fb07ea2dbb4e88c284/v1/2011/08/21/15243-4gr8.flv");


function getwordnum(slovo,razd,nomer: string): string;
var i,c,int1,int2:integer;
res,ss:string;
begin
result:=slovo;
if (length(trim(slovo))=0) or (length(trim(razd))<>1)then exit;
slovo:=trim(razd)+trim(slovo)+trim(razd);
c:=0;
int1:=0;
int2:=0;
for i:=1 to length(slovo) do
begin
  ss:=copy(slovo,i,1);
  if ss=razd then
    begin
     inc(c);
     if c=strtoint(nomer) then int1:=i;
     if c=strtoint(nomer)+1 then int2:=i;
    end;
end;
result:=copy(slovo,int1+1,int2-int1-1);
end;

procedure TForm1.FormCreate(Sender: TObject);
var ss:string;
begin
ss:='player.addVariable("file", "http://master.flvstorage.com/get/e25b9238630f47fb07ea2dbb4e88c284/v1/2011/08/21/15243-4gr8.flv");';
ss:=getwordnum(ss,',','2');
ss:=stringreplace(ss,'"','',[rfReplaceAll]);
ss:=stringreplace(ss,');','',[]);
showmessage(ss);
end;
ava
Чучмек | 20.02.2013, 01:23 #
Цитата (Данкинг @  20.2.2013,  00:32 findReferencedText)
нужно одинарные кавычки поменять на двойные

Зачем?
ava
Volkogriz | 20.02.2013, 01:58 #
Спасибо!
Я кстате менял не катит)))
Весь скрипт рисует)
Вот так нормально: '''' )
Четыре нормальные)
ava
Чучмек | 20.02.2013, 02:33 #

var
s,sr:string;
p,pr:pchar;
const
cpl='player.addVariable(';
cfi='file';
begin
s:=Memo1.Text; //код страницы
p:=PChar(s);
repeat
p:=StrPos(p,cpl);
if p=nil then break;
p:=p+length(cpl);
while p^=#32 do inc(p); //#32 - пробел; #39 - '; #34 - ";
if ((p^=#39) or (p^=#34)) and (0=StrLComp(p+1,cfi,length(cfi))) and (p^=(p+1+length(cfi))^) then
  begin
  p:=p+2+length(cfi);
  while p^=#32 do inc(p);
  if p^=',' then
   begin
   inc(p);
   while p^=#32 do inc(p);
   if (p^=#39) or (p^=#34) then
    begin
    inc(p);
    pr:=p;
    while (p^<>#0) and (p^<>(pr-1)^) do inc(p);
    if sr<>'' then sr:=sr+#13#10;
    sr:=sr+copy(pr,1,cardinal(p)-cardinal(pr));
    end;
   end;
  end;
until p^=#0;
memo2.Text:=sr; //список ссылок
end;
ava
Данкинг | 20.02.2013, 10:24 #
Цитата (Чучмек @  20.2.2013,  02:23 findReferencedText)
Зачем? 

Для данного примера, я же говорю.
ava
Volkogriz | 20.02.2013, 14:26 #
Я разобрался с горем пополам )
Благодаря вашему примеру Данкинг!
А то бы ещё неделю сидел, я запутался так что даже интерес пропал)))
И тут всё как по волшебству решилось))
С уважением,
Volkogriz!
ava
Данкинг | 20.02.2013, 15:57 #
Volkogriz, да всё элементарно же, как оказалось. smile 
ava
Keeper89 | 21.02.2013, 01:15 #
Господа, вы знаете толк в извращениях!

...

uses
  RegularExpressions, RegularExpressionsCore;

{$R *.dfm}

procedure GetLinks(const HTMLCode: string; out SL: TStringList);
const
  REG_EX_PATTERN = 'player\.addVariable\(''file'', ''(.+)''\);';
var
  MC: TMatchCollection;
  M: TMatch;
begin
  Assert(Assigned(SL));
  SL.Clear;

  try
    MC := TRegEx.Matches(HTMLCode, REG_EX_PATTERN, [roIgnoreCase, roMultiLine]);
    if MC.Count = 0 then
      Exit;

    for M in MC do
      SL.Add(M.Groups[1].Value);
  except
    on E: ERegularExpressionError do
    begin
      // Ошибки в синтаксисе рег. выражения
    end;
  end;

end;

procedure TForm1.FormDblClick(Sender: TObject);
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    // В mmo1.Text лежит HTML

    GetLinks(mmo1.Text, SL);
    mmo1.Lines.Assign(SL);
  finally
    FreeAndNil(SL);
  end;
end;

ava
Чучмек | 21.02.2013, 10:24 #
Keeper89, Regular... не всегда был в дельфе.
ava
Akella | 21.02.2013, 10:35 #
Слово "парсинг" (синтаксический анализ) у программиста должно ассоциироваться с регулярными выражениями.



Добавлено позднее:
Цитата (Чучмек @ 21.2.2013,  10:24)
Keeper89, Regular... не всегда был в дельфе.

всегда были другие варианты


и их немало, хвала небесам smile
http://forum.vingrad.ru/forum/topic-258533.html
ava
Данкинг | 21.02.2013, 12:40 #
ИЧСХ мой вариант наиболее наглядный и понятный. С регулярками вообще не знаком, а эту getwordnum постоянно использую. smile 
ava
Akella | 21.02.2013, 12:43 #
Цитата (Данкинг @  21.2.2013,  12:40 findReferencedText)
мой вариант наиболее наглядный и понятный


это всё потому, что

Цитата (Данкинг @  21.2.2013,  12:40 findReferencedText)
С регулярками вообще не знаком



 smile 
ava
Keeper89 | 21.02.2013, 14:30 #
Цитата (Данкинг @  21.2.2013,  12:40 findReferencedText)
ИЧСХ мой вариант наиболее наглядный и понятный

Я бы не сказал - у меня всего несколько строчек и все, без кучи Pos и Copy, которые действительно нужно вкурить.

Добавлено позднее:
Цитата (Чучмек @  21.2.2013,  10:24 findReferencedText)
Regular... не всегда был в дельфе. 

Тот, что есть в Delphi сейчас, раньше был отдельно и спокойно ставится: http://www.regular-expressions.info/delphi.html
ava
Данкинг | 21.02.2013, 14:58 #
Цитата (Akella @  21.2.2013,  13:43 findReferencedText)
это всё потому, что

Ну, возможно, каждому своё.
ava
Companero | 03.05.2013, 12:00 #
Цитата (Volkogriz @  19.2.2013,  23:41 findReferencedText)
Помогите разобраться с парсингом

Зачем тебе вообще это все? smile Эта ссылка (http://master.flvstorage.com/get/e25b9238630f47fb07ea2dbb4e88c284/v1/2011/08/21/15243-4gr8.flv) генерируется Киноподом автоматически каждый раз для конкретного IPшника и файла, кроме того она действует ограниченное время, просто вставить её в свой плеер не получится smile Неужели ты считаешь их такими глупенькими? Кинопод платит Flvstorage'у
Цитата


The price will be the same for all $ 0.5 - 1 GB / month for space and an additional $ 0.01 - 1 GB for traffic


думаешь ему еще нужны халявщики, за трафик которых он будет платить?
Забей, тут уже дураков нет, или держишь свои мощные серваки с видеоконтентом, или втыкаешь коды сторонних плееров, которые это позволяют, типа DailyMotion'а.
А если будет место на серваке, то можно все-таки немного кидануть кинопод и скачать у него уже сконвертированные видяшки, сначала сделать файл со страницами нужных видео:

http://kinopod.tv/serials/episode/4623.html
http://kinopod.tv/serials/episode/4632.html
http://kinopod.tv/serials/episode/4640.html
http://kinopod.tv/serials/episode/4647.html

затем на пыхе накидать грабилку

grab();

function grab()
{
    $links = file("links_igra1.txt");
    $out = fopen("flv_links.sh", "a");
    foreach ($links as $url) {
        $link = get_page(trim($url));
        fwrite($out, "wget $link".PHP_EOL."sleep(10)".PHP_EOL);
        sleep(1);
    }
    fclose($out);
}

function get_page($url)
{
    $ch = curl_init();
    curl_setopt($ch ,CURLOPT_URL , $url);
    $user_cookie_file = '/var/www/tmp/video_cookies.txt';
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1");
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $user_cookie_file);
    curl_setopt($ch, CURLOPT_COOKIEJAR,  $user_cookie_file);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
    $content = curl_exec($ch);
    $pos = strpos($content, "player.addVariable('file', '"); //Без всяких регов :)
    $end = strpos($content, "');", $pos);
    $link = substr($content, $pos+28, $end-$pos-28);
    return $link;
}

он сделает shell скрипт вида

wget http://master.flvstorage.com/get/53847eb293b079178300092d84538b1e/v2/2011/12/07/18306-eymo.flv
sleep(10)
wget http://master.flvstorage.com/get/53847eb293b079178300092d84538b1e/v2/2011/12/07/18306-b9s9.flv
sleep(10)
wget http://master.flvstorage.com/get/53847eb293b079178300092d84538b1e/v2/2011/12/07/18306-dcpr.flv
sleep(10)
wget http://master.flvstorage.com/get/53847eb293b079178300092d84538b1e/v2/2011/12/07/18306-cy6u.flv
sleep(10)
wget http://master.flvstorage.com/get/53847eb293b079178300092d84538b1e/v2/2011/12/07/18306-l24v.flv
sleep(10)

который уже можно зарядить на ночь на закачку smile Аукционный сервер у Хетцнера с 4Тб дисками можно взять за 40 евро в месяц, не так уж много, если ты серьезно собираешься раскручивать свой видеосервис и зарабатывать на нем деньги.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить