100行PHP代码轻松下载彼岸图库

770 阅读2分钟
原文链接: mp.weixin.qq.com

与上一篇全自动爬虫不同,这里的代码非常"懒",能手动填写就不用程序写,为了更轻松的学习。

彼岸图网。图片来源为用户免费产生,界面清新简洁。我们进入其中一个【影视】的栏目。

现在我们很容易发现一些规律:栏目url http://pic.netbian.com/4kyingshi/这个栏目有35页,每一页有21张图。每1页url http://pic.netbian.com/4kyingshi/index.html第2页url http://pic.netbian.com/4kyingshi/index_2.html第3页url http://pic.netbian.com/4kyingshi/index_3.html
单个大图片页面urlhttp://pic.netbian.com/tupian/20044.html图片完整下载路径http://pic.netbian.com/uploads/allimg/180428/172429-15249074698872.jpg
实现思路

遍历每一页,获取21张图片的页面路径,然后逐个进入页面,获取大图片的下载地址,执行下载。在程序实现时是完全相反的编码思路,从小到大,先从一个指定大图片url获取一张图地址,由静态到动态。

解析页面用到了file_get_contents发起请求,用PHP自带的DOMDocument对象将返回的HTML字符串解析成DOM对象。

function getDOM($url){    $dom = new DOMDocument();    libxml_use_internal_errors(true);//禁用错误报告    $htmlStr = @file_get_contents($url);    @$dom->loadHTML($htmlStr);    return $dom;}
对于单个大图页面

图片在id="img"的标签内,获取src的写法。注意ByID返回是单个元素,ByTagName返回是数组。这和原生JavaScript的写法异曲同工。

$imgSrc = $dom->getElementById('img')->getElementsByTagName('img')[0]->getAttribute('src');
对于栏目每一页的图片列表

找到最近的具有id的父元素,单个页面的地址在li>a标签内。

$liList=$dom->getElementById('main')->getElementsByTagName('ul')[0]->getElementsByTagName('li');foreach($liList as $li){    $href = $li->getElementsByTagName('a')[0]->getAttribute('href');     //TO DO}
执行效果

文件夹以页码命名。

源代码

扩展:加一层栏目循环就是整站。

<?phpini_set('memory_limit','1024M');    // 临时设置最大内存占用为1Gset_time_limit(0);   // 设置脚本最大执行时间 为0 永不过期 $maxPage = 102; //手动设置最大页数$itemName = '4kyouxi/'; //手动设置栏目$dir = createFileDir($itemName);//img/4kyingshi/for($page=1;$page<=$maxPage;$page++){    $pageURL = getPageURL($page,$itemName);    if($page/3==0){//避免对网站请求过量,这里用休眠休息一会        sleep(10);    }    getOnePageImg($pageURL,$page);}function createFileDir($itemName){    $dir = "img/{$itemName}/";//4kyingshi    if(!is_dir($dir)){        mkdir($dir, 0777, true);   // 如果文件夹不存在,将以递归方式创建该文件夹        echoRow('<br>创建目录'.$dir.'</br>');    }else{        echoRow('<br>目录存在<br>'.$dir.'</br>');    }    return $dir;}function getPageURL($page,$itemName){    $pageURL= '';    $itemURL = "http://pic.netbian.com/{$itemName}/";     if($page==1){        $pageURL =$itemURL.'index.html';    }else{        $pageURL =$itemURL."index_{$page}.html";    }    return $pageURL;}function getOnePageImg($pageURL,$page){    global $dir;    $dom = getDOM($pageURL);    $liList=$dom->getElementById('main')    ->getElementsByTagName('ul')[0]    ->getElementsByTagName('li');    $saveImgDir = $dir.$page;    if(!is_dir($saveImgDir)){        mkdir($saveImgDir, 0777, true);   // 如果文件夹不存在,将以递归方式创建该文件夹        echo '<br>创建目录'.$saveImgDir.'</br>';    }    foreach($liList as $li){        $href = $li->getElementsByTagName('a')[0]->getAttribute('href');        //TO DO        $imgSrc = getImgSrc($href);        $imgName = getImgName($imgSrc);        $imgURL = 'http://pic.netbian.com'.$imgSrc;        downOneImg($imgName,$imgURL,$saveImgDir);    }}function getImgSrc($href){    $url = 'http://pic.netbian.com'.$href;    $dom = getDOM($url);    $imgSrc = $dom->getElementById('img')    ->getElementsByTagName('img')[0]    ->getAttribute('src');    return $imgSrc;}function getImgName($src){    $temp = explode('/',$src);    $length = count($temp);    $imgName = $temp[$length-1];    return $imgName;}function downOneImg($imgName,$imgURL,$saveImgDir){    $saveDir = $saveImgDir.'/'.$imgName;    echoRow('GET=>'.$imgURL.'<br>');    $imgSource = @file_get_contents($imgURL);    @file_put_contents($saveDir,$imgSource);    echoRow('已完成下载=>'.$saveDir.'<br>');}function echoRow($value){    echo $value.'<br>';}function getDOM($url){    $dom = new DOMDocument();    libxml_use_internal_errors(true);//禁用错误报告    $htmlStr = @file_get_contents($url);    @$dom->loadHTML($htmlStr);    return $dom;}

- END -

codenight 创造代码世界的每一天

扫码关注