我正在尝试建立一个个人电影数据库,我希望从 imdb 中获取数据......是的,我知道那里有很多 api 和抓取器,但它们都没有做需要做的事情,,,
到目前为止,我无法想出一个解决方案来解析http://www.imdb.com/chart/top列表并从中获取我的数据......
我试过用 curl 脚本来做,但没有运气!
例如:
我想知道教父:第二部分是否在前 250 名?如果是,排名是多少...
我正在尝试建立一个个人电影数据库,我希望从 imdb 中获取数据......是的,我知道那里有很多 api 和抓取器,但它们都没有做需要做的事情,,,
到目前为止,我无法想出一个解决方案来解析http://www.imdb.com/chart/top列表并从中获取我的数据......
我试过用 curl 脚本来做,但没有运气!
例如:
我想知道教父:第二部分是否在前 250 名?如果是,排名是多少...
我会调查 IMDB 是否有可用的 API……如果他们这样做,可能就像查询 URL 并解析返回的数据一样简单json_decode
……
无需使用 CURL,简单的file_get_contents
就可以了...
现在您有了网页,然后有两个选项:
快速查看列表的源代码显示列表的格式为:
<td class="titleColumn">RANK. <a href="/link/to/film" title="Director/Leads" >FILM TITLE</a>
有关所需信息,请参阅 CAPS
现在将其转换为正则表达式很简单;只需消除噪音并用(非贪婪的)通配符替换......
<td class="titleColumn">RANK. <a.*?>FILM TITLE</a>
添加您的捕获组:
<td class="titleColumn">(RANK). <a.*?>(FILM TITLE)</a>
就是这样……
#<td class="titleColumn">(\d+)\. <a.*?>(.*?)</a>#
在实践中使用它:
$page = file_get_contents("http://www.imdb.com/chart/top"); //Download the page
preg_match_all('#<td class="titleColumn">(\d+)\. <a.*?>(.*?)</a>#', $page, $matches); //Match ranks and titles
$top250 = array_combine($matches[1], $matches[2]); //Final array in format RANK=>TITLE
然后您可以执行以下操作:
echo $top250[1];
/**
Output:
The Shawshank Redemption
*/
echo array_search("The Godfather", $top250);
/**
Output:
2
*/
然后,您可以使用标准PHP
数组函数来执行诸如搜索电影之类的操作。
http://php.net/file_get_contents
http://php.net/preg_match_all
http://php.net/array_combine
http://php.net/array_search
特别是如果您使用上面的No API方法,您可能想考虑将结果存储在本地,并且仅每 X 小时/天/周更新一次以节省加载时间等。我假设您已经计划这样做(正如您所说的想要一个个人电影数据库......但我只是想我还是会提到它!