前 250 名 IMDB 详细信息 PHP 抓取器


top 250 imdb detail php grabber

我正在尝试建立一个个人电影数据库,我希望从imdb获取数据...是的,我知道那里有很多 API 和抓取器,但他们都没有做需要的事情,,,

到目前为止,我无法想出解析 http://www.imdb.com/chart/top 列表并从中获取数据的解决方案......

我尝试通过卷曲脚本来做到这一点,但没有运气!

例如:

我想知道《教父:第二部分》是否进入前 250 名,如果是,排名是多少......

API

我会调查 IMDB 是否有可用的 API......如果他们这样做,这可能就像查询 URL 并使用 json_decode 解析返回的数据一样简单......

没有可用的 API?

获取网页

无需使用CURL,一个简单的file_get_contents就可以了...

提取列表

现在您有了网页,然后有两个选择:

  1. 使用 DOM 解析器解析网页(冗长,不是必需的)
  2. 正则表达式提取您所追求的信息(简单、简短)

正则表达式

快速浏览列表的源代码显示列表的格式为:

<td class="titleColumn">RANK. <a href="/link/to/film" title="Director/Leads" >FILM TITLE</a>

有关所需信息,请参阅大写字母

现在将其转换为正则表达式很简单;只需消除噪音并替换为(非贪婪的)通配符......

<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_combinehttp://php.net/array_search


旁注

特别是如果您使用上面的 No API 方法,您可能想考虑在本地存储结果,并且仅每 X 小时/天/周更新一次以节省加载时间等。我假设您已经计划这样做(正如您所说,您想要一个个人电影数据库......但只是想我还是会提到它!