【问题标题】:top 250 imdb detail php grabber [closed]前 250 个 imdb 详细 php 抓取器 [关闭]
【发布时间】:2013-11-05 04:50:04
【问题描述】:

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

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

我试过用 curl 脚本来做,但没有运气!

例如:

我想知道教父:第二部分是否在前 250 名?如果是,排名是什么...

【问题讨论】:

标签: php mysql imdb


【解决方案1】:

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>

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

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

<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 小时/天/周更新一次以节省加载时间等等。我假设你已经计划这样做(正如你所说的你想要一个个人电影数据库......但我还是想我会提到它!

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多