PHP 爬虫———爬取网易云音乐歌单

爬取网易云音乐歌单

PHP + QueryList + Puppeteer + Nodejs

使用 Composer 安装库

如果你之前没有接触过Composer,强烈建议你学习一下。Composer 是 PHP 的一个依赖管理工具,使用它你可以轻松安装别人发布的PHP包,现在流行的PHP项目基本上都是Composer来管理依赖,Composer中文文档 。

环境要求

  • PHP >= 7.1
  • Node >= 8

nodejs 地址 https://nodejs.org/zh-cn/

1.安装 QueryList

文档地址:http://www.querylist.cc/docs/guide/v4/overview

composer require jaeger/querylist

2.安装 QueryList-Puppeteer插件

文档地址:

英文     https://github.com/nesk/puphpeteer

中文     http://www.querylist.cc/docs/guide/v4/Puppeteer

Puppeteer文档地址:https://github.com/puppeteer/puppeteer

composer require jaeger/querylist-puppeteer

 3.安装Node依赖(与composer一样在项目根目录下执行)

npm install @nesk/puphpeteer

如果npm安装速度太慢,可以尝试更换国内npm镜像源:

npm config set registry https://registry.npm.taobao.org

 废话不多说直接上代码:

NetEaseCloudMusic.php

goto($url);
            /**
             * 网易云歌单的内容实际是在一个 iframe中
             * 所以 这里切入到 那个iframe 中
             */
            $iframe = $page->mainFrame()->querySelector('#g_iframe')->contentFrame();
            /**
             * 然后再切入到 歌单表格
             * 注入 JS 方法 获取表格 HTML
             */
            return $iframe->querySelectorEval('table.m-table tbody',JsFunction::createWithParameters(['element'])
                ->body("return element.innerHTML"));
        });

        /**
         * 拿到html内容
         * 这里用的是正则匹配。
         * 并没用 QueryList 操作DOM
         * 需要操作DOM请查看 QueryList 文档
         * http://www.querylist.cc/docs/guide/v4/overview
         */
        $html = $query->getHtml();
        if (empty($html)) return null;


        if (is_string($options)){
            $options = [$options];
        }
        $result = [];
        foreach ($options as $val){
            foreach (self::songListMatch($val,$html) as $k=>$item){
                $result[$k][$val] = $item;
            }
        }
        return $result;
    }

    /**
     * 匹配歌单内容
     * @param string $type 值为 $pattern的key
     * @param string $str 要查找的字符串
     * @return array|mixed
     */
    private static function songListMatch($type,&$str){
        $pattern = [
            // 正则匹配歌名
            'name'          => '/\s* '/\s*\s*([0-9|:]+)\s*<\/span>/i',
            // 链接
            'url'           => '//i',
            // 作者
            'author'        => '/\s*/i',
            // 专辑
            'album'         => '//i'
            // ...
        ];

        if ($pattern[$type] && preg_match_all($pattern[$type],$str,$arr)){
            // 下标为 1 的才是匹配到元素
            foreach ($arr[1] as &$item){
                // 将HTML 实体转换为字符
                $item = htmlspecialchars_decode($item);
            }
            return $arr[1];
        }
        return [];
    }


    /**
     * 开始
     * @param callable $callback 需要执行方法
     * @param array $options 选项
     * @return QueryList
     */
    public static function go(callable $callback,$options = []){

        $ql = QueryList::getInstance();
        // 注册插件,默认注册的方法名为: chrome
        $ql->use(Chrome::class,'chrome');

        /**
         * 是否在 无头模式 下运行浏览器。默认是 true 除非 devtools 选项是 true
         * 这里设为false 然后程序暂停一定的时间可以看到浏览器的启动
         * 可选参数 api 地址
         * https://zhaoqize.github.io/puppeteer-api-zh_CN/#?product=Puppeteer&version=v2.1.1&show=api-puppeteerdefaultargsoptions
         */
        $options['headless'] = false;
        /**
         * linux 下 禁用 沙盒
         */
//        $options['args'] = ['--no-sandbox'];
        $query = $ql->chrome(function ($page,$browser) use ($callback) {
            // 模拟浏览器
            $userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36';
            $page->setUserAgent($userAgent);
            /**
             * 暂停10s 看到chrome浏览器启动
             */
            sleep(10);

            $html = $callback($page,$browser);
            // 关闭浏览器
            $browser->close();
            // 返回值一定要是页面的HTML内容
            return $html;
        },$options);

        return $query;
    }
}

index.php

结果预览:

PHP 爬虫———爬取网易云音乐歌单_第1张图片

源码地址:

github:https://github.com/Foodtoinvincible/NetEaseCloudMusicReptile.git

你可能感兴趣的:(爬虫)