呃,现阶段还不会使用多线程里配合图片的直接下载 -2018-12-23 11:29:45
另,虽然采集到了图片(也就是说改改就能采集到文章内容),但是呢离自己想要的文章变形还有不小的差距.就当技术储备了吧. ̄へ ̄
之前遇到的问题
CurlMulti 在QueryList中找不到
AbsoluteUrl也无法使用
使用composer安装
composer require jaeger/querylist-curl-multi
composer require jaeger/querylist-absolute-url
下面是完整的代码
<?php
namespace app\index\controller;
use \app\index\controller\User;
use \app\admin\controller\Index as AdminIndex;
use QL\QueryList;
use QL\Ext\AbsoluteUrl;
use QL\Ext\CurlMulti;
use think\Db;
use think\Controller;
class Index extends Controller
{
public function index()
{
$DB=new Db;
// $data = $DB::table('gxxl')->select();
$data = Db::query("select * from imgmsic");
// 分配数据
$this->assign("data",$data);
return view();
}
public function gxxlImg()
{
// 注册插件
$ql = QueryList::use([
AbsoluteUrl::class, // 转换URL相对路径到绝对路径
CurlMulti::class // Curl多线程采集
]);
// 获取文章列表链接集合,使用AbsoluteUrl插件转换URL相对路径到绝对路径.
$urls = $ql->get('http://baidu.com/tupian/list.html',[
'param1' => 'testvalue',
'params2' => 'somevalue'
],[
'headers' => [
'Referer' => 'http://baidu.com/',
'User-Agent' => 'testing/1.0',
'Accept' => 'application/json',
'X-Foo' => ['Bar', 'Baz'],
'Cookie' => 'abc=111;xxx=222'
]
])->absoluteUrl('http://baidu.com/tupian/list.html')->find('.hy-video-list .clearfix a')->attrs('href')->all();
//使用CurlMulti多线程插件采集文档内容
$ql->rules([ // 设置采集规则
// 'title' => ['.head h3', 'text'],
'imgArr' => ['#playlist .playlist', 'html'],
// 'imgArr' => array('#playlist4 img','originalsrc')
])
// 设置采集任务
->curlMulti($urls)
// 每个任务成功完成调用此回调
->success(function (QueryList $ql, CurlMulti $curl, $r) {
echo "Current url:{$r['info']['url']} \r\n";
$data = $ql->query()->getData()->all();
$durl = QueryList::html($data[0]['imgArr'])->find('img')->map(function($a){
$src= $a->attr('originalsrc');
$title= $a->attr('title');
// 直接下载不会,只好写入到数据库中,再通过php curl下载吧
Db::execute("insert into imgmsic value(null,?,?)",[$src,$title]);
return $a->attr('originalsrc');
});
dump($durl);
dump($data);
})
// 开始执行多线程采集
->start([
// 最大并发数
'maxThread' => 10,
// 错误重试次数
'maxTry' => 3
]);
}
}