邪罗刹的菠萝阁


> 最近小邪准备把博客的图片地址都换成 Flickr 上面的图片地址,所以需要用抓取来节省时间。
> 恩恩,纯粹是节省时间,抓取对很多盆友都是不好的事情,小邪的站也被抓过,很杯具。

> 那么,在这里小邪就讲解一下如何使用 PHP 的 CURL 函数和正则式抓取 Flickr 的图片。
> 首先用 Curl 带 Cookies 地抓页面代码,然后用正则分离出图片Code,最后得到大尺寸地址。

> Rencently, Evlos prepare to change the image urls in my article to the image urls in Flickr.
> So, I think I should use php program to catch urls in Flickr for saving time.
> Um .. Just for saving time, curl isn't a good tools for lots of people.
> Because it can get the whole data in website and make a mirror site for gaining money.
> And I suffered this last month, it's a tragedy.

> First of all, use curl get the html data. We should post some cookies in same time.
> Then use regex to get the code for images. At last, we use image code to get image url.

一. 分析一下地址 Analyse url:

1. 用户地址 User url -

> http://www.flickr.com/photos/46051661@N04
> 比如小邪的用户地址就是这个样子的,很规则,处理有规则的东西是最方便的鸟。

> For example, this is my album url. It's very regular and can easy to deal with it.

2. 相片集地址 Album url -

> http://www.flickr.com/photos/46051661@N04/sets/72157623167782492
> 恩恩,后面是一个 Sets 表示相片集,然后是相片集本身的 Code。
> 小邪喜欢把这些唯一性的字符称为 Code,呵呵,这样比较好说一点儿。

> Um .. It contains a sets code rearward and a user code in der mitte.
> Evlos like called the unique character as code. Haha, it's easily explained.

3. 单张相片地址 Single image url -

> http://www.flickr.com/photos/46051661@N04/4259923860/
> http://www.flickr.com/photos/46051661@N04/4259923860/in/set-72157623167782492
> 嘎嘎,有两种,其实都是一模一样的页面来着,所以咱挑上面的短的。

> :) , Flickr offer two kinds of url, but it will heading us to a same page.
> So, certainly, we choose the shorter url.

4. 单张相片大尺寸地址 Single image url for big size -

> 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可以开工了。

> In general, my image is limit in 600px and i can get the full size by "o".
> Bacause Flickr limit the size of image by 1024px for free users.
> And "L" is a code for the image exceed 1024px and offer 1024px image.
> Haha, and the remaining four size. Like M S T SQ, so let's beginning.

二. 开始抓取 Begin to catch:

1. 抓取相片 Code 代码 Catch the code of image:

> $sa[0] 里面储存的是相片的 Code,$sa[1] 储存的是相片的标题。
> 而 $sa[2][0] 储存的是相片个数,因为这里是二维数组,小邪不想要 Foreach。
> 虽然双层 Foreach 可以遍历二维数组,不过这里只需要作为两个一维数组就好。

> Put the codes of image in $sa[0]. And put the title of image in $sa[1].
> And put the numbers of images into $sa[2][0], bacause it's 2d array.
> And Evlos don't want to use foreach. Though i can use double-layer foreach.
> I just need to use two 1d array, it's enough.

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] 是储存第一个括号中匹配内容的数组,而 $save[2] 则是第二个括号的。
> 那么还有一个,是 $save[0],这个当然就是整串正则式匹配的字符咯,O(∩_∩)O。

> We put the content in firstly bracket into $save[1].
> And the same meaning to content in secendly bracket.
> So, the $save[0] is use to putting the whole content that get by regex.

2. 抓取图片地址:

> 恩,这里整个页面也就一张 JPG 或者 PNG 的大图了(页面元素是 GIF)。
> 所以咱们这样子抓下来。╮(╯▽╰)╭,可怜的 Flickr,被偶剥得半裸了。
> 嘎嘎,差不多就 619 那根全裸男一样了(619 童鞋一定要小邪给他开个裸奔帝国传送门)。

> Um .. The whole image page is just include one jpg or one png url.
> So we can easily get it by regex like the following content.

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 的访问头部。然后是一些必要的参数。

> Because if we login, we can see the all images in set page.
> So we post the cookies to Flickr, and get the html code.
> Haha .. Same as ever, we like simulate the header of firefox.

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 信息麻烦自行找到,小邪太懒了╮(╯▽╰)╭。
// The example method like the following content. Please get the cookies by yourself.
app_get_html('http://www.flickr.com/photos/46051661@N04/sets/72157623167782492',
$cookie='cookie_accid=16212532;cookie_epass=816e23c7b24aa6q9f13713e7503de07f;')

4. 程序运行过程 The process of running:

> 首先麻烦自行搞到 Flickr 的 Cookies,然后把相片集页面包含的相片 Code 全部抓取来。
> 保存到数据库之类的地方(因为咱们可能会经常超时),一条一条读取数据库中保存的 Code。

> 然后获取图片页面中的 Url,保存到数据库,如果 Url 已经储存就不去抓取了。
> 因为 100% 会出现超时,所以得这样,然后到时候刷新下接着干就好了,嘿嘿。

> 请原谅小邪没有把完整源代码贴出来,因为怕引起 Flickr 官方的注意,虽然可能性不会很大。
> 但是还是小心一点儿为好。而且全部的主要代码已经贴出来了,储存数据库相信你能搞定的。
> 呵呵,时间又到两点多钟了,小邪很想睡觉鸟 Zzzzzzzzzz 晚安喔,小邪这就去把床给上了。

> First of all, get the cookies for yourself. Then get the codes for images.
> Save them into database or something like that. And read data one by one.

> Get the url for single image file and save to db, if it's exist, just skip up.
> Beacuse we will reach the time excceed. So just need to refresh the page.

三. 这难道是水军路过?!:

> 截图留念,╮(╯▽╰)╭,人家都是拍照留念,但小邪没事最喜欢截图留念了。

Leave a comment
117 Comments.
  1. 漠岚 Mozilla Firefox Windows 坐沙发!#1

    我的沙发!!!!!!!!!

    @
  2. 漠岚 Mozilla Firefox Windows 坐板凳!#2

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

    @
    • @漠岚 , = =,汗,小邪也不明白你看懂了什么,杯具 ~
      小邪只是要把一个相片集里面的所有图片的O尺寸图片地址全部抓来 ~
      然后就可以批量把博客中原本內链的图片地址替换掉了 ~

      @
    • @漠岚 , 小邪文中是这样说的:
      -------
      请原谅小邪没有把完整源代码贴出来,因为怕引起 Flickr 官方的注意。
      虽然可能性不会很大,但是还是小心一点儿为好。
      而且全部的主要代码已经贴出来了,储存数据库相信你能搞定的。
      -------
      所以只是给出了3个最主要的函数,其他的代码只有几行而已 ~
      就不贴了 ~ 当然也没有写显示的代码 ~
      需要显示的话用 print_r(); 函数把小邪的函数包起来就好了 ~

      @
    • @漠岚 , 额,最终目的是这个 ~
      当然也可以实现批量备份自己的照片到本地 ~

      @
    • @漠岚,
      哎呀,装老鸟 :evil:

      @
  3. 619 Mozilla Firefox Windows 躺地板!#3

    :mad: 不是让你开我的传送门,而是让你专为我开个文章传送门(我能看得懂的那种文章) :cool:

    @
  4. kaka Mozilla Firefox Windows 天花板!#4

    小邪,BOSS昨天又再次去开会。这次回来,告诉咱们已经不是要保住客户那么简单了,现在是要保住自己的证啊。。
    这打压很疯狂啊。。。 现在要求各区域的商家只能做该地区的生意。而且签合同要 面对面。WTF!
    我好担心我会失业。。- -

    @
  5. Jerry Chen Safari Mac OS 下水道!#5

    LS在说什么没听明白 :exclaim:

    @
    • @Jerry Chen , 恩,他是国内主机和域名公司的职员 ~

      @
    • @Jerry Chen,
      现在打压网络是单关乎广大站长。。
      那些网络公司(主机域名商)都要歇菜了。。派对上头想希望几家独大,以后好监管我们广大网民,而小的公司全部自灭~ 我就是在一家小的公司了。。

      @
  6. Kada Internet Explorer Windows 地心!#6

    "关于"里面的flickr图片用不了了!

    @
  7. “关于”页面里面的flickr图片用不了了。

    @
  8. 老万那很坚挺的 不要紧~ :idea:

    @
  9. 晕,我的又挂了?

    @
  10. flickr是不是被墙过?

    @
  11. 貌似没有看到处理下一页。。。

    @
  12. 是看不大明白啊,是不是说你取得什么Flickr的cookies然后存在访问你博客的人的电脑里,从而实现可以正常浏览你博客上的图片啊? :mad:

    @
    • @九站 , = =,天哪 ~
      听小邪说好了,Flickr登陆之后你的相册集页面可以看到整个相册集的所有图片 ~
      但是未登录的时候是要分页的 ~ 分页太麻烦鸟 ~
      Cookies 是确认你登录的信息,所以我们用 Curl 把 Cookies 发过去 ~
      这样他就以为你登录了,这是模拟登录 ~
      ╮(╯▽╰)╭

      @
  13. 邪恶...

    @
  14. 我热,这几天没沙发。。。下次继续争取。。

    @
  15. 没有过Flickr

    @
  16. 不介意的话 +q 578841632

    @
  17. Flickr的访问速度貌似有点慢

    @
  18. 我十分怀疑移动在搞封锁,不让我上Flickr,而且iTunes也上不去,太囧了~

    @
  19. flicker不知道能用多久哦,我原来的博客用的是picasso。。。

    @
  20. Flickr没用过

    @
  21. 回来 来小邪这坐坐 我用的就是flickr :rolleyes:

    @
    • @sweetdrug , 咦,你刚刚发了篇godaddy图床教程,偶还以为你在那儿放图来着 ~
      嘎嘎,原来在 Flickr,握手握手 ~!

      @
  22. :cry: 还好我现在照片有空间传了 不放yupoo了- -.

    @
  23. 很遗憾的就是 Flickr在中国太不稳定了,有些图片老是挂,唉

    @
  24. 我还是怕它不稳定,昨天花了60块钱,专门买了一个北京的多线主机做图床!

    @
  25. 限制流量真的是个杯具……我以前也是IDC公司的……在公司的Windows主机上架设的WP,不限制流量~哇咔咔~当然是限制IIS连接数的,我自己动手上去给取消了,还建立了一个独立程序池……我真的是太坏了……
    博主是搞PHP的么……好强大的说

    @
    • @kenshin , 嘿嘿嘿,你太有才了 ~
      这叫资源重利用,防止浪费,灰常好!
      叫我小邪就好,小邪是金融专业的 ╮(╯▽╰)╭ ~

      @
  26. 图片的资源问题确实是大事,等有时间我也需要弄一下! :idea:

    @
  27. 这莫非就是传说中的偷窥@!

    @
  28. flickr传闻外链常抽风啊,我还是不弄图床了,主机还好用~

    @
    • @羽中 , 嘎嘎,小邪花了一周搞定了一个程序 ~
      可以wp的数据库表读取图片地址,随时切换内外链 ~
      自动检测內链的图片文件,生成內链地址 ~
      嘻嘻 ~

      @
  29. 小邪好强大。。。。你和阿吴都是技术强人啊.....就是我看不懂。。。原谅我飘过~
    不过我不用flickr...因为容易被和谐~我用photobucket :arrow:

    @
  30. 我也用flicker。这招够牛叉,管用

    @
  31. 额,同学,你开始双语啦?

    @
    • @g , 呵呵,今天认识了一位俄国老兄 ~
      对小邪的文章有点兴趣,但是说老用谷歌翻译很难读 ~
      所以小邪试着翻译了一下 ~

      @
  32. 呃,这个,双语,看起来,相当的,专业啊~

    @
  33. 水军图怎么看不到呢~

    @
  34. 把用户名提出来,做成个插件算了!
    我近期要做的正好相反,想把所有Flickr的图片放到自己的服务器上...

    @
    • @lifishake , ╮(╯▽╰)╭,小邪最近也是其他事情很多,杯具 ~
      所以没时间去看WP的插件文档 ~
      你想把Flickr的图片下载了,我这个方法完全适用的 ~
      自动提取地址,然后把地址用迅雷之类的批量下载就好咯 ~

      @
  35. 哈哈,用这个可以窃取别人隐私啦。。。

    @
  36. 貌似frickr有点慢的说

    @
  37. flickr图片挂了,网站没挂,翻墙就能看到图片,悲哀阿

    @
  38. 蓝冰 Mozilla Firefox Windows #38

    别抓了,F已经被中移动干掉好几个月了。

    @
  39. 蓝冰 Mozilla Firefox Windows #39

    赶紧换回来,移动线路一张都看不到。

    @
  40. flickr图片很难打开,半天都见不到一张图片,换成flickr的图床还是要杯具的。

    @
    • @陈佳 , 杯具 ~ 现在小邪是Godaddy图床 ~ 貌似好一点 ~
      怎么小邪这边的网络上Flickr什么的,都很顺畅的样子 ~

      @
  41. 这个方法有点笨了,用API抓取,官方连代码都提供了

    @
    • @bolo , = =,API用不来 ~ 那个啥手册也看的云里雾里 ~
      有空帮帮小邪吗?

      @
      • @邪 罗刹,
        只需把官方的代码修改一下,在显示图片的循环里加上获取图片内容(用file_get_contents就可以了,有些主机没有curl),然后缓存图片。

        @
    • @bolo , 喔,呵呵,待会儿小邪去看看 ~
      完咧, 小邪最近抓取抓上瘾了,啥都想抓 ~ = =

      @
      • @邪 罗刹,
        呵呵,不过你要注意一下,file_get_contents并不能抓取所用网站上的内容,例如Picasa上的图片必须用curl模拟浏览器抓取

        @
    • @bolo , 哦,原来如此 ~ 多谢那么详细为小邪解惑 ~

      @
  42. 哇,好麻烦不想看了,标个记号,有需求的时候找你帮忙 :smile:

    @
  43. 嗯 不错 记得有个python的api

    @

Leave a Reply


[ Ctrl + Enter ]

Trackbacks and Pingbacks: