Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.31 KB | None | 0 0
  1. # encoding: utf-8
  2. require 'net/http'
  3. require 'threadpool'
  4. # require 'pry'
  5.  
  6. # {{{ getlist(gall: String, mgall: bool, page: Integer) : 2D array - [num, name, ip, id, date]
  7. def getlist(gall, mgall, page)
  8.   return [] if page.nil?
  9.   result = []
  10.   begin
  11.     result = []
  12.     try = 0
  13.     begin
  14.       source = Net::HTTP.get('gall.dcinside.com',(mgall ? "/mgallery" : "").concat('/board/lists/?id=').concat(gall).concat('&page=').concat(page.to_s))
  15.     rescue
  16.       try += 1
  17.       retry if try < 5
  18.       return []
  19.     end
  20.     source.scan(/ub-content.*?<\/tr>/m).each do |e|
  21.       num = e.match(/#{gall}.*?no=(\d+)/).to_a[1]
  22.       # title = e.match(/\/em>(.*?)<\/a>/).to_a[1]
  23.       name = e.match(/data-nick="(.*?)"/).to_a[1]
  24.       ip = e.match(/data-ip="(.*?)"/).to_a[1]
  25.       id = e.match(/data-uid="(.*?)"/).to_a[1]
  26.       date = e.match(/gall_date" title="(.*?)"/).to_a[1]
  27.      #
  28.      result << [num, name, ip, id, date]
  29.    end
  30.  
  31.    if result.length == 0
  32.      # puts page
  33.      return []
  34.      # puts page
  35.      # puts source
  36.      if source =~ Regexp.new("등록된".force_encoding("ASCII-8BIT"))
  37.        return result
  38.      else
  39.        raise Exception
  40.      end
  41.    end
  42.  rescue Exception => e
  43.    puts e
  44.    retry
  45.  end
  46.  
  47.  return result
  48. end
  49. # }}}
  50.  
  51. puts '디시인사이드 갤러리 잉여랭킹 프로그램'
  52.  
  53. print '갤러리 이름을 입력하세요. (ex.girlgroup) : '
  54. gall = gets.chomp
  55.  
  56. mgall = true
  57. loop do
  58.  print '마이너 갤러리 입니까? (y/n) : '
  59.  break if (mgall = gets.chomp) =~ /y|n/
  60. end
  61. mgall = (mgall == 'y') ? true : false
  62.  
  63. print '시작 페이지를 입력하세요. (ex.1) : '
  64. _start = gets.chomp.to_i
  65. print '마지막 페이지를 입력하세요. (ex.1000) : '
  66. _end = gets.chomp.to_i
  67.  
  68. print '날짜를 입력하세요. (ex. 2018-01-01 00:00:00) '
  69. date = /^#{gets.chomp}/
  70.  
  71. result = []
  72. mutex = Mutex.new
  73. nowpage = 0
  74. total = _end - _start + 1
  75.  
  76. threads = []
  77.  
  78. slice = 1000
  79.  
  80. if total <= slice
  81.  enum = (_start.._end).map{|p| [p]}
  82. else
  83.  enum = (_start.._end).each_slice(slice).reduce(&:zip).map(&:flatten)
  84. end
  85. enum.each do |nums|
  86.  threads << Thread.new do
  87.    nums.each do |page|
  88.      next if page.nil?
  89.      arr = getlist(gall, mgall, page)
  90.      mutex.lock
  91.      result.concat arr
  92.      #
  93.      # puts page if arr.length == 0
  94.      nowpage += 1
  95.      print "\r(#{nowpage} / #{total})"
  96.       mutex.unlock
  97.     end
  98.   end
  99. end
  100.  
  101. trap :INT do
  102.   Thread.list.each do |thread|
  103.     thread.exit unless thread == Thread.current
  104.   end
  105.   puts "\nInterrupted!"
  106.   exit
  107. end
  108. threads.each{|t| t.join}
  109.  
  110. puts "\n잠시만 기다려 주세요."
  111.  
  112. result.uniq!{|e| e.first}
  113. result.select!{|e| e[4] =~ date}
  114. result.map! do |e|
  115.   name = e[1]
  116.   next if name.nil?
  117.   if !e[2].nil? and e[2] != ""
  118.     name += " - " + e[2]
  119.   end
  120.   if !e[3].nil? and e[3] != ""
  121.     name += " - " + e[3]
  122.   end
  123.   [e[0], name.to_sym]
  124. end
  125. result.select!{|e| e}
  126.  
  127. puts "\n총 글 갯수: #{result.length}"
  128.  
  129. table = {}
  130. result.each do |e|
  131.   if table[e[1]]
  132.     table[e[1]] += 1
  133.   else
  134.     table[e[1]] = 1
  135.   end
  136. end
  137. table = table.sort_by{|e| e[1]}.reverse
  138.  
  139. File.open("result.txt", "w") do |file|
  140.   table.each.with_index(1) do |e, idx|
  141.     file.print idx
  142.     file.print "위 "
  143.     file.print e[1]
  144.     file.print "글 "
  145.     file.print e[0]
  146.     file.puts
  147.   end
  148. end
  149.  
  150. # binding.pry
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement