如何抓取Flickr的图片地址与文件: 邪罗刹的菠萝阁

> 最近小邪准备把博客的图片地址都换成 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:

  1. 不明白能实现什么...貌似能直接放进cookies里面? 不显示? :cool:

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*

Type your comment out:

:wink: :twisted: :surprised: :smile: :sad: :rolleyes: :redface: :razz: :neutral: :mrgreen: :mad: :lol: :idea: :exclaim: :evil: :eek: :cry: :cool: :confused: :biggrin: :arrow:

郑重声明:资讯 【如何抓取Flickr的图片地址与文件: 邪罗刹的菠萝阁】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——