在上一章中我们介绍了Querylist的简单使用,
这一章中,我们配合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)
{
//...
}
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;
}
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论