php爬虫抓取百度贴吧图片

时光毁灭记忆、已成空白 提交于 2019-11-28 16:34:07

最近有从百度贴吧上批量下载图片的需求,即从某一个贴吧下载所有图片。

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

以下是源代码:

 1 <?php
 2 //运行时间
 3 @set_time_limit(60);
 4 //贴吧名称
 5 $tbname = "%CD%BC%C6%AC";
 6 //抓取类型 0-按照帖子顺序 1-按照贴图顺序
 7 $type = 0;
 8 //列表页url
 9 $listurltpl = "http://tieba.baidu.com/f?kw=%s".($type?"&tp=1":"&pn=");
10 //图册页url
11 $galleryurltpl = "http://tieba.baidu.com/photo/bw/picture/guide?kw=%s&tid=%s&next=9999";
12 //图片url
13 $imageurltpl = "http://imgsrc.baidu.com/forum/pic/item/%s.jpg";
14 //本地的目录
15 $savepath = "h:/images/";
16 //帖子子文件夹
17 $filedirtpl = $savepath."%s/";
18 //图片文件
19 $filenametpl = $savepath."%s/%s.jpg";
20 
21 $listurl = sprintf($listurltpl,$tbname);
22 //抓取起始点
23 $pn = 0;
24 while(1)
25 {
26     if (!$type) $listurl .= $pn;
27     //得到列表页源代码
28     $listhtml = file_get_contents($listurl);
29     //匹配出帖子id
30     if($type)
31         preg_match_all('/<div class=\"aep_wrapper\" id=\"pic_item_(\d+)\" tid=\"\d+\">/',$listhtml,$m1);
32     else
33         preg_match_all('/<ul class=\"threadlist_media j_threadlist_media\" id=\"fm(\d+)\"/',$listhtml,$m1);
34     //得到帖子id列表
35     $tidlist = $m1[1];
36     echo "Fetching ... <br /> \r\n";
37     foreach($tidlist as $tid)
38     {
39         echo "--Gallery $tid <br /> \r\n";
40         $galleryurl = sprintf($galleryurltpl,$tbname,$tid);
41         //得到帖子图册的源代码
42         $galleryhtml = file_get_contents($galleryurl);
43         //匹配出图片id
44         preg_match_all('/\{\"original\":\{\"id\":\"(\w+)\"/',$galleryhtml,$m2);
45         //得到图片id列表
46         $pidlist = $m2[1];
47         foreach($pidlist as $pid)
48         {
49             echo "----Picture {$tid}/{$pid}.jpg ";
50             $filedir = sprintf($filedirtpl,$tid);
51             $filename = sprintf($filenametpl,$tid,$pid);
52             //文件是否存在
53             if(!is_file($filename))
54             {
55                 $imageurl = sprintf($imageurltpl,$pid);
56                 //下载图片
57                 $imagebin = file_get_contents($imageurl);
58                 //目录是否存在
59                 if(!is_dir($filedir))
60                     mkdir($filedir);
61                 //保存图片
62                 file_put_contents($filename,$imagebin);
63                 $rnd = rand(2000,5000);
64                 echo "Downloaded! ";
65                 //延时休息
66                 sleep(1.0*$rnd/1000);
67                 echo "Sleep $rnd us <br />\r\n";
68             }
69             else
70                 echo "Existed! <br />\r\n";
71         }
72     }
73     //翻到下一页
74     if (!$type) $pn += 50;
75 }

运行测试:

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

(仅供学习参考,请勿用来做非法的事情。)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!