您现在的位置是:网站首页> 编程资料编程资料
Ruby中使用mechanize批量下载校内网相册照片_ruby专题_
                     2023-05-26
                415人已围观
                
                2023-05-26
                415人已围观
            
简介 Ruby中使用mechanize批量下载校内网相册照片_ruby专题_
自己闲来无事,用mechanize做了一个可以下载校内相册照片的代码。
写的有些简陋。。。。主要是根据相册的地址来分析用户ID和相册ID,然后模拟请求相册页面,并提取所有照片,然后下载到本地的一个文件夹中。
ruby版本:ruby1.8.7 or ruby1.9.2
 操作系统:windows 7
Linux下没有试过~不过应该也可以的:
#encoding: utf-8
require 'rubygems'
require 'mechanize'
class Renren
  def initialize(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
  def fetch_other_photo(album_link,foldername)
     photo_urls = []
     puts Iconv.conv("gb2312", "utf-8", "开始分析相册地址.....")
     begin
       user_id,album_id = parse_album_uri(album_link)
     rescue
       puts Iconv.conv("gb2312", "utf-8", "您的相册地址不正确,请重新输入!")
       return
     end
     page = @agent.get("http://3g.renren.com/album/wgetalbum.do?id=#{user_id}&owner=#{album_id}")
     puts Iconv.conv("gb2312", "utf-8", "正在获取所有照片地址.....")
     loop do
       page.links_with(:href => /http:\/\/3g\.renren\.com\/album\/wgetphoto\.do?/).each do |link|
         photo = link.click
         photo_urls << photo.link_with(:text => "下载该图").href
       end
       break if page.link_with(:text => "下一页").nil?
       page = page.link_with(:text => "下一页").click
     end
     if photo_urls.length > 0
       puts Iconv.conv("gb2312", "utf-8", "开始下载相册.....")
       unless File.directory?("#{foldername}")
         Dir.mkdir("#{foldername}")
       end
       Dir.chdir("#{foldername}") do |path|
           photo_urls.each do |photo_url|
             @agent.get(photo_url) do |photo|
               puts Iconv.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
       puts Iconv.conv("gb2312","utf-8","相册下载完毕.....")
     else
       puts Iconv.conv("gb2312","utf-8","相册内没有照片哟~")
     end
   end
private
  def parse_album_uri(uri)
     uri = uri.chomp("#thumb")
     uri = uri.split("?")
     if uri.length > 1 and uri[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
     return user_id,album_id
   end
 end
print Iconv.conv("gb2312","utf-8","用户名:")
 username = gets.chomp()
 print Iconv.conv("gb2312","utf-8","密码:")
 password = gets.chomp()
 renren = Renren.new(username,password)
 loop do
   print Iconv.conv("gb2312","utf-8","粘贴相册地址:")
   uri = gets.chomp()
   renren.fetch_other_photo(uri, username)
   print Iconv.conv("gb2312","utf-8","按0退出程序,按其它键继续下载其它相册:")
   break if gets.chomp() == "0"
 end
 
                                
                                                         
                                
                                                         
                                
                                                         
 
    