使用Querylist动态抓取腾讯新闻

在上一章中我们介绍了Querylist的简单使用,
这一章中,我们配合PhantomJS来动态抓取腾讯新闻数据。

PhantomJS 插件

使用PhantomJS采集JavaScript动态渲染的页面。
使用PhantomJS采集JavaScript动态渲染的页面。这个包基于jonnyw/php-phantomjs包。
PhantomJS: http://phantomjs.org
jonnyw/php-phantomjs: https://github.com/jonnnnyw/php-phantomjs
GitHub: https://github.com/jae-jae/QueryList-PhantomJS

安装

composer require jaeger/querylist-phantomjs

然后还需要去PhantomJS官网下载对应你电脑系统的PhantomJS二进制文件,放到电脑任意路径,下面会用到这个路径,下载页面直达:http://phantomjs.org/download.html
(注:如果再Linux下使用,注意PhantomJS文件的权限问题)

BUG修复,如果运行报下面错:

PHP Warning: Declaration of JonnyW\PhantomJs\DependencyInjection\ServiceContainer::load() should be compatible with Symfony\Component\DependencyInjection\Container::load($file) in /wwwroot/vendor/jonnyw/php-phantomjs/src/JonnyW/PhantomJs/DependencyInjection/ServiceContainer.php on line 20

这是jonnyw/php-phantomjs这个包的bug,已提交给作者等待被修复,在作者未修复前,我们可以通过以下2种方式解决:
方法一: 忽略这个警告,这个警告不影响程序的正确运行,可以屏蔽之。
方法二: 手动修改源码,修改文件vendor/jonnyw/php-phantomjs/src/JonnyW/PhantomJs/DependencyInjection/ServiceContainer.php中的load()函数加个参数并给个默认值:

    public function load($file = null)
    {
        //...
    }

用法:

  • Installation Plugin
use QL\QueryList;
use QL\Ext\PhantomJs;

$ql = QueryList::getInstance();
// 安装时需要设置PhantomJS二进制文件路径
$ql->use(PhantomJs::class,'/usr/local/bin/phantomjs');
//or Custom function name
$ql->use(PhantomJs::class,'/usr/local/bin/phantomjs','browser');

// Windows下示例
// 注意:路径里面不能有空格中文之类的
$ql->use(PhantomJs::class,'C:/phantomjs/bin/phantomjs.exe');

例子一:

$html = $ql->browser('https://m.toutiao.com')->getHtml();
print_r($html);

$data = $ql->browser('https://m.toutiao.com')->find('p')->texts();
print_r($data->all());

// 更多选项可以查看文档: http://phantomjs.org/api/command-line.html
$ql->browser('https://m.toutiao.com',true,[
    // 使用http代理
    '--proxy' => '192.168.1.42:8080',
    '--proxy-type' => 'http'
])

例子二:

$data = $ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r){
    $r->setMethod('GET');
    $r->setUrl('https://m.toutiao.com');
    $r->setTimeout(10000); // 10 seconds
    $r->setDelay(3); // 3 seconds
    return $r;
})->find('p')->texts();

print_r($data->all());

例子三:

$data = $ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r){
    $r->setMethod('GET');
    $r->setUrl('https://m.toutiao.com');
    $r->setTimeout(10000); // 10 seconds
    $r->setDelay(3); // 3 seconds
    return $r;
},true,[
    '--cookies-file' => '/path/to/cookies.txt'
])->rules([
    'title' => ['p','text'],
    'link' => ['a','href']
])->query()->getData();

print_r($data->all());

如何扒取腾讯新闻数据:

/**
 * [NewsQq 腾讯新闻]
 * @param [type] $url [链接]
 */
public static function NewsQq($url)
{
    $url_array = parse_url($url);
    if (isset($url_array['path'])) {
        $path = rtrim($url_array['path'],'.html');
        $path = trim($path, '/');
        $article_array = explode('/',$path);
        $article_id = end($article_array);
        $article_id = substr($article_id, 0, 14);
        $date = substr($article_id, 0, 8);
    }
    $url = 'https://new.qq.com/omn/'.$date.'/'.$article_id.'.html'; // 获取PC端文章链接

    $ql = QueryList::getInstance();
    // 安装时需要设置PhantomJS二进制文件路径
    $ql->use(PhantomJs::class,'/usr/local/bin/phantomjs');
    //or Custom function name
    $ql->use(PhantomJs::class,'/usr/local/bin/phantomjs','browser');

    // Windows下示例
    // 注意:路径里面不能有空格中文之类的
    $ql->use(PhantomJs::class,'C:/phantomjs/bin/phantomjs.exe');

    $rules = [
        'title'     => ['.LEFT h1','text'],
        'keywords'  => ['.LEFT h1','text'],
        'content'   => ['.content-article', 'html', '-#Status', function($value){
            $value = str_replace('src="//','src="http://',$value);
            return $value;
        }],
        'image'     => ['.content-article img', 'src', '', function($value)
        {
            $baseUrl = 'https:';
            return $baseUrl.$value;
        }]
    ];

    $data = $ql->browser($url)->rules($rules)->query()->getData();
    $data = $data->all()[0];
    return $data;
}

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论