PHP爬取简单的数据
1.使用插件querylist
使用composer下载 命令
composer require jaeger/querylist
引用
use QL\QueryList;
完事~
2.爬取简单的html标签内容
使用querylist通过类似于jq选择器选择标签十分方便
$ql = QueryList::get('https://www.ithome.com/html/discovery/358585.htm');
$rt = [];
// 采集文章标题
$rt['title'] = $ql->find('h1')->text();
// 采集文章作者
$rt['author'] = $ql->find('#author_baidu>strong')->text();
// 采集文章内容
$rt['content'] = $ql->find('.post_content')->html();
print_r($rt);
数组对应的键和值。
使用的find选择器
再来一个栗子~
// A code block
var foo = 'bar';
$url = 'http://www.qiushuge.net/zhongjidouluo/1115.html';
$rules = [
'totol' => ['.bg','text'],
];
$rt = QueryList::get($url)->rules($rules)->query()->getData();
print_r($rt);
// if($rt){
// print_r($rt[0]['totol']);
// }
// else{
// print_r("===");
// }
// 结果是一个二维数组
//使用的rules()函数 官方称之为采集 更方便了~
$rules = [
'规则名1' => ['选择器1','元素属性'],
'规则名2' => ['选择器2','元素属性'],
// ...
];
//还有个语法糖
//$rt = QueryList::get($url)->rules($rules)->query()->getData(); print_r($rt->all());
//print_r($rt);
//$rt = QueryList::get($url)->rules($rules)->queryData();
//print_r($rt);
//queryData()方法等同于query()->getData()->all() 。
更多请阅读querylist官方文档
https://juejin.im/entry/59d38e2cf265da065c5eb54f
3.爬取图片
爬取图片才是有点用的东西~感觉也不是很有用,算啦,不说废话了,直接上代码。
// 保存多图片
set_time_limit(300); // 设置程序执行超时时间为5分钟
// for($j = 1; $j <= 2; $j++ ){
// print $j;
// echo "</br>";
//手动选择第三页
$j = 3;
$url = 'https://api.bilibili.com/pgc/season/index/result?season_version=-1&area=-1&is_finish=-1©right=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&order=3&st=1&sort=0&page='.$j.'&season_type=1&pagesize=20&type=1&tdsourcetag=s_pcqq_aiomsg';
$jsonStr = file_get_contents($url);
$json = json_decode($jsonStr);
$imgArr = [];
// count($json->data->list)
for($i = 0; $i < count($json->data->list); $i++ ){
array_push($imgArr,$json->data->list[$i]->cover);
}
// }
// print_r($imgArr);
// 要下载的图片数组
$beginTime = time(); // 开始下载图片的时间
$lastTime = $beginTime; // 上一次下载图片的时间
$count = 0; // 计数器
echo 'begin download at ' . date('Y-m-d H:i:s', $beginTime) . '<br/>'; // 输出开始下载图片的时间
// 循环添加curl句柄
$mh = curl_multi_init(); // 开启curl多线程
foreach ($imgArr as $k => $v) {
$ch[$k] = curl_init(); // 初始化curl句柄
curl_setopt($ch[$k], CURLOPT_URL, $v); // 设置要下载的图片
curl_setopt($ch[$k], CURLOPT_RETURNTRANSFER, 1); // 设置获取图片内容而不直接在浏览器输出
curl_setopt($ch[$k], CURLOPT_HEADER, 0); // 设置只获取图片内容,不返回header头信息
curl_multi_add_handle($mh, $ch[$k]); // 添加curl多线程句柄
}
// 开启curl多线程下载图片
do {
$status = curl_multi_exec($mh, $active);
$result = curl_multi_info_read($mh);
if ($result !== false) {
$content = curl_multi_getcontent($result['handle']); // 获取图片内容
$picName = substr($imgArr[$count], strrpos($imgArr[$count], '/')+1); // 获取图片名称
$savePath = ROOT_PATH.'public/goods/img/'; // 设置保存图片的路径
if (!is_dir($savePath)) { // 如果图片路径不存在,则创建路径
@mkdir($savePath, 0777);
}
$saveName = $savePath . $picName; // 设置图片保存为的文件名称
$fp = @fopen($saveName, 'w'); // 打开文件
fwrite($fp, $content); // 把获取到的图片内容写入到新图片
fclose($fp); // 关闭文件句柄
$nowTime = time(); // 当前时间
$takeTime = $nowTime - $lastTime; // 下载此张图片消耗的时间
++$count; // 计数器+1
echo 'downloaded ' . $count . 'th picture take time ' . $takeTime . 's<br/>'; // 输出下载当前图片消耗的时间
$lastTime = $nowTime; // 把当前时间设置为上一张图片下载时间
}
}
while ($status == CURLM_CALL_MULTI_PERFORM || $active);
curl_multi_close($mh); // 关闭curl多线程句柄
$endTime = time(); // 结束下载图片的时间
$totalTime = $endTime - $beginTime; // 总耗时
echo 'end download at ' . date('Y-m-d H:i:s', $endTime) . '<br/>'; // 输出下载图片完成的时间
echo 'downloaded ' . $count . ' pictures take time ' . $totalTime . ' s<br/>'; // 输出总耗时