Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Сбор информации с сайта и ее обработка. (http://forum.oszone.net/showthread.php?t=148278)

Medic84 18-08-2009 13:17 1196578

Сбор информации с сайта и ее обработка.
 
Собственно хочу добавить в программу сбор информации о ЛЮБОМ фильме с портала Кинопоиск, да еще и так что бы работало все время правильно. Вот список для сбора.
Код:

<tr><td>
        <h1 style="margin: 0; padding: 0" class="moviename-big">Бросок кобры&nbsp;</h1>
      </td></tr>
      <tr><td>
        <table style="width: 100%; border: none" cellspacing=0 cellpadding=0>
        <tr>
        <td style="width: 100%">
            <span style="color: #666; font-size: 13px">G.I. Joe: The Rise of Cobra</span>
        </td>

Код:

<tr><td class="type">год</td><td class=""><a href="/level/10/m_act%5Byear%5D/2009/">2009</a></td></tr>


  <tr><td class="type">страна</td><td class=""><a href="/level/10/m_act%5Bcountry%5D/3/">США</a></td></tr>


  <tr><td class="type">слоган</td><td>&laquo;Когда остальные сдаются, они идут до конца&raquo;</td></tr>
  <tr><td class="type">режиссер</td><td><a href="/level/4/people/23076/">Стивен Соммерс</a></td></tr>

Код:

<tr><td class="type">жанр</td><td><a href="/level/10/m_act%5Bgenre%5D/2/">фантастика</a>, <a href="/level/10/m_act%5Bgenre%5D/3/">боевик</a>, <a href="/level/10/m_act%5Bgenre%5D/4/">триллер</a>, <a href="/level/10/m_act%5Bgenre%5D/10/">приключения</a></td></tr>

  <tr><td class="type">бюджет</td><td class="dollar"><a href="/level/85/film/397496/">$175&nbsp;000&nbsp;000</a></td></tr>

Код:

<tr><td class="type">сборы в мире</td><td class="dollar"><a href="/level/85/film/397496/">+&nbsp;$91&nbsp;500&nbsp;000&nbsp;=&nbsp;$190&nbsp;077&nbsp;529</a></td></tr>
Код:

<tr><td class="type">премьера (мир)</td><td class="calendar"><a href="/level/80/film/397496/">5 августа 2009</a></td></tr>

  <tr><td class="type">премьера (РФ)</td><td class="calendar"> <a class='all' href='/level/8/view/prem/year/2009/#397496'>6 августа 2009</a>,&nbsp;<a href='/level/10/m_act[company]/7/' class='all'>&laquo;Централ Партнершип&raquo;</a></td></tr>

Код:

<tr><td class="type">время</td><td>118 мин.</td></tr>
Код:

<tr><td colspan=3 style="padding:10px;padding-left:20px;" class="news">
                        <span class="_reachbanner_">Базирующееся в&nbsp;Египте высокотехнологичное международное военное подразделение, известное как&nbsp;G.I. Joe, противостоит зловещей корпорации, руководимой знаменитым оружейным бароном.</span>
                </td></tr>

Код:

<div style="color: #f60; font-family: tahoma; font-size: 25px"><a href="/level/83/film/397496/" class="continue" style="background: url(/images/dot_or.gif) 0 93% repeat-x; font-weight: normal !important; text-decoration: none">7.047<span style="font:100 14px tahoma, verdana">&nbsp;&nbsp;4163</span></a>
</div>

Код:

<div style="color:#999;font:100 11px tahoma, verdana">IMDB: 6.10 (12 210)</div><div style="color:#999;font:100 11px tahoma, verdana">ожидание: <a href="/level/53/" style='color:#999;font:100 11px tahoma, verdana; text-decoration:underline;'>64%</a> (8 014)</div>
  </div>

Жирным и подчеркнутым отмечено то что нужно вырвать

Я набросал кое что. Но не думаю что у меня правильно получилось :( (Честно говоря мне с трудом даются SringRegExpReplase и др.)
Код:

Func _Get()
$Sourse = _INetGetSource ($URL)
$sName = StringRegExpReplace($Sourse, '<h1 style=".*" class=".*">(.*)</h1>.*', '\1')
$sName = StringReplace($sName, '&nbsp;', ' ')
$sOriginal = StringRegExpReplace($Sourse,'<span style="color: #666; font-size: 13px">(.*)</span>', '\1')
$sGod = StringRegExpReplace($Sourse,'<tr><td class="type">год</td><td class=""><a href=".*">.(.*)</a></td></tr>', '\1')
$sStrana = StringRegExpReplace($Sourse,'<tr><td class="type">страна</td><td class=""><a href=".*">(.*)</a></td></tr>', '\1')
$sSlogan = StringRegExpReplace($Sourse,'<tr><td class="type">слоган</td><td>(.*)</td></tr>','\1')
$sSlogan = StringReplace($sName, '&raquo;', '"')
$sRejisser =StringRegExpReplace($Sourse,'<tr><td class="type">режиссер</td><td><a href=".*">(.*)</a></td></tr>','\1')
$sJanr = StringRegExp($Sourse,'<tr><td class="type">жанр</td><td><a href=".*">(.*)</a>.*',)
$sSbory = StringRegExpReplace($Sourse,,'\1')
$sMir =StringRegExpReplace($Sourse,,'\1')
$sRF = StringRegExpReplace($Sourse,,'\1')
$sTime = StringRegExpReplace($Sourse,,'\1')
$sKratk = StringRegExpReplace($Sourse,,'\1')
$sRait = StringRegExpReplace($Sourse,,'\1')
$sIdmb = StringRegExpReplace($Sourse,,'\1')
$sBudget = StringRegExpReplace($Sourse, '<tr><td class="type">бюджет</td><td class=".*"><a href=".*">(.*)</a>.*', '\1')
$sBudget = StringReplace($sBudget, '&nbsp;', ' ')
EndFunc

Запнулся(и упал + сломал думалку:)) на жанре т.к. их там несколько и не смог вырвать...

Creat0R 18-08-2009 15:17 1196676

Цитата:

$Sourse = _INetGetSource ($URL)
А где ссылка?

Medic84 18-08-2009 15:31 1196685

Извиняюсь..
Код:

http://www.kinopoisk.ru/level/1/film/397496/
Вот ссылка

Creat0R 18-08-2009 16:04 1196712

Medic84, На будущее, всегда выкладывай рабочий пример, в твоём коде также нехватает инклюда Inet.au3.

Цитата:

Цитата Medic84
Вот ссылка »

По этой ссылке нужно делать запрос, там так просто через исходник не получить нужную страничку.


P.S
А в чём смысл замены пробела на пробел? :)

Medic84 18-08-2009 16:11 1196720

Цитата:

Цитата Creat0R
P.S
А в чём смысл замены пробела на пробел? »

Да это форум обрабатывает Html код там написанный. Там по идее & nbsp; Только без пробела

Цитата:

Цитата Creat0R
По этой ссылке нужно делать запрос, там так просто через исходник не получить нужную страничку. »

Всмысле? Что за запрос?
Цитата:

Цитата Creat0R
На будущее, всегда выкладывай рабочий пример, в твоём коде также нехватает инклюда Inet.au3. »

Хорошо :)

Creat0R 18-08-2009 16:20 1196731

Цитата:

Цитата Medic84
Всмысле? Что за запрос? »

Ну а как ты получаешь исходник того, что видишь в браузере? Попробуй сохранить $Source в файл «test.html» и запустить его, у меня лично страница с запросом поиска не получается...

Medic84 18-08-2009 16:27 1196741

В опере нажимаю "Исходный код".
Думаешь через IE нужно страницу сохранять?

З.Ы.
А ты пробовал слеш убирать? :)

Creat0R 18-08-2009 17:34 1196799

Цитата:

Цитата Medic84
А ты пробовал слеш убирать? »

Пробовал, тоже самое.

Вобщем вот рабочий вариант получения информации о фильме по ссылке. Исходник добывается извращённым путём - через скрытую инстанцию браузера IE :)

Код:

#include <IE.au3>

$sURL = "http://www.kinopoisk.ru/level/1/film/333416/"

$sURL = InputBox("Kinopoisk.ru Informer", "Введите ссылку на фильм для получения информации:", $sURL, "", 350, 200)
If @error Then Exit

$oIE = _IECreate($sURL, 0, 0)
$sSource = _IEDocReadHTML($oIE)
_IEQuit($oIE)

$sName = _GetSourceProperty($sSource, '', '(?si).*?<h1 class=moviename-big.*?>(.*?)</h1>.*')
$sSlogan = _GetSourceProperty($sSource, 'слоган')
$sBudget = _GetSourceProperty($sSource, 'бюджет')
$sYear = _GetSourceProperty($sSource, 'год')
$sCountry = _GetSourceProperty($sSource, 'страна')
$sDirector = _GetSourceProperty($sSource, 'режиссер')
$sUSA_Collect = _GetSourceProperty($sSource, 'сборы в США')
$sWorld_Collect = _GetSourceProperty($sSource, 'сборы в мире')
$sRus_Collect = _GetSourceProperty($sSource, 'сборы в России')
$sTime = _GetSourceProperty($sSource, 'время')

$aJanrs = StringRegExp($sSource, '.*?<A href="/level/10/.*?genre.*?">(.*?)</A>.*?', 3)
$sJanrs = ""
$iUbound = UBound($aJanrs)-1

For $i = 0 To $iUbound
    $sJanrs
&= $aJanrs[$i]
    If $i < $iUbound Then $sJanrs &= ", "
Next

$sInfo = StringFormat( _
    "Имя:\t\t\t%s\n" & _
    "Слоган:\t\t\t%s\n" & _
    "Бюджет:\t\t\t%s\n" & _
    "Год:\t\t\t%s\n" & _
    "Страна:\t\t\t%s\n" & _
    "Режиссер:\t\t%s\n" & _
    "Сборы в США:\t\t%s\n" & _
    "Сборы в мире:\t\t%s\n" & _
    "Сборы в России:\t\t%s\n" & _
    "Время:\t\t\t%s\n\n" & _
    "Жанр:\t\t\t%s", _
    $sName, $sSlogan, $sBudget, $sYear, $sCountry, $sDirector, $sUSA_Collect, $sWorld_Collect, $sRus_Collect, $sTime, $sJanrs)

MsgBox(64, 'Kinopoisk.ru Info', $sInfo)

;Функция для получения подстроки по заданному pattern
Func _GetSourceProperty($sSource, $sName, $sPattern='')
    Local $s_Pattern = '(?si).*?<TD class=type>%s</TD>.*?<TD(?: class=.*?|)>(?:<A href=".*?">|)(.*?)(?:</A>|)</TD></TR>.*'
    If $sPattern <> '' Then $s_Pattern = $sPattern

    $s_Pattern
= StringFormat($s_Pattern, $sName)

    Local $sRet = StringRegExpReplace($sSource, $s_Pattern, '\1')
    If @extended = 0 Then Return SetError(1, 0, "N/A")

    $sRet = StringReplace($sRet, '&nbsp;', ' ')
    $sRet = StringRegExpReplace($sRet, '\A«+|»+$', '"')

    Return $sRet
EndFunc


Medic84 18-08-2009 18:01 1196816

Если бы можно было оценку поставить поставил бы 10 баллов!

Medic84 18-08-2009 20:53 1196935

Хех. Пытался вставить свое и свое ничего не работает. Кроме краткого....
Причем в твоем скрипте "Имя" не работает.


Код:

#include <IE.au3>

$sURL = "http://www.kinopoisk.ru/level/1/film/5090/"

$sURL = InputBox("Kinopoisk.ru Informer", "Введите ссылку на фильм для получения информации:", $sURL, "", 350, 200)
If @error Then Exit

$oIE = _IECreate($sURL, 0, 0)
$sSource = _IEDocReadHTML($oIE)
_IEQuit($oIE)

$sName = _GetSourceProperty($sSource, '', '(?si).*?<h1 class=moviename-big>(.*?)</h1>.*')
$sSlogan = _GetSourceProperty($sSource, 'слоган')
$sBudget = _GetSourceProperty($sSource, 'бюджет')
$sYear = _GetSourceProperty($sSource, 'год')
$sCountry = _GetSourceProperty($sSource, 'страна')
$sMir = _GetSourceProperty($sSource, 'премьера (мир)')
$sRF = _GetSourceProperty($sSource, 'премьера (РФ)')
$sOriginal = _GetSourceProperty($sSource, '','?si).*?<span style="color:.*? font-size:.*?">(.*?)</span>.*')
$sDirector = _GetSourceProperty($sSource, 'режиссер')
$sWorld_Collect = _GetSourceProperty($sSource, 'сборы в мире')
$sTime = _GetSourceProperty($sSource, 'время')
$aJanrs = StringRegExp($sSource, '.*?<A href="/level/10/.*?genre.*?">(.*?)</A>.*?', 3)
$sJanrs = ""
$Kratk = _GetSourceProperty($sSource, '','(?si).*?<span class=_reachbanner_.*?>(.*?)</span>.*')
$Kratk = StringReplace($Kratk,"<BR>",@CRLF)
$iUbound = UBound($aJanrs)-1
For $i = 0 To $iUbound
    $sJanrs
&= $aJanrs[$i]
    If $i < $iUbound Then $sJanrs &= ", "
    Next

$sInfo = StringFormat( _
    "Имя:\t\t\t%s\n" & _
    "Слоган:\t\t\t%s\n" & _
    "Бюджет:\t\t\t%s\n" & _
    "Год:\t\t\t%s\n" & _
    "Страна:\t\t\t%s\n" & _
    "Режиссер:\t\t%s\n" & _
    "Премьера (Мир):\t\t%s\n" & _
    "Сборы в мире:\t\t%s\n" & _
    "Премьера (РФ):\t\t%s\n" & _
    "Время:\t\t\t%s\n\n" & _
    "Жанр:\t\t\t%s", _
    $sName, $sSlogan, $sBudget, $sYear, $sCountry, $sDirector, $sMir, $sWorld_Collect, $sRF, $sTime, $sJanrs)

MsgBox(64, 'Kinopoisk.ru Info', $sInfo)

;Функция для получения подстроки по заданному pattern
Func _GetSourceProperty($sSource, $sName, $sPattern='')
    Local $s_Pattern = '(?si).*?<TD class=type>%s</TD>.*?<TD(?: class=.*?|)>(?:<A href=".*?">|)(.*?)(?:</A>|)</TD></TR>.*'
    If $sPattern <> '' Then $s_Pattern = $sPattern

    $s_Pattern
= StringFormat($s_Pattern, $sName)

    Local $sRet = StringRegExpReplace($sSource, $s_Pattern, '\1')
    If @extended = 0 Then Return SetError(1, 0, "N/A")

    $sRet = StringReplace($sRet, '&nbsp;', ' ')
    $sRet = StringRegExpReplace($sRet, '\A«+|»+$', '"')

    Return $sRet
EndFunc

З.Ы. А что делать если несколько режисеров?

Creat0R 18-08-2009 23:17 1197060

Medic84,
Вот подправил:

Код:

#include <IE.au3>

$sURL = "http://www.kinopoisk.ru/level/1/film/5090"

$sURL = InputBox("Kinopoisk.ru Informer", "Введите ссылку на фильм для получения информации:", $sURL, "", 350, 200)
If @error Then Exit

$oIE = _IECreate($sURL, 0, 0)
$sSource = _IEDocReadHTML($oIE)
_IEQuit($oIE)

$sName = _GetSourceProperty($sSource, '', '(?si).*?<h1 class=moviename-big.*?>(.*?)</h1>.*')
$sSlogan = _GetSourceProperty($sSource, 'слоган')
$sBudget = _GetSourceProperty($sSource, 'бюджет')
$sYear = _GetSourceProperty($sSource, 'год')
$sCountry = _GetSourceProperty($sSource, 'страна')
$sWorld_Primier = _GetSourceProperty($sSource, 'премьера (мир)')
$sRF_Primier = _GetSourceProperty($sSource, 'премьера (РФ)')
$sOriginal = _GetSourceProperty($sSource, '', '(?si).*?<span style="color:.*? font-size:.*?">(.*?)</span>.*')
$sDirector = _GetSourceProperty($sSource, 'режиссер')
$sWorld_Collect = _GetSourceProperty($sSource, 'сборы в мире')
$sTime = _GetSourceProperty($sSource, 'время')
$Kratk = _GetSourceProperty($sSource, '', '(?si).*?<span class=_reachbanner_.*?>(.*?)</span>.*')
$sJaners = _GetSourceProperty($sSource, 'жанр')

$sInfo = StringFormat( _
    "Имя:\t\t\t%s\n" & _
    "Слоган:\t\t\t%s\n" & _
    "Бюджет:\t\t\t%s\n" & _
    "Год:\t\t\t%s\n" & _
    "Страна:\t\t\t%s\n" & _
    "Режиссер:\t\t%s\n" & _
    "Премьера (Мир):\t\t%s\n" & _
    "Сборы в мире:\t\t%s\n" & _
    "Премьера (РФ):\t\t%s\n" & _
    "Время:\t\t\t%s\n" & _
    "Жанр:\t\t\t%s", _
    $sName, $sSlogan, $sBudget, $sYear, $sCountry, $sDirector, $sWorld_Primier, $sWorld_Collect, $sRF_Primier, $sTime, $sJaners)

MsgBox(64, 'Kinopoisk.ru Info', $sInfo)

;Функция для получения подстроки по заданному pattern
Func _GetSourceProperty($sSource, $sName, $sPattern = '')
    Local $s_Pattern = _
        '(?si).*?<TD class=type>%s</TD>.*?<TD(?: class=.*?|)>' & _
        '(?:<A(?: class=.*?|) href=".*?">|)(.*?)(?:</A>|)</TD></TR>.*'

    If $sPattern <> '' Then $s_Pattern = $sPattern
    $s_Pattern
= StringFormat($s_Pattern, "\Q" & $sName & "\E")

    Local $sRet = StringRegExpReplace($sSource, $s_Pattern, '\1')
    If @extended = 0 Then Return SetError(1, 0, "N/A")

    $sRet = _ContentReplaceTags($sRet, 2)
    $sRet = StringRegExpReplace($sRet, '«+|»+', '"')

    Return $sRet
EndFunc

Func
_ContentReplaceTags($sString, $iCorrect=-1)
    Local $aCorrects_Arr[8][2] = [[7], _
        [
'&qu' & 'ot;', '"'], ['&a' & 'mp;', '&'], ['&' & '#39;', "'"], _
        [
'&ap' & 'os;', "'"], ['&g' & 't;', '>'], ['&l' & 't;', '<'], ['&nb' & 'sp;', ' ']]

    Local $sReplStr = '\\n'
    If $iCorrect = 2 Then $sReplStr = @CRLF

    Local $sRet_Content = StringRegExpReplace($sString, '(?i)<(/|)br(/| /|)>|\n|\r|\r\n', $sReplStr)
    $sRet_Content = StringRegExpReplace($sRet_Content, '(?si)<(/|)[abiu]( .*?|)>|<hr(/| /|)>', '')

    For $i = 1 To $aCorrects_Arr[0][0]
        $sRet_Content = StringReplace($sRet_Content, $aCorrects_Arr[$i][0], $aCorrects_Arr[$i][1])
    Next

    If
$iCorrect = 1 Then Return $sRet_Content

    Local $iCheckSpanPos = StringInStr($sRet_Content, '</s>')
    If $iCheckSpanPos > 0 Then $sRet_Content = StringTrimLeft($sRet_Content, $iCheckSpanPos)

    Return $sRet_Content
EndFunc

А что такое $sOriginal?

P.S
Кстати, кроме «& nbsp;» ещё могут встречаться и другие теги(?), у меня где то была функция для их полной замены...

Creat0R 19-08-2009 01:44 1197141

Цитата:

Цитата Creat0R
у меня где то была функция для их полной замены »

Вот она:

Код:

Func _ContentReplaceTags($sString, $iCorrect=-1)
    Local $aCorrects_Arr[8][2] = [[7], _
        [
'&qu' & 'ot;', '"'], ['&a' & 'mp;', '&'], ['&' & '#39;', "'"], _
        [
'&ap' & 'os;', "'"], ['&g' & 't;', '>'], ['&l' & 't;', '<'], ['&nb' & 'sp;', ' ']]

    Local $sReplStr = '\\n'
    If $iCorrect = 2 Then $sReplStr = @CRLF

    Local $sRet_Content = StringRegExpReplace($sString, '(?i)<(/|)br(/| /|)>|\n|\r|\r\n', $sReplStr)
    $sRet_Content = StringRegExpReplace($sRet_Content, '(?si)<(/|)[abiu]( .*?|)>|<hr(/| /|)>', '')

    For $i = 1 To $aCorrects_Arr[0][0]
        $sRet_Content = StringReplace($sRet_Content, $aCorrects_Arr[$i][0], $aCorrects_Arr[$i][1])
    Next

    If
$iCorrect = 1 Then Return $sRet_Content

    Local $iCheckSpanPos = StringInStr($sRet_Content, '</s>')
    If $iCheckSpanPos > 0 Then $sRet_Content = StringTrimLeft($sRet_Content, $iCheckSpanPos)

    Return $sRet_Content
EndFunc

Подправил свой пример выше.

Medic84 19-08-2009 09:23 1197243

Цитата:

Цитата Creat0R
А что такое $sOriginal? »

Оригинальное название фильма. Как правило для английских фильмов

Имя фильма поправил на
Код:

(?si).*?<h1 style=(?si).*?class=moviename-big.*?>(.*?)</h1>.*
Так как не определялось. Осталось самое сложное. И я отстану)))

1. Рейтинг фильма. IDMB я вставил сам, а вот с обычным рейтингом незадача.
Код:

<div style="color: #f60; font-family: tahoma; font-size: 25px"><a href="/level/83/film/392930/" class="continue" style="background: url(/images/dot_or.gif) 0 93% repeat-x; font-weight: normal !important; text-decoration: none">7.952<span style="font:100 14px tahoma, verdana">&nbsp;&nbsp;10591</span></a>
2. Добавление Актеров.
У меня есть Элемент List Хочу добавить актеров с помощью _GUICtrlListBox_AddString($roles_List, "Актер")
Код:

<tr><td style="height: 31px; text-align: right; border: none; padding-right: 10px"><span style="color: #f60">В главных ролях:</span></td></tr>
  <tr><td style="height: 10px"><br /></td></tr>
  <tr><td style="height: 100%; vertical-align: top; padding-right:10px">
      <table style="width: 100%; border: none" cellspacing=0 cellpadding=0>
      <tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/6464/" class="all">Джон Легуизамо</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/25385/" class="all">Куин Латифа</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/4092/" class="all">Денис Лири</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/41961/" class="all">Саймон Пегг</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/15869/" class="all">Джош Пек</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/35310/" class="all">Рэй Романо</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/297/" class="all">Шонн Уильям Скотт</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/1235771/" class="all">Карен Дишер</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/39391/" class="all">Крис Уэдж</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/4/people/687150/" class="all">Юнис Чо</a></td></tr>
<tr><td style="vertical-align: top; height: 15px" align=right><a href="/level/19/film/392930/" class="all">...</a></td></tr>

Вобщем нужно захватить всех актеров в массив после В главных ролях: и до троеточия (т.к. там еще актеры есть)

Creat0R 19-08-2009 16:12 1197572

Цитата:

Цитата Medic84
Имя фильма поправил на »

Цитата:

Цитата Medic84
Так как не определялось »

А у меня наоборот с твоим методом не определяется :). Попробуй так:

Код:

(?si).*?<h1.*?class=moviename-big.*?>(.*?)</h1>.*
Цитата:

Цитата Medic84
Осталось самое сложное »

Код:

#include <IE.au3>

$sURL = "http://www.kinopoisk.ru/level/1/film/89515"

$sURL = InputBox("Kinopoisk.ru Informer", "Введите ссылку на фильм для получения информации:", $sURL, "", 350, 200)
If @error Then Exit

$oIE = _IECreate($sURL, 0, 0)
$sSource = _IEDocReadHTML($oIE)
_IEQuit($oIE)

$sName = _GetSourceProperty($sSource, '', '(?si).*?<h1.*?class=moviename-big.*?>(.*?)</h1>.*')
$sOrigin_Name = _GetSourceProperty($sSource, '', '(?si).*?<span style="color:.*? font-size:.*?">(.*?)</span>.*')
$sSlogan = _GetSourceProperty($sSource, 'слоган')
$sBudget = _GetSourceProperty($sSource, 'бюджет')
$sYear = _GetSourceProperty($sSource, 'год')
$sCountry = _GetSourceProperty($sSource, 'страна')
$sWorld_Primier = _GetSourceProperty($sSource, 'премьера (мир)')
$sRF_Primier = _GetSourceProperty($sSource, 'премьера (РФ)')
$sDirector = _GetSourceProperty($sSource, 'режиссер')
$sWorld_Collect = _GetSourceProperty($sSource, 'сборы в мире')
$sTime = _GetSourceProperty($sSource, 'время')
$sJaners = _GetSourceProperty($sSource, 'жанр')
$sRaiting = _GetSourceProperty($sSource, '', '(?si).*?<A class=continue style=".*?" href=".*?">(.*?)<SPAN.*?>.*?</SPAN></A>.*')
$sIMDB_Raiting = _GetSourceProperty($sSource, '', '(?si).*?<DIV style=".*?">IMDB: (.*?)</DIV>.*')
$sDescription = _GetSourceProperty($sSource, '', '(?si).*?<span class=_reachbanner_.*?>(.*?)</span>.*')
$sActors = _GetSourceProperty($sSource, '', '(?si).*?В главных ролях:.*?<A class=all href=".*?">(.*?)\.\.\.</A></TD></TR>.*')
$sActors = StringRegExpReplace($sActors, '(\n\r)+|\A\s+|\s+$', '')

