php - 前 250 个 IMDB 详细信息 php 抓取器

标签 php mysql imdb

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

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

我尝试通过curl脚本来做到这一点,但没有成功!

例如:

我想知道《教父:第二部分》是否进入前 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>

请参阅 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

<小时/>

旁注

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

关于php - 前 250 个 IMDB 详细信息 php 抓取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19600509/

相关文章:

PHP 禁用 ipv6

php - 将 MySQL JSON_OBJECT() 与参数化查询结合使用

movie - Imdb 上所有电影名称、 Actor 、导演、编剧的列表

mysql - 当我有一组值来检查哪些匹配项足够时,我该如何使用 IN SQL 运算符?

mysql - 我是否应该对表进行非规范化,是否应该对 FK 列进行非规范化

php - IMDB 到 MySQL : Insert IMDB data into MySQL database

math - 您将如何计算 IMDB 电影评级?

javascript - PHP json_encode 到 JS 对象数组

javascript - 将php表转换成多个javascript文本框

php - 查询未正确过滤结果