> 最近小邪准备把博客的图片地址都换成 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.
三. 这难道是水军路过?!:

> 截图留念,╮(╯▽╰)╭,人家都是拍照留念,但小邪没事最喜欢截图留念了。
- Pingback on 2010/05/24/ 04:23
我的沙发!!!!!!!!!
@漠岚 , 呵呵,早点睡吧,小邪去睡了呢,晚安 ~
不明白能实现什么...貌似能直接放进cookies里面? 不显示?
@漠岚 , = =,汗,小邪也不明白你看懂了什么,杯具 ~
小邪只是要把一个相片集里面的所有图片的O尺寸图片地址全部抓来 ~
然后就可以批量把博客中原本內链的图片地址替换掉了 ~
@邪 罗刹,
那就是减少流量咯!
@漠岚 , 小邪文中是这样说的:
-------
请原谅小邪没有把完整源代码贴出来,因为怕引起 Flickr 官方的注意。
虽然可能性不会很大,但是还是小心一点儿为好。
而且全部的主要代码已经贴出来了,储存数据库相信你能搞定的。
-------
所以只是给出了3个最主要的函数,其他的代码只有几行而已 ~
就不贴了 ~ 当然也没有写显示的代码 ~
需要显示的话用 print_r(); 函数把小邪的函数包起来就好了 ~
@漠岚 , 额,最终目的是这个 ~
当然也可以实现批量备份自己的照片到本地 ~
@漠岚,
哎呀,装老鸟
@619 , = =,可是小邪这里没有黄色文章呀?!
小邪,BOSS昨天又再次去开会。这次回来,告诉咱们已经不是要保住客户那么简单了,现在是要保住自己的证啊。。
这打压很疯狂啊。。。 现在要求各区域的商家只能做该地区的生意。而且签合同要 面对面。WTF!
我好担心我会失业。。- -
@kaka , 哎,人生不如意,十有八九 ~
淡定,你要相信以你自己的能力就算失业了也能找到更好的工作 ~!
@邪 罗刹,
今年的实名制如真的实施。。噢。。FU+-CK!
@kaka , 实名制是灾难性的,外国的域名公司估计差不多挣翻了吧 ~
LS在说什么没听明白 :exclaim:
@Jerry Chen , 恩,他是国内主机和域名公司的职员 ~
@Jerry Chen,
现在打压网络是单关乎广大站长。。
那些网络公司(主机域名商)都要歇菜了。。派对上头想希望几家独大,以后好监管我们广大网民,而小的公司全部自灭~ 我就是在一家小的公司了。。
"关于"里面的flickr图片用不了了!
@Kada , 囧,关于里面的Flickr图片?!
汗,小邪现在还没有在用Fllickr额 ~
你刷新下看看 ~
“关于”页面里面的flickr图片用不了了。
@Kada , 额,重复的小邪就跳过了 ~
老万那很坚挺的 不要紧~
@老七 , 嘿嘿,现在又可以上了 ~
@邪 罗刹,
老万很嚣张的告诉我 数据库还有百分之八十
赤裸裸的挑衅啊
@老七 , 哎呀呀,啥时候你们去灭灭他老人家的锐气 ~
@邪 罗刹,
恩 我也觉得 组团记得叫上我 :surprised:
@老七 , 恩恩,你们组团也记得叫偶 ~
@邪 罗刹,
恩恩 必须的 你不在没有乐趣 哈哈
晕,我的又挂了?
@万戈 , ╮(╯▽╰)╭,昨天半夜截的图来着 ~ 杯具 ~
flickr是不是被墙过?
@阿吴 , 呵呵,是的 ~ 现在又可以访问了 ~
貌似没有看到处理下一页。。。
@fatkun , 呵呵,是的,使用 Cookies 登录之后一页可以看到全部的 ~
是看不大明白啊,是不是说你取得什么Flickr的cookies然后存在访问你博客的人的电脑里,从而实现可以正常浏览你博客上的图片啊?
@九站 , = =,天哪 ~
听小邪说好了,Flickr登陆之后你的相册集页面可以看到整个相册集的所有图片 ~
但是未登录的时候是要分页的 ~ 分页太麻烦鸟 ~
Cookies 是确认你登录的信息,所以我们用 Curl 把 Cookies 发过去 ~
这样他就以为你登录了,这是模拟登录 ~
╮(╯▽╰)╭
@邪 罗刹,
强大了。
邪恶...
@苏扬 , 小邪很坏的喔 ~ :surprised:
我热,这几天没沙发。。。下次继续争取。。
@Nox , ╮(╯▽╰)╭,加座,加座先 ~
没有过Flickr
@江流 , ╮(╯▽╰)╭,小邪的语文不好,只好用图片来表达自己的意思 ~ :redface:
@邪 罗刹,
高手出来了,对了,我想请教下301的问题=。=
@江流 , 唔?301怎么了?请说详细一点 ~
@邪 罗刹,第一点,要将旧域名解析、绑定到新主机?
@江流 , 恩,这个不重要 ~
只要旧域名还可以打开就行 ~
我们在旧域名指向的主机里面根目录加入一个 .htaccess 文件 ~
例如小邪要把自己的博客转移到 soulsolo.org ~ 就这样 ~
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !www.evlos.org$ [NC] RewriteRule ^(.*)$ http://www.soulsolo.org/$1 [L,R=301] [R=301,L]Ok,然后就不用管了,专心弄你的新域名吧 ~
不介意的话 +q 578841632
@江流 , 呵呵,请查看邮箱 ~
Flickr的访问速度貌似有点慢
@SATURN , ╮(╯▽╰)╭ 希望和小邪这里的速度没多大差别 ~
我十分怀疑移动在搞封锁,不让我上Flickr,而且iTunes也上不去,太囧了~
@exia , = =,希望你能访问Flickr的图片文件,不然小邪就成茶几了 ~ = =
flicker不知道能用多久哦,我原来的博客用的是picasso。。。
@freetao , Picasa 太杯具了 ~ 春哥保佑 Flickr 吧 ~
小邪到时候写个程序自由切换内外链就好鸟 ~
Flickr没用过
@Auston Jary , 汗 ~ Flickr 难道也差不多和 Youtobe 一样杯具鸟 ?!
是youtube。。。
Flickr貌似很危险
@Auston Jary , 囧,youtube ~
呵呵,小邪对 Flickr 还是比较看好的 ~
只能求春哥保佑了 ~
@邪 罗刹,
Flickr真的这么强?
那我也去注册个号
@Auston Jary , 呵呵,小邪已经把博客283张图片全换成Flickr地址了,你可以到处看看 ~
回来 来小邪这坐坐 我用的就是flickr :rolleyes:
@sweetdrug , 咦,你刚刚发了篇godaddy图床教程,偶还以为你在那儿放图来着 ~
嘎嘎,原来在 Flickr,握手握手 ~!
@mice , = =,小邪的流量真是个杯具 ~
很遗憾的就是 Flickr在中国太不稳定了,有些图片老是挂,唉
@SErHo , ╮(╯▽╰)╭,╮(╯▽╰)╭,╮(╯▽╰)╭ ~~~
春哥大菊花保佑 ~
我还是怕它不稳定,昨天花了60块钱,专门买了一个北京的多线主机做图床!
@真好网 , 囧,原来多线主机是这么便宜的,额滴神 ~
限制流量真的是个杯具……我以前也是IDC公司的……在公司的Windows主机上架设的WP,不限制流量~哇咔咔~当然是限制IIS连接数的,我自己动手上去给取消了,还建立了一个独立程序池……我真的是太坏了……
博主是搞PHP的么……好强大的说
@kenshin , 嘿嘿嘿,你太有才了 ~
这叫资源重利用,防止浪费,灰常好!
叫我小邪就好,小邪是金融专业的 ╮(╯▽╰)╭ ~
图片的资源问题确实是大事,等有时间我也需要弄一下!
@北街 , 呵呵,是呀,图片消耗流量好快呢 ~
这莫非就是传说中的偷窥@!
@低调VS飞翔 , = =,囧,也不差啦 ~ O(∩_∩)O哈 ~
flickr传闻外链常抽风啊,我还是不弄图床了,主机还好用~
@羽中 , 嘎嘎,小邪花了一周搞定了一个程序 ~
可以wp的数据库表读取图片地址,随时切换内外链 ~
自动检测內链的图片文件,生成內链地址 ~
嘻嘻 ~
小邪好强大。。。。你和阿吴都是技术强人啊.....就是我看不懂。。。原谅我飘过~
不过我不用flickr...因为容易被和谐~我用photobucket
@smigoo , 呵呵,没事呢,欢迎飘过 CSS 大湿呐 ~
老衲这厢有礼了 ~
我也用flicker。这招够牛叉,管用
@Rusaer , 呵呵,谢谢支持 ~
额,同学,你开始双语啦?
@g , 呵呵,今天认识了一位俄国老兄 ~
对小邪的文章有点兴趣,但是说老用谷歌翻译很难读 ~
所以小邪试着翻译了一下 ~
呃,这个,双语,看起来,相当的,专业啊~
@路人假 , 呵呵,今天认识了一位俄国老兄 ~
对小邪的文章有点兴趣,但是说老用谷歌翻译很难读 ~
所以小邪试着翻译了一下 ~
@邪 罗刹,
啊,为了一个人写这么多字,你的精神感动了我~
不如你顺便搞个自动翻译插件出来吧~
@路人假 , 汗 ~ 自动翻译?调用谷歌翻译系统?
杯具,就是因为自动翻译效果不好,小邪才自己写的啊 ~
水军图怎么看不到呢~
@疾风 , Juses,别吓小邪啊 ~
请看看这个地址能否打开 -
http://farm3.static.flickr.com/2716/4261026903_42b65b6cf6_o.jpg
小邪今天把图片都换成Flickr上面的地址了 ~
@邪 罗刹,
恩 现在看到了
@疾风 , 幸好幸好 ~ ╮(╯▽╰)╭
把用户名提出来,做成个插件算了!
我近期要做的正好相反,想把所有Flickr的图片放到自己的服务器上...
@lifishake , ╮(╯▽╰)╭,小邪最近也是其他事情很多,杯具 ~
所以没时间去看WP的插件文档 ~
你想把Flickr的图片下载了,我这个方法完全适用的 ~
自动提取地址,然后把地址用迅雷之类的批量下载就好咯 ~
哈哈,用这个可以窃取别人隐私啦。。。
@萄葡 , 囧,怎么窃取 ~ = =
貌似frickr有点慢的说
@阿士 , 杯具 ~ 希望和小邪原先差不了多少 ~
小邪昨天早上就全部换成了Flickr上的图片了 ~
flickr图片挂了,网站没挂,翻墙就能看到图片,悲哀阿
@第三眼 , 别吓小邪喔 ~ 貌似只有你一个人没看到图呀 ~
天呐,你用的啥网络?好杯具喔 ~
别抓了,F已经被中移动干掉好几个月了。
@蓝冰 , 天哪 ~ ( ⊙o⊙ )哇
赶紧换回来,移动线路一张都看不到。
@蓝冰 , 好的好的 ~ 待会儿看看Gd的免费空间合不合用 ~
flickr图片很难打开,半天都见不到一张图片,换成flickr的图床还是要杯具的。
@陈佳 , 杯具 ~ 现在小邪是Godaddy图床 ~ 貌似好一点 ~
怎么小邪这边的网络上Flickr什么的,都很顺畅的样子 ~
这个方法有点笨了,用API抓取,官方连代码都提供了
@bolo , = =,API用不来 ~ 那个啥手册也看的云里雾里 ~
有空帮帮小邪吗?
@邪 罗刹,
只需把官方的代码修改一下,在显示图片的循环里加上获取图片内容(用file_get_contents就可以了,有些主机没有curl),然后缓存图片。
@bolo , 喔,呵呵,待会儿小邪去看看 ~
完咧, 小邪最近抓取抓上瘾了,啥都想抓 ~ = =
@邪 罗刹,
呵呵,不过你要注意一下,file_get_contents并不能抓取所用网站上的内容,例如Picasa上的图片必须用curl模拟浏览器抓取
@bolo , 哦,原来如此 ~ 多谢那么详细为小邪解惑 ~
哇,好麻烦不想看了,标个记号,有需求的时候找你帮忙
@Youwei , 呵呵,请随意哈 ~
嗯 不错 记得有个python的api
@丕子 ,
