Учитывая идентификатор фильма IMDB, как программно получить его изображение плаката?

идентификатор фильма tt0438097 можно найти вhttp://www.imdb.com/title/tt0438097/

каков url для его изображения плаката?

15 ответов


Как я уверен, вы знаете, фактический url для этого изображения

http://ia.media-imdb.com/images/M/MV5BMTI0MDcxMzE3OF5BMl5BanBnXkFtZTcwODc3OTYzMQ@@._V1._SX100_SY133_.jpg

вам будет трудно понять, как он генерируется, хотя, похоже, у них нет общедоступного API.

Screenscraping, вероятно, ваш лучший выбор.

изображение, как правило, находится внутри div с класс=Фото и имя a тег плакат.

само изображение находится внутри a тег.


проверить http://www.imdbapi.com/, он возвращает URL-адрес плаката в строке.

например, проверьте http://www.imdbapi.com/?i=&t=inception и вы получите адрес плаката:Poster":"http://ia.media-imdb.com/images/M/MV5BMjAxMzY3NjcxNF5BMl5BanBnXkFtZTcwNTI5OTM0Mw@@._V1._SX320.jpg"

обновление: похоже, у владельца сайта были некоторые споры с юридическим персоналом IMDB. Как упоминалось в исходном сайте, адрес нового сайтаhttp://www.omdbapi.com/


URL-это случайная строка, насколько я могу судить.

его все еще можно легко восстановить. Это единственное img внутри якоря с именем poster.

Итак, если Вы читаете источник, просто искать <a name="poster" и это будет текст после первого src=" оттуда.

однако вам нужно будет обновить код очистки экрана, потому что это, вероятно, изменится.


вы также должны знать, что изображения защищены авторским правом, поэтому будьте осторожны, чтобы использовать изображение только под хорошим "справедливым использованием".


Если большого пальца достаточно, вы можете использовать Facebook Graph API: http://graph.facebook.com/?ids=http://www.imdb.com/title/tt0438097/

получает вам эскиз: http://profile.ak.fbcdn.net/hprofile-ak-ash2/50289_117058658320339_650214_s.jpg


Я знаю, что это слишком поздно, но в моем проекте я использовал это:-

  1. используйте omdbapi, давайте возьмем пример создания, используйте www.omdbapi.com/?t=inception он вернет объект json.
  2. в этом объекте json получите объект" плакат", он содержит плакат для изображения.

omdbapi работает, но я узнал, что вы не можете использовать эти изображения (из-за очистки экрана и они блокируются в любом случае, если вы используете их в теге img)

самое лучшее решение-это использовать tmdb.org :

1 используйте свой imdbid в этом url api:

https://api.themoviedb.org/3/find/tt0111161?api_key=___YOURAPIKEY___&external_source=imdb_id

2 извлеките ответ json и выберите :

"poster_path":"/9O7gLzmreU0nGkIB6K3BsJbzvNv.jpg"

3 Добавьте этот путь с "http://image.tmdb.org/t/p/original", и у вас будет URL-адрес плаката, который вы можете использовать в теге ИМГ :-)

4 Вы даже можете изменить размеры, как это:

http://image.tmdb.org/t/p/original/9O7gLzmreU0nGkIB6K3BsJbzvNv.jpg
http://image.tmdb.org/t/p/w150/9O7gLzmreU0nGkIB6K3BsJbzvNv.jpg

можно использовать imdb-cli инструмент чтобы загрузить плакат фильма, например

omdbtool -t "Ice Age: The Meltdown" | wget `sed -n '/^poster/{n;p;}'`

знайте жестко, что то условий обслуживания явно запретить screenscraping. Вы можете загрузить базу данных IMDB как набор текстовых файлов, но, как я понимаю, идентификатор фильма IMDB нигде не найден в этих текстовых файлах.


вы можете использовать TRAKT API, вы должны сделать запрос поиска с идентификатором imdb, а результат Json, данный Trakt API, содержит ссылки на два изображения этого фильма (плакат и фан-арт) http://trakt.tv/api-docs/search-movies


Я сделал что-то подобное, используя phantomjs и wget. Этот бит phantomjs принимает поисковый запрос и возвращает url-адрес плаката фильма первого результата. Вы могли бы легко изменить его для ваших нужд.

var system = require('system');

if (system.args.length === 1) {
  console.log('Usage: moviePoster.js <movie name>');
  phantom.exit();
}

var formattedTitle = encodeURIComponent(system.args[1]).replace(/%20/g, "+");
var page = require('webpage').create();
page.open('http://m.imdb.com/find?q=' + formattedTitle, function() {
  var url = page.evaluate(function() {
    return 'http://www.imdb.com' + $(".title").first().find('a').attr('href');
  });
  page.close();
  page = require('webpage').create();
  page.open(url, function() {
    var url = page.evaluate(function() {
      return 'http://www.imdb.com' + $("#img_primary").find('a').attr('href');
    });
    page.close();
    page = require('webpage').create();
    page.open(url, function() {
      var url = page.evaluate(function() {
        return $(".photo").first().find('img').attr('src');
      });
      console.log(url);
      page.close();
      phantom.exit();
    });
  });
});

я загружаю изображение с помощью wget для многих фильмов в каталоге с помощью этого сценария bash. Файлы mp4 имеют имена, которые нравятся IMDB, и поэтому первый результат поиска почти гарантированно будет правильным. Такие имена, как "Love Exposure (2008).МР4".

for file in *.mp4; do
  title="${file%.mp4}"
  if [ ! -f "${title}.jpg" ] 
    then
      wget `phantomjs moviePoster.js "$title"` -O "${title}.jpg"
  fi
done

затем minidlna использует плакат фильма при создании базы данных эскизов, потому что он имеет то же имя, что и видеофайл.


$Movies = Get-ChildItem -path "Z:\MOVIES\COMEDY" | Where-Object {$_.Extension -eq ".avi" -or $_.Extension -eq ".mp4" -or $_.Extension -eq ".mkv" -or $_.Extension -eq<br>  <br>".flv" -or $_.Extension -eq ".xvid" -or $_.Extension -eq ".divx"} | Select-Object Name, FullName | Sort Name <br>
#Grab all the extension types and filter the ones I ONLY want <br>
<br>
$COMEDY = ForEach($Movie in $Movies) <br>
{<br>
        $Title = $($Movie.Name)<br>
        #Remove the file extension<br>
        $Title = $Title.split('.')[0] <br>       
<br>
        #Changing the case to all lower <br>       
        $Title = $Title.ToLower()<br>
<br>
        #Replace a space w/ %20 for the search structure<br>
        $searchTitle = $Title.Replace(' ','%20')       <br>
<br>
        #Fetching search results<br>
        $moviesearch = Invoke-WebRequest "http://www.imdb.com/search/title?title=$searchTitle&title_type=feature"<br>
         <br>
        #Moving html elements into variable<br>
        $titleclassarray = $moviesearch.AllElements | where Class -eq 'title' | select -First 1<br>
<br>
        #Checking if result contains movies<br>
        try<br><br>
        {
            $titleclass = $titleclassarray[0]<br>
        }<br>
        catch<br>
        {<br>
            Write-Warning "No movie found matching that title http://www.imdb.com/search/title?title=$searchTitle&title_type=feature"<br>
        }      <br>
                   <br>
        #Parcing HTML for movie link<br>
        $regex = "<\s*a\s*[^>]*?href\s*=\s*[`"']*([^`"'>]+)[^>]*?>"<br>
        $linksFound = [Regex]::Matches($titleclass.innerHTML, $regex, "IgnoreCase")<br>
         <br><br>

        #Fetching the first result from <br>
        $titlelink = New-Object System.Collections.ArrayList<br>
        foreach($link in $linksFound)<br>
        {<br>
            $trimmedlink = $link.Groups[1].Value.Trim()<br>
            if ($trimmedlink.Contains('/title/'))<br>
            {<br>
                [void] $titlelink.Add($trimmedlink)<br>
            }<br>
        }<br>
        #Fetching movie page<br>
        $movieURL = "http://www.imdb.com$($titlelink[0])"<br>
        <br>
        #Grabbing the URL for the Movie Poster<br>
        $MoviePoster = ((Invoke-WebRequest –Uri $movieURL).Images | Where-Object {$_.title -like "$Title Poster"} | Where src -like "http:*").src  <br> 
<br>
        $MyVariable = "<a href=" + '"' + $($Movie.FullName) + '"' + " " + "title='$Title'" + ">"<br>
        $ImgLocation = "<img src=" + '"' + "$MoviePoster" + '"' + "width=" + '"' + "225" + '"' + "height=" + '"' + "275" + '"' + "border=" + '"' + "0" + '"' + "alt=" +<br> '"' + $Title + '"' + "></a>" + "&nbsp;" + "&nbsp;" + "&nbsp;"+ "&nbsp;" + "&nbsp;" + "&nbsp;"+ "&nbsp;" + "&nbsp;" + "&nbsp;"<br>
        <br>
        Write-Output $MyVariable, $ImgLocation<br>
       <br>
    }$COMEDY | Out-File z:\db\COMEDY.htm  <br>
<br>
    $after = Get-Content z:\db\COMEDY.htm <br>
<br>
    #adding a back button to the Index <br>
    $before = Get-Content z:\db\before.txt<br>
<br>
    #adding the back button prior to the poster images content<br>
    Set-Content z:\db\COMEDY.htm –value $before, $after<br>

эти изображения плакатов, похоже, не имеют никакой корреляции с титульной страницей, поэтому вам сначала нужно получить титульную страницу, а затем получить элемент img для страницы. Хорошей новостью является то, что тег img завернут в тег a с именем="плакат". Вы не сказали, какие инструменты вы используете, но это в основном операция очистки экрана.


вот моя программа для создания читаемой человеком HTML сводной страницы для кинокомпаний, найденных на странице imdb. Измените исходный url-адрес по своему вкусу, и он генерирует html-файл, где вы можете увидеть заголовок, резюме, оценку и миниатюру.

npm install -g phantomjs

вот скрипт, сохраните его в imdb.js

var system = require('system');

var page = require('webpage').create();
page.open('http://www.imdb.com/company/co0026841/?ref_=fn_al_co_1', function() {
  console.log('Fetching movies list');
  var movies = page.evaluate(function() {
    var list = $('ol li');
    var json = []
    $.each(list, function(index, listItem) {
      var link = $(listItem).find('a');
      json.push({link: 'http://www.imdb.com' + link.attr('href')});
    });
    return json;
  });
  page.close();

  console.log('Found ' + movies.length + ' movies');

  fetchMovies(movies, 0);
});

function fetchMovies(movies, index) {
  if (index == movies.length) {
    console.log('Done');

    console.log('Generating HTML');
    genHtml(movies);

    phantom.exit();
    return;
  }
  var movie = movies[index];

  console.log('Requesting data for '+ movie.link);

  var page = require('webpage').create();
  page.open(movie.link, function() {
    console.log('Fetching data');
    var data = page.evaluate(function() {
      var title = $('.title_wrapper h1').text().trim();
      var summary = $('.summary_text').text().trim();
      var rating = $('.ratingValue strong').attr('title');
      var thumb = $('.poster img').attr('src');

      if (title == undefined || thumb == undefined) {
        return null;
      }
      return { title: title, summary: summary, rating: rating, thumb: thumb };
    });

    if (data != null) {
      movie.title = data.title;
      movie.summary = data.summary;
      movie.rating = data.rating;
      movie.thumb = data.thumb;
      console.log(movie.title)
      console.log('Request complete');
    } else {
      movies.slice(index, 1);
      index -= 1;
      console.log('No data found');
    }
    page.close();
    fetchMovies(movies, index + 1);
  });
}

function genHtml(movies) {
  var fs = require('fs');

  var path = 'movies.html';
  var content = Array();

  movies.forEach(function(movie) {
    var section = '';

    section += '<div>';
    section += '<h3>'+movie.title+'</h3>';
    section += '<p>'+movie.summary+'</p>';
    section += '<p>'+movie.rating+'</p>';
    section += '<img src="'+movie.thumb+'">';
    section += '</div>';

    content.push(section);
  });

  var html = '<html>'+content.join('\n')+'</html>';

  fs.write(path, html, 'w');
}

и запустить его вот так

phantomjs imdb.js

$Title = $($Movie.Name)

$searchTitle = $Title.Replace(' ','%20')  

$moviesearch = Invoke-WebRequest "http://www.imdb.com/search/title?title=$searchTitle&title_type=feature"

$titleclassarray = $moviesearch.AllElements | where Class -eq 'loadlate' | select -First 1

$MoviePoster = $titleclassarray.loadlate

теперь дни, все современные браузеры имеют "проверить" раздел:

100% правильно только для Google Chrome:

  1. возьмите курсор на изображение.
  2. Правой Кнопкой Мыши на нем, выбираем "Проинспектировать Элемент".
  3. в окне появляются, под элементов tab вы найдете выделенный текст как
  4. просто щелкните на нее.
  5. на вкладке ресурс щелкните правой кнопкой мыши изображение.
  6. выберите "Копировать URL картинки опции".

попробуйте вставить его в любом месте в качестве URL в любом браузере, вы получите только изображение.