<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>轻松下载</title>
<link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<form method="post">
<div class="form-group">
<label for="exampleInputEmail1">输入贴吧帖子的url:</label>
<input type="url" name="url" class="form-control" id="exampleInputEmail1" placeholder="https?://tieba.baidu.com/p/**********">
</div>
<button type="submit" class="btn btn-primary btn-block">Submit</button>
</form>
</body>
</html>
<?php
if(!isset($_POST['url'])){
exit();
}
$url = $_POST['url'];
set_time_limit(0);
//匹配img url
$imgPreg = '/src\=\"(http.+?)\"/';
//判断是否为合格的帖子链接
if(!preg_match('/^https?\:\/\/tieba\.baidu\.com\/p\/\d{9,11}/',$url,$tbUrl)){
echo 'URL错误!示例:"http://tieba.baidu.com/p/4407589179"';
exit();
}
$url = $tbUrl[0];
//判断是http还是htpps的连接采取相应的正则
if(preg_match('/^http\:\/\//', $url)){
//匹配出回复的内容
$preg = '/class\=\"d_post_content\s+j_d_post_content\s+clearfix\"\>\s+(.+?)\<\/div\>\<br\>/';
}else{
$preg = '/class\=\"d_post_content\s+j_d_post_content\s+\"\>\s+(.+?)\<\/div\>\<br\>/';
}
//得到源码
$content = _request($url);
//如果返回的源码为空
if(!$content){
echo 'URL返回NULL,请检查!';
exit();
}
echo '<p style="color:red;">--------------------URL:"'.$url.'"打开成功--------------------</p>';
//刷新缓冲,将数据发送到浏览器
ob_flush();
flush();
//页数默认为1
$pageCount = 1;
//得到总页数
if(preg_match('/\?pn\=(\d+)\"\>尾页\<\/a\>/',$content ,$page)){
$pageCount = $page[1];
}
echo '<p style="color:red;">--------------------帖子共有'.$pageCount.'页--------------------</p>';
echo '<p style="color:red;">--------------------正在读取帖子内所有图片--------------------</p>';
//刷新缓冲,将数据发送到浏览器
ob_flush();
flush();
//图片链接数组
$imgData= [];
//当前页
$pageNow = 1;
do{
if($pageNow>1){
$nowUrl = $url.'?pn='.$pageNow;
$content = _request($nowUrl);
}
//当前页数自增
$pageNow++;
//匹配回复
preg_match_all($preg, $content, $replyData);
$pageImgCount = 0;
//遍历回复
foreach ($replyData[1] as $value) {
//过滤回复,获取jpg url数组
if(preg_match_all($imgPreg, $value,$data)){
foreach ($data[1] as $value) {
//过滤掉表情
if(substr_count($value,'static')|substr_count($value,'image_emoticon')){
continue;
}
$imgData[] = $value;
$pageImgCount++;
}
}
}
echo '<p style="font-size:12px;">第'.($pageNow-1).'页过滤完毕,读取图片'.$pageImgCount.'张,亲稍等···</p>';
ob_flush();
flush();
/* //延迟加载
sleep(500);*/
}while($pageNow<=$pageCount);
//去重
$imgData = array_unique($imgData);
echo '<p style="color:red;">--------------------读取完毕,有效图片:'.count($imgData).'张--------------------</p>';
echo '<p style="color:red;">--------------------开始下载图片,请勿关闭浏览器--------------------</p>';
ob_flush();
flush();
echo '<span style="font-size:12px;">当前下载</span>';
//存储到本地的图片数量
$imgCount = 0;
foreach ($imgData as $value) {
if(jpgChangeLocal($value)){
$imgCount++;
echo '<span style="font-size:12px;">+</span>';
ob_flush();
flush();
}
}
echo '<p style="color:red;">--------------------程序结束,总计下载图片'.$imgCount.'张--------------------</p>';
echo '<p style="color:red;">--------------------文件路径c:\chenglin_image--------------------</p>';
//抓取(支持get/post)
function _request($curl,$https=true,$method='GET',$data=null){
//1.创建一个新cURL资源
$ch = curl_init();
//2.设置URL和相应的选项
//要访问的网站
curl_setopt($ch, CURLOPT_URL, $curl);
//启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_HEADER, false);
//将curl_exec()获取的信息以字符串返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if($https){
//FALSE 禁止 cURL 验证对等证书(peer's certificate)。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//可以省略不写,默认为2
/* curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //验证主机 */
}
if($method == 'POST'){
//发送 POST 请求
curl_setopt($ch, CURLOPT_POST, true);
//全部数据使用HTTP协议中的 "POST" 操作来发送。
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
//3.抓取URL并把它传递给浏览器
$content = curl_exec($ch);
if ($content === false) {
return "网络请求出错: " . curl_error($ch);
exit();
}
//4.关闭cURL资源,并且释放系统资源
curl_close($ch);
return $content;
}
//网络图片转换本地图片
function jpgChangeLocal($pic){
//获取文件
$file = _request($pic);
$end = rand(1000,9999).'_'.time().'.jpg';
$dir_path = 'd:/image';
if(!is_dir($dir_path)){
mkdir($dir_path);
}
$filename = $dir_path.'/'.$end;
//打开写入流
$resource = fopen($filename, 'a');
//写入
fwrite($resource, $file);
//关闭资源
fclose($resource);
return '@'.dirname(__FILE__).'/'.$filename;
}
?>