给定 IMDB 电影 ID,如何以编程方式获取其海报图像



电影 id tt0438097 可在 http://www.imdb.com/title/tt0438097/

其海报图像的网址是什么?

签出

http://www.imdbapi.com/,它以字符串形式返回海报网址。

例如,选中

http://www.imdbapi.com/?i=&t=inception,您将获得海报地址:Poster":"http://ia.media-imdb.com/images/M/MV5BMjAxMzY3NjcxNF5BMl5BanBnXkFtZTcwNTI5OTM0Mw@@._V1._SX320.jpg"

更新:似乎网站所有者与IMDB法律人员发生了一些争执。如原始站点中所述,新站点的地址是 http://www.omdbapi.com/

最好的解决方案是使用 tmdb.org :

  1. find/后在此 API URL 中使用您的 IMDBID:

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

  2. 检索 json 响应并选择 poster_path 属性:

    例如 "poster_path":"/9O7gLzmreU0nGkIB6K3BsJbzvNv.jpg"

  3. 在此路径前面加上 "http://image.tmdb.org/t/p/w150" ,您将拥有可以在 img 标签中使用的海报 URL :-)

<小时 />

omdbapi 可以工作,但我发现您无法真正使用这些图像(因为屏幕抓取,如果您在 img 标签中使用它们,它们无论如何都会被阻止)

我相信你知道,该图像的实际网址是

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

您将很难弄清楚它是如何生成的,而且他们似乎没有公开可用的API。

屏幕抓取可能是您最好的选择。

图片似乎通常位于带有class=photo的div内,标签的名称是海报

图像本身就在 a 标签内。

据我所知,URL是一个随机字符串。

它仍然可以轻松检索。它是定位点内唯一名为 posterimg

因此,如果您正在阅读源代码,只需搜索<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,让我们以 Inception 为例,使用 www.omdbapi.com/?t=inception 它将返回一个 json 对象。
  2. 在该 json 对象中获取"海报"对象,它包含图像的海报。

您可以使用 Trakt API,您必须使用 imdb ID 发出搜索请求,并且 Trakt API 给出的 Json 结果包含该电影的两张图像的链接(海报和粉丝艺术)http://trakt.tv/api-docs/search-movies

$Movies = Get-ChildItem -path "Z:MOVIESCOMEDY" | 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*as*[^>]*?hrefs*=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:dbCOMEDY.htm  <br>
<br>
    $after = Get-Content z:dbCOMEDY.htm <br>
<br>
    #adding a back button to the Index <br>
    $before = Get-Content z:dbbefore.txt<br>
<br>
    #adding the back button prior to the poster images content<br>
    Set-Content z:dbCOMEDY.htm –value $before, $after<br>

您可以使用imdb-cli工具下载电影的海报,例如

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

在上面玩了@Hawk的 BASE64 发现后,我发现 BASE64 代码之后的所有内容都是显示信息。如果您删除最后一个@.jpg之间的所有内容,它将以最高分辨率加载图像。

https://m.media-amazon.com/images/M/MV5BMjAwODg3OTAxMl5BMl5BanBnXkFtZTcwMjg2NjYyMw@@._V1_UX182_CR0,0,182,268_AL_.jpg

成为

https://m.media-amazon.com/images/M/MV5BMjAwODg3OTAxMl5BMl5BanBnXkFtZTcwMjg2NjYyMw@@.jpg

有一个 API 服务提供商将根据您在查询字符串中提供的电影名称为您提供海报图像 URL 和许多其他详细信息。

这里是上述服务提供商网站的链接。

您可以在代码中注册并使用 API 服务。

这些海报图像似乎与标题页没有任何关联,因此您必须先检索标题页,然后检索页面的 img 元素。好消息是 img 标签被包装在 name="poster" 的标签中。你没有说你正在使用什么样的工具,但这基本上是一个屏幕抓取操作。

请注意,服务条款明确禁止屏幕抓取。您可以将IMDB数据库下载为一组文本文件,但据我了解,在这些文本文件中找不到IMDB电影ID。

我使用 phantomjs 和 wget 做了类似的事情。这个phantomjs接受搜索查询并返回第一个结果的电影海报网址。您可以轻松地将其更改为您的需要。

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喜欢的名称,这就是为什么第一个搜索结果几乎可以保证是正确的。像"爱情曝光(2008).mp4"这样的名字。

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

然后minidlna在构建缩略图数据库时使用电影海报,因为它与视频文件具有相同的名称。

这是我的程序,可以为imdb页面上的电影公司生成人类可读的html摘要页面。根据自己的喜好更改初始网址,它会生成一个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%正确仅适用于谷歌浏览器:

  1. 将光标放在图像上。
  2. 右键单击它,选择"检查元素"。
  3. 在出现的窗口中,在"元素"选项卡下,您会发现突出显示的文本为
  4. 只需单击它。
  5. 在"资源"选项卡中,右键单击图像。
  6. 选择"复制图像URL"选项。

尝试将其作为URL粘贴到任何浏览器中的任何位置,您只会获得图像。

最新更新