$sInfo = StringFormat( _
    "Имя:\t\t\t%s\n" & _
    "Оригин. Имя:\t\t\t%s\n" & _
    "Слоган:\t\t\t%s\n" & _
    "Бюджет:\t\t\t%s\n" & _
    "Год:\t\t\t%s\n" & _
    "Страна:\t\t\t%s\n" & _
    "Режиссер:\t\t%s\n" & _
    "Премьера (Мир):\t\t%s\n" & _
    "Сборы в мире:\t\t%s\n" & _
    "Премьера (РФ):\t\t%s\n" & _
    "Время:\t\t\t%s\n" & _
    "Жанр:\t\t\t%s\n" & _
    "Рейтинг:\t\t\t%s\n" & _
    "Рейтинг IMDB:\t\t%s\n\n" & _
    "[В главных ролях]:\n%s\n\n" & _
    "[Описание]:\n%s\n\n", _
    $sName, $sOrigin_Name, $sSlogan, $sBudget, $sYear, $sCountry, $sDirector, $sWorld_Primier, _
    $sWorld_Collect, $sRF_Primier, $sTime, $sJaners, $sRaiting, $sIMDB_Raiting, $sActors, $sDescription)

MsgBox(64, 'Kinopoisk.ru Info', $sInfo)

;Функция для получения подстроки по заданному pattern
Func _GetSourceProperty($sSource, $sName, $sPattern = '', $iGetArr=0)
    Local $s_Pattern = _
        '(?si).*?<TD class=type>%s</TD>.*?<TD(?: class=.*?|)>' & _
        '(?:<A(?: class=.*?|) href=".*?">|)(.*?)(?:</A>|)</TD></TR>.*'

    If $sPattern <> '' Then $s_Pattern = $sPattern
    If $sName <> '' Then $s_Pattern = StringFormat($s_Pattern, "\Q" & $sName & "\E")

    If $iGetArr = 0 Then
        Local
$sRet = StringRegExpReplace($sSource, $s_Pattern, '\1')
        If @extended = 0 Then Return SetError(1, 0, "N/A")
    Else
        Return
StringRegExp($sSource, $s_Pattern, 3)
    EndIf

    $sRet = _ContentReplaceTags($sRet, 2)
    $sRet = StringRegExpReplace($sRet, '«+|»+', '"')

    Return $sRet
EndFunc

Func
_ContentReplaceTags($sString, $iCorrect=-1)
    Local $aTags_Arr[8][2] = [[7], _
        [
'&qu' & 'ot;', '"'], ['&a' & 'mp;', '&'], ['&' & '#39;', "'"], _
        [
'&ap' & 'os;', "'"], ['&g' & 't;', '>'], ['&l' & 't;', '<'], ['&nb' & 'sp;', ' ']]

    Local $sReplStr = '\\n'
    If $iCorrect = 2 Then $sReplStr = @CRLF

    Local $sRet_Content = StringRegExpReplace($sString, '(?i)<(/|)br(/| /|)>|\n|\r|\r\n', $sReplStr)
    $sRet_Content = StringRegExpReplace($sRet_Content, '(?si)<(/|).*?>|<hr(/| /|)>', '')
    ;$sRet_Content = StringRegExpReplace($sRet_Content, '(?si)<(/|)[abiu]( .*?|)>|<hr(/| /|)>', '')

    For $i = 1 To $aTags_Arr[0][0]
        $sRet_Content = StringReplace($sRet_Content, $aTags_Arr[$i][0], $aTags_Arr[$i][1])
    Next

    If
