给定一个 IMDB 电影 ID,我如何以编程方式获取其海报图像?
Posted
技术标签:
【中文标题】给定一个 IMDB 电影 ID,我如何以编程方式获取其海报图像?【英文标题】:Given an IMDB movie id, how do I programmatically get its poster image? 【发布时间】:2010-09-14 03:44:55 【问题描述】:电影 id tt0438097 可以在http://www.imdb.com/title/tt0438097/找到
海报图片的网址是什么?
【问题讨论】:
为什么不为 themoviedb.org 之类的海报使用不同的来源? 任何完整的源代码示例? 【参考方案1】:查看 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/
【讨论】:
这个网站看起来还不够完善,不能被认为是可靠的,但我期待看到它的发展。感谢您的链接! 请注意,您不能依赖或控制海报的海报尺寸/裁剪尺寸。如果您需要相同大小的缩略图网格,这将是一件令人头疼的事情。例如,this title 将给出水平的image,尽管该短片的主图像在页面上的裁剪方式不同。了解嵌入在图片网址中的海报的大小和裁剪逻辑真的很有帮助。 但是这些链接无论如何都不能使用:***.com/questions/28676608/…【参考方案2】:最好的解决方案是使用tmdb.org:
在find/
之后在此 api url 中使用您的 imdbid:
https://api.themoviedb.org/3/find/tt0111161?api_key=__YOURAPIKEY__&external_source=imdb_id
检索json响应并选择poster_path
属性:
例如"poster_path":"/9O7gLzmreU0nGkIB6K3BsJbzvNv.jpg"
在此路径前加上"http://image.tmdb.org/t/p/w150"
,您将拥有可在img 标签中使用的海报URL :-)
omdbapi 有效,但我发现你不能真正使用这些图像(因为屏幕抓取和they are blocked anyway if you use them in an img tag)
【讨论】:
【参考方案3】:我相信你知道,该图片的实际网址是
http://ia.media-imdb.com/images/M/MV5BMTI0MDcxMzE3OF5BMl5BanBnXkFtZTcwODc3OTYzMQ@@._V1._SX100_SY133_.jpg
您将很难弄清楚它是如何生成的,而且他们似乎没有公开可用的 API。
屏幕抓取可能是你最好的选择。
图片似乎通常在带有 class=photo 的 div 中,并且 a 标记的名称是 poster。
图片本身就在a标签内。
【讨论】:
用力过猛?对此感到怀疑。该 URL 显然是 Base64 编码的。最后一部分 X-Y 是图片大小。只需要四处挖掘,相信有足够的线索可以破译它。 是的!我是对的。 “MV5BMTI0MDcxMzE3OF5BMl5BanBnXkFtZTcwODc3OTYz”解码为“1^A1240713178^A2^Ajpg^Ame70877963”所以你的谜题还有另一部分。【参考方案4】:据我所知,URL 是一个随机字符串。
它仍然可以轻松检索。它是名为poster
的锚内唯一的img
。
因此,如果您正在阅读源代码,只需搜索 <a name="poster"
,它将是第一个 src="
之后的文本。
但是,您需要不断更新屏幕抓取代码,因为这可能会改变。
您还应该注意图片受版权保护,因此请注意仅在良好的“合理使用”理由下使用图片。
【讨论】:
【参考方案5】:如果一个拇指就够了,你可以使用 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
【讨论】:
您是如何获得缩略图网址的?自从您发布此图表以来,图表是否发生了变化?因为现在那里没有图片 URL。 这令人印象深刻。 这很好,但现在您需要一个访问令牌。然而,下面是一个简单的例子,如何使用 themoviedb api(我有很好的经验)【参考方案6】:我知道为时已晚,但在我的项目中我使用了这个:-
-
使用omdbapi,我们以Inception为例,使用www.omdbapi.com/?t=inception会返回一个json对象。
在该 json 对象中获取“海报”对象,它包含图像的海报。
【讨论】:
【参考方案7】:您可以使用imdb-cli
tool下载电影海报,例如
omdbtool -t "Ice Age: The Meltdown" | wget `sed -n '/^poster/n;p;'`
【讨论】:
【参考方案8】:请注意,terms of service 明确禁止屏幕抓取。您可以将 IMDB 数据库下载为a set of text files,但据我了解,在这些文本文件中找不到 IMDB 电影 ID。
【讨论】:
【参考方案9】:您可以使用 Trakt API,您必须使用 imdb ID 发出搜索请求,并且 Trakt API 给出的 Json 结果包含该电影的两个图像(海报和粉丝艺术)的链接 http://trakt.tv/api-docs/search-movies
【讨论】:
【参考方案10】:我使用 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 喜欢的名称,这就是为什么几乎可以保证第一个搜索结果是正确的。像“爱的曝光(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在构建缩略图数据库时使用电影海报,因为它与视频文件同名。
【讨论】:
【参考方案11】:$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" + '"' + "' + "225" + '"' + "' + "275" + '"' + "border=" + '"' + "0" + '"' + "' + $Title + '"' + "></a>" + " " + " " + " "+ " " + " " + " "+ " " + " " + " "<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>
【讨论】:
【参考方案12】:在玩弄了上面@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
【讨论】:
那么MV5BMjAwODg3OTAxMl5BMl5BanBnXkFtZTcwMjg2NjYyMw
是什么意思?我应该将电影的 tconst 编码为 base64 我应该怎么做才能获取 URL?【参考方案13】:
有一个 API 服务提供商会根据您在其查询字符串中提供的电影名称为您提供海报图片 URL 和许多其他详细信息。
Over here is the link to the above service provider's website.
您可以在代码中注册并使用 API 服务。
【讨论】:
【参考方案14】:这些海报图片似乎与标题页没有任何关联,因此您必须先检索标题页,然后再检索该页面的 img 元素。好消息是 img 标签被包裹在一个带有 name="poster" 的标签中。你没有说你用的是什么工具,但这基本上是一个屏幕抓取操作。
【讨论】:
图片与任何页面没有任何关联,因为一张图片可以分配给多个页面(电影、演员等),反之亦然。【参考方案15】:这是我的程序,用于为 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
【讨论】:
【参考方案16】:$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
【讨论】:
【参考方案17】:现在,所有现代浏览器都有“Inspect”部分:
100% 正确,仅适用于 Google Chrome:
-
将光标移到图像上。
右键单击它,选择“Inspect Element”。
在出现的窗口中,在 Elements 选项卡下,您会发现突出显示的文本为
点击即可。
在“资源”选项卡中,右键单击图像。
选择“复制图片网址”选项。
尝试将其作为 URL 粘贴到任何浏览器中的任何位置,您只会得到图像。
【讨论】:
以上是关于给定一个 IMDB 电影 ID,我如何以编程方式获取其海报图像?的主要内容,如果未能解决你的问题,请参考以下文章