> 最近小邪准备把博客的图片地址都换成 Flickr 上面的图片地址,所以需要用抓取来节省时间。
> 恩恩,纯粹是节省时间,抓取对很多盆友都是不好的事情,小邪的站也被抓过,很杯具。
> 那么,在这里小邪就讲解一下如何使用 PHP 的 CURL 函数和正则式抓取 Flickr 的图片。
> 首先用 Curl 带 Cookies 地抓页面代码,然后用正则分离出图片Code,{zh1}得到大尺寸地址。
一. 分析一下地址:
1. 用户地址 -
> http://www.flickr.com/photos/46051661@N04
> 比如小邪的用户地址就是这个样子的,很规则,处理有规则的东西是最方便的鸟。
2. 相片集地址 -
> http://www.flickr.com/photos/46051661@N04/sets/72157623167782492
> 恩恩,后面是一个 Sets 表示相片集,然后是相片集本身的 Code。
> 小邪喜欢把这些{wy}性的字符称为 Code,呵呵,这样比较好说一点儿。
3. 单张相片地址 -
> http://www.flickr.com/photos/46051661@N04/4259923860/
> http://www.flickr.com/photos/46051661@N04/4259923860/in/set-72157623167782492
> 嘎嘎,有两种,其实都是一模一样的页面来着,所以咱挑上面的短的。
4. 单张相片大尺寸地址 -
> http://www.flickr.com/photos/46051661@N04/4259923860/sizes/o/
> 一般来说小邪的 600px 宽度,高度在 600px 以下的,都用地址 O 来查看全图的。
> http://www.flickr.com/photos/46051661@N04/4259923860/sizes/l/
> 因为 Flickr 不提供大图全图,而 L 是图片尺寸过大后被裁减的地址,所以只好用 L 咯。
> 嘎嘎,还有四个尺寸,依次减小,这样子 - M S T SQ,OK可以开工了。
二. 开始抓取咯:
1. 抓取相片 Code:
> $sa[0] 里面储存的是相片的 Code,$sa[1] 储存的是相片的标题。
> 而 $sa[2][0] 储存的是相片个数,因为这里是二维数组,小邪不想要 Foreach。
> 虽然双层 Foreach 可以遍历二维数组,不过这里只需要作为两个一维数组就好。
1 2 3 4 5 6 7 8 9 | function app_get_set_info($data) { $regex = "%\/photos\/46051661@N04\/(\d+)\/in\/set\-\d+\/\" title=\"([a-z0-9A-Z-_]*)\" class%i"; preg_match_all($regex,$data,$save); $sa[0] = $save[1]; $sa[1] = $save[2]; $sa[2][0] = array_count($save[1]); return $sa; } |
> $save[1] 是储存{dy}个括号中匹配内容的数组,而 $save[2] 则是第二个括号的。
> 那么还有一个,是 $save[0],这个当然就是整串正则式匹配的字符咯,O(∩_∩)O。
2. 抓取图片地址:
> 恩,这里整个页面也就一张 JPG 或者 PNG 的大图了(页面元素是 GIF)。
> 所以咱们这样子抓下来。╮(╯▽╰)╭,可怜的 Flickr,被偶剥得半裸了。
> 嘎嘎,差不多就 619 那根全裸男一样了(619 童鞋一定要小邪给他开个裸奔帝国)。
1 2 3 4 5 6 7 8 9 10 | function app_get_ourl($data) { $pagelist_regex = "%<img src=\"(.+.jpg)\"%i"; preg_match_all($pagelist_regex,$data,$save); //print_r($save); if (!isset($save[1][0])) { $pagelist_regex = "%<img src=\"(.+.png)\"%i"; preg_match_all($pagelist_regex,$data,$save); } return $save[1]; } |
3. 带 Cookies 的 Curl:
> 因为登陆后在相片集页面可以看到全部照片,所以咱们用 Curl 把 Cookies 传过去。
> 嘎嘎,老样子,大家都喜欢模拟 FF 的访问头部。然后是一些必要的参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function app_get_html($url,$cookie='') { $curl = curl_init($url); $useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt ($curl, CURLOPT_USERAGENT, $useragent); if ($cookie<>'') { curl_setopt ($curl, CURLOPT_COOKIE, $cookie); } $data = curl_exec($curl); curl_close($curl); return $data; } // 用法如下,Cookies 信息麻烦自行找到,小邪太懒了╮(╯▽╰)╭。 app_get_html('http://www.flickr.com/photos/46051661@N04/sets/72157623167782492', $cookie='cookie_accid=16212532;cookie_epass=816e23c7b24aa6q9f13713e7503de07f;') |
4. 程序运行过程:
> 首先麻烦自行搞到 Flickr 的 Cookies,然后把相片集页面包含的相片 Code 全部抓取来。
> 保存到数据库之类的地方(因为咱们可能会经常超时),一条一条读取数据库中保存的 Code。
> 然后获取图片页面中的 Url,保存到数据库,如果 Url 已经储存就不去抓取了。
> 因为 {bfb} 会出现超时,所以得这样,然后到时候刷新下接着干就好了,嘿嘿。
> 请原谅小邪没有把完整源代码贴出来,因为怕引起 Flickr 官方的注意,虽然可能性不会很大。
> 但是还是小心一点儿为好。而且全部的主要代码已经贴出来了,储存数据库相信你能搞定的。
> 呵呵,时间又到两点多钟了,小邪很想睡觉鸟 Zzzzzzzzzz 晚安喔,小邪这就去把床给上了。
三. 这难道是水军路过?!:
> 截图留念,╮(╯▽╰)╭,人家都是拍照留念,但小邪没事最喜欢截图留念了。
2 Comments:
不明白能实现什么...貌似能直接放进cookies里面? 不显示?