$iCorrect = 1 Then Return $sRet_Content

    Local $iCheckSpanPos = StringInStr($sRet_Content, '</s>')
    If $iCheckSpanPos > 0 Then $sRet_Content = StringTrimLeft($sRet_Content, $iCheckSpanPos)

    Return $sRet_Content
EndFunc


Medic84 19-08-2009 16:34 1197594

Вложений: 1
Код:

;$sRet_Content = StringRegExpReplace($sRet_Content, '(?si)<(/|)[abiu]( .*?|)>|<hr(/| /|)>', '')
А что это за строчка? ее можно удалить?

И что то рейтинг не работает :(
И актеры это не массив :(
Выдает ошибку.

Вобще ерунда какая то. Программа вообще критическую ошибку выдает. И выдает отчет.... Посмотри пожалуйста если есть время. Там некоторые строчки с комментариями :)

Creat0R 20-08-2009 00:18 1197908

Вложений: 1
Цитата:

Цитата Medic84
Вобще ерунда какая то »

И вправду. Так кодить нельзя ;) Вот возвращаю тебе пофиксенный вариант, плюс пару поправок/улучшении.

Habetdin 18-08-2010 12:08 1476267

Цитата:

Цитата Creat0R
Kinopoisk.ru_Info_Collector.zip »

С нынешней версткой kinopoisk'а не работает получение списка актеров :(
читать дальше »
Код:

<!-- актеры фильма -->
<td class="actor_list">
  <span class="title">В главных ролях:</span>
  <span><a href="/level/4/people/20866/">Анджелина Джоли</a></span>
  <span><a href="/level/4/people/8453/">Лив Шрайбер</a></span>
  <span><a href="/level/4/people/33495/">Чиветел Эджиофор</a></span>
  <span><a href="/level/4/people/140922/">Даниэль Ольбрыхский</a></span>
  <span><a href="/level/4/people/2526/">Аугуст Диль</a></span>
  <span><a href="/level/4/people/65480/">Дэниэл Пирс</a></span>
  <span><a href="/level/4/people/157465/">Хант Блок</a></span>
  <span><a href="/level/4/people/12590/">Андре Брогер</a></span>
  <span><a href="/level/4/people/12641/">Олек Крупа</a></span>
  <span><a href="/level/4/people/44117/">Кэссиди Хинкль</a></span>
  <span><a href="/level/19/film/447284/">...</a></span>

  <span class="title">Роли дублировали:</span>
  <span><a href="/level/4/people/1646297/">Ольга Зубкова</a></span>
  <span><a href="/level/4/people/1079049/">Валерий Соловьев</a></span>
  <span><a href="/level/4/people/277374/">Станислав Концевич</a></span>

  <span class="title"><a href="/level/19/film/447284/">показать всех</a> &raquo;</span>
</td>
</tr>
<!-- /актеры фильма -->

Кстати, название фильма "правильнее собирается" вот так:
Код:

        $sName = _GetSourceProperty($sSource, '', '(?si).*?<h1.*?class=moviename-big.*?>(.*?)</h1>.*')
        If $sName <> 'N/A' Then
                $sName = StringReplace($sName, ' (видео)', '')
                $sName = StringReplace($sName, ' (ТВ)', '')
                $sName = StringTrimRight($sName, 1)
        EndIf
...
        $sJanrs = _GetSourceProperty($sSource, 'жанр')
        $sJanrs = StringReplace($sJanrs, ", ...", "")

А при сохранении файла нужно убрать "плохие" символы из имени:
Код:

        $fName = StringReplace($Name, '\', '')
        $fName = StringReplace($fName, '/', '')
        $fName = StringReplace($fName, ':', '')
        $fName = StringReplace($fName, '*', '')
        $fName = StringReplace($fName, '?', '')
        $fName = StringReplace($fName, '"', '')
        $fName = StringReplace($fName, '<', '')
        $fName = StringReplace($fName, '>', '')
        $fName = StringReplace($fName, '|', '')
        $hOpen = FileOpen($fName & ".txt", 2)

Коряво, конечно, но меня устраивает :)


Время: 20:14.

Время: 20:14.
© OSzone.net 2001-