前250名imdb详细信息php抓取器

时间:2013-10-25 22:43:21

标签: php mysql imdb

我正在尝试构建个人电影数据库,我希望从imdb中获取数据... 是的,我知道有很多api和抓取器,但没有一个正在做什么需要,,,

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

我试过用卷曲脚本做但没有运气!

例如:

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

1 个答案:

答案 0 :(得分:1)

API

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

没有可用的API?

获取网页

无需使用CURL一个简单的file_get_contents就可以解决问题......

提取列表

现在你有了这个网页,你有两个选择:

  1. 使用DOM解析器解析网页(冗长,不必要)
  2. 正则表达式提取您之后的信息(简单,简短)
  3. 正则表达式

    快速查看列表的源代码,显示列表格式为:

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

    请参阅CAPS了解所需信息

    现在将其转换为正则表达式很简单;只需删除 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


    旁注

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