您的位置:首页 > 编程语言 > PHP开发

php爬虫抓取百度贴吧图片

2013-03-30 15:44 363 查看
最近有从百度贴吧上批量下载图片的需求,即从某一个贴吧下载所有图片。

本来打算用python写的,因为对python不熟悉,试了minidom,HtmlParser等,感觉上不了手,还是使用比较擅长的php语言吧。

以下是源代码:

<?php
//运行时间
@set_time_limit(60);
//贴吧名称
$tbname = "%CD%BC%C6%AC";
//抓取类型 0-按照帖子顺序 1-按照贴图顺序
$type = 0;
//列表页url
$listurltpl = "http://tieba.baidu.com/f?kw=%s".($type?"&tp=1":"&pn=");
//图册页url
$galleryurltpl = "http://tieba.baidu.com/photo/bw/picture/guide?kw=%s&tid=%s&next=9999";
//图片url
$imageurltpl = "http://imgsrc.baidu.com/forum/pic/item/%s.jpg";
//本地的目录
$savepath = "h:/images/";
//帖子子文件夹
$filedirtpl = $savepath."%s/";
//图片文件
$filenametpl = $savepath."%s/%s.jpg";

$listurl = sprintf($listurltpl,$tbname);
//抓取起始点
$pn = 0;
while(1)
{
if (!$type) $listurl .= $pn;
//得到列表页源代码
$listhtml = file_get_contents($listurl);
//匹配出帖子id
if($type)
preg_match_all('/<div class=\"aep_wrapper\" id=\"pic_item_(\d+)\" tid=\"\d+\">/',$listhtml,$m1);
else
preg_match_all('/<ul class=\"threadlist_media j_threadlist_media\" id=\"fm(\d+)\"/',$listhtml,$m1);
//得到帖子id列表
$tidlist = $m1[1];
echo "Fetching ... <br /> \r\n";
foreach($tidlist as $tid)
{
echo "--Gallery $tid <br /> \r\n";
$galleryurl = sprintf($galleryurltpl,$tbname,$tid);
//得到帖子图册的源代码
$galleryhtml = file_get_contents($galleryurl);
//匹配出图片id
preg_match_all('/\{\"original\":\{\"id\":\"(\w+)\"/',$galleryhtml,$m2);
//得到图片id列表
$pidlist = $m2[1];
foreach($pidlist as $pid)
{
echo "----Picture {$tid}/{$pid}.jpg ";
$filedir = sprintf($filedirtpl,$tid);
$filename = sprintf($filenametpl,$tid,$pid);
//文件是否存在
if(!is_file($filename))
{
$imageurl = sprintf($imageurltpl,$pid);
//下载图片
$imagebin = file_get_contents($imageurl);
//目录是否存在
if(!is_dir($filedir))
mkdir($filedir);
//保存图片
file_put_contents($filename,$imagebin);
$rnd = rand(2000,5000);
echo "Downloaded! ";
//延时休息
sleep(1.0*$rnd/1000);
echo "Sleep $rnd us <br />\r\n";
}
else
echo "Existed! <br />\r\n";
}
}
//翻到下一页
if (!$type) $pn += 50;
}


运行测试:

程序基本上可以满足要求,但是长时间抓取图片时,百度会弹出验证码,此时使用猫重新拨号即可更换IP继续抓取图片。

(仅供学习参考,请勿用来做非法的事情。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: