Ruby中使用mechanize批量下载校内网相册照片
自己闲来无事,用mechanize做了一个可以下载校内相册照片的代码。
写的有些简陋。。。。主要是根据相册的地址来分析用户ID和相册ID,然后模拟请求相册页面,并提取所有照片,然后下载到本地的一个文件夹中。
ruby版本:ruby1.8.7orruby1.9.2
操作系统:windows7
Linux下没有试过~不过应该也可以的:
#encoding:utf-8 require'rubygems' require'mechanize'
classRenren
definitialize(e,p) @agent=Mechanize.new @page=@agent.get('http://3g.renren.com/') @page=@page.form_with(:method=>'POST')do|r| r.email=e r.password=p end.submit end
deffetch_other_photo(album_link,foldername) photo_urls=[] putsIconv.conv("gb2312","utf-8","开始分析相册地址.....") begin user_id,album_id=parse_album_uri(album_link) rescue putsIconv.conv("gb2312","utf-8","您的相册地址不正确,请重新输入!") return end page=@agent.get("http://3g.renren.com/album/wgetalbum.do?id=#{user_id}&owner=#{album_id}") putsIconv.conv("gb2312","utf-8","正在获取所有照片地址.....") loopdo page.links_with(:href=>/http:\/\/3g\.renren\.com\/album\/wgetphoto\.do?/).eachdo|link| photo=link.click photo_urls<<photo.link_with(:text=>"下载该图").href end breakifpage.link_with(:text=>"下一页").nil? page=page.link_with(:text=>"下一页").click end ifphoto_urls.length>0 putsIconv.conv("gb2312","utf-8","开始下载相册.....") unlessFile.directory?("#{foldername}") Dir.mkdir("#{foldername}") end Dir.chdir("#{foldername}")do|path| photo_urls.eachdo|photo_url| @agent.get(photo_url)do|photo| putsIconv.conv("gb2312","utf-8","正在保存文件#{photo.filename}……已经下载#{((photo_urls.index(photo_url)+1).to_f/photo_urls.length*100).to_i}%") photo.save end end end putsIconv.conv("gb2312","utf-8","相册下载完毕.....") else putsIconv.conv("gb2312","utf-8","相册内没有照片哟~") end end
private
defparse_album_uri(uri) uri=uri.chomp("#thumb") uri=uri.split("?") ifuri.length>1anduri[1].include?("owner") uri=uri[1].split("&") user_id=uri[0].split("=")[1] album_id=uri[1].split("=")[1] else uri=uri[0].split("/") album_id=uri[4] user_id=uri[5].split("-")[1] end returnuser_id,album_id end end
printIconv.conv("gb2312","utf-8","用户名:") username=gets.chomp() printIconv.conv("gb2312","utf-8","密码:") password=gets.chomp() renren=Renren.new(username,password) loopdo printIconv.conv("gb2312","utf-8","粘贴相册地址:") uri=gets.chomp() renren.fetch_other_photo(uri,username) printIconv.conv("gb2312","utf-8","按0退出程序,按其它键继续下载其它相册:") breakifgets.chomp()=="0" end