与上一篇全自动爬虫不同,这里的代码非常"懒",能手动填写就不用程序写,为了更轻松的学习。
彼岸图网。图片来源为用户免费产生,界面清新简洁。我们进入其中一个【影视】的栏目。
现在我们很容易发现一些规律:栏目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 创造代码世界的每一天
扫码关注