PHP爬虫实战教程——采集热映电影榜单

请注意,本文编写于 176 天前,最后修改于 176 天前,其中某些信息可能已经过时。

从实战出发,博客菜单栏中电影热映榜,就是实时爬取得电影榜单数据,这里就把数据采集的源码以及使用方法分享一下。
首先,要明确爬虫的流程是什么?

  1. 模拟浏览器发送请求以获取网页代码
  2. 提取有用的数据
  3. 存放于数据库或文件中

接下来我们就可以按部就班的来进行操作了:
首先我们来确定一下目标站,百度搜索一下电影榜单。

百度搜索电影榜单
百度搜索电影榜单

会发现百度内置了一个电影列表的api(https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=6862&from_mid=1&&format=json&ie=utf-8&oe=utf-8&query=%E7%94%B5%E5%BD%B1%E6%A6%9C%E5%8D%95&sort_key=16&sort_type=1&stat0=&stat1=&stat2=&stat3=&pn=8&rn=8&cb=jQuery1102037153感兴趣的朋友可以自行研究),其实这个是可以直接拿来用的,但是我对他这个最热电影心存疑虑,评分二点多,三点多的电影是什么个情况,然后下面是豆瓣电影排行,会发现很多未上映或者是无法在线看,所以也被我pass掉了,最后我决定使用官方的视频搜索引擎,这里以360的为例(搜狗的也可以,由于图片不可以引用不建议使用百度的)。好了,目标的地址先确认了:
https://www.360kan.com/dianying/list.php?cat=all&year=all&area=all&act=all&rank=rankhot
然后我们就可以来获网页代码了。
一般情况下,我们可以使用file_get_content()函数就可以了,但是考虑到后续的实战里我们会需要模拟浏览器,模拟用户登录的问题,所以尽量学会使用curl函数,这里直接用curl函数了,简单封装成一个函数:

function curl_get($url,$post=""){
    $curl = curl_init();
    // 1. 设置HTTP URL (API地址)
    curl_setopt($curl, CURLOPT_URL, $url);
    
    // 2. 设置HTTP HEADER (表单POST,可于此处添加cookie)
    $head = array(
            'Content-Type: application/x-www-form-urlencoded',
            'user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
        );
    curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
    
    // 3. 设置HTTP BODY (URL键值对)
    if(!empty($post)){
    $body = http_build_query($post);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
    }
    
    // 4. 获取响应结果
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_NOBODY, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
    
    
};

测试一下效果:

curl效果测试
curl效果测试

接下来就需要对数据进行处理了,其实就是把你需要的内容提取出来,也就是电影的名称,主演,评分等等你所需要爬取得东西,一般情况下我们可以使用正则表达式来进行内容提取,但是对于比较复杂的信息就显得有些困难了,所以这里我们使用一个针对HTML DOM处理的一个解析器simple_html_dom.php,https://github.com/samacs/simple_html_dom/blob/master/simple_html_dom.php(可供选择的解析器有很多,可以尝试一下,使用方式都类似),可以说是php爬虫中非常实用的一个模块。
具体怎么使用可以在github上看一下他的例子,也可以直接看我下面的代码。

<?php
header('content-type:application/json;charset=utf8');
include("./simple_html_dom.php");//引用simple_html_dom.php
function curl_get($url,$post=array()){
    $curl = curl_init();
    // 1. 设置HTTP URL (API地址)
    curl_setopt($curl, CURLOPT_URL, $url);
    
    // 2. 设置HTTP HEADER (表单POST,可于此处添加cookie)
    $head = array(
            'Content-Type: application/x-www-form-urlencoded',
            'user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
        );
    curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
    
    // 3. 设置HTTP BODY (URL键值对)
    if(!empty($post)){
    $body = http_build_query($post);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
    }
    
    // 4. 获取响应结果
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_NOBODY, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
    
    
};
$html = str_get_html(curl_get("https://www.360kan.com/dianying/list.php?cat=all&year=all&area=all&act=all&rank=rankhot"));

    foreach ($html->find("div[class=s-tab-main] ul[class=list g-clear] li[class=item] a[class=js-tongjic]") as $value) {
        $data[] = array(
            "title" => $value->find("span[class=s1]",0)->innertext,
            "star" => $value->find("p[class=star]",0)->innertext,
            "hint" => $value->find("span[class=hint]",0)->innertext,
            "point" => $value->find("span[class=point]",0)->innertext,
            "img" => $value->find("img",0)->src,
        );
    }
file_put_contents("data.json",json_encode($data));
print_r($data);

使用方式为:
先用str_get_html函数进行对html页面解析,然后我们开始筛选页面元素

20190122110501.jpg
20190122110501.jpg

可以看到我们需要的元素都包裹在class为"item"的div中,那么我么就需要先把这些div找出来,也就是

$html->find("div[class=s-tab-main] ul[class=list g-clear] li[class=item] a[class=js-tongjic]"

接着在把每个item里面的具体内容"title" => $value->find("span[class=s1]",0)->innertext代码里的innertext有点类似js里的innerText,获取元素的文本值。

最后把结果打印出来,或者直接把数据进行保存,如果是进行保存的话我一般习惯保存成json格式的,便于页面直接使用file_put_contents("data.json",json_encode($data));
看一下效果:

20190122113117.jpg
20190122113117.jpg

数据已经获取到了,接下来就是制作前端进行展示了,效果可以参考
http://www.meayair.com/MovieTop.html
最终的完整代码会在后续的教程中发布~

Comments

添加新评论

已有 1 条评论

PHP爬虫,学习一下