Class: Tomosia123rfCrawl::Crawler

Inherits:
Object
  • Object
show all
Defined in:
lib/tomosia_123rf_crawl.rb

Instance Method Summary collapse

Instance Method Details

#downloadImages(images, destination) ⇒ Object

Hàm dùng để download các ảnh từ web về



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/tomosia_123rf_crawl.rb', line 12

def downloadImages(images, destination)
  #Tạo forder dùng để lưu hình ảnh
  path= "#{destination}/images" 

#Tạo thư mục chỉ định của người dùng
  Dir.mkdir path unless File.exist? path

  threads = []
  images.each do |curr_image| 
      threads << Thread.new(curr_image){
          open(curr_image[:link]) do |image|
              File.open("#{path}/".concat(curr_image[:link].split('/').last.to_s.split('?').first.to_s),"a+") do |file|
                  file.write(image.read)              
                  curr_image[:size] = image.size.to_s             
              end 
          end

      }
  end
  threads.each{|t| t.join}
end

#run(keyword, destination, max) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/tomosia_123rf_crawl.rb', line 34

def run(keyword, destination, max)

  url = "https://www.123rf.com/stock-photo/dog.html?start=1&sti=mwk3081ovjk7062i9c|"
  unparsed_page = open("#{url}/#{keyword}").read
  parsed_page = Nokogiri::HTML(unparsed_page)
  jobs = Array.new

  list_imgs = parsed_page.css('div.mosaic-main-container') 
  #list_imgs.count = 110 imges
  #Ta sẽ crawl data từ web với số trang tối đa mà ta muốn crawl data

  count_page  = 1  
  #Tạo file dùng để ghi những thông tin của file
  File.delete("images.xls") if File.file?("images.xls")
  File.new("images.xls","a+")
  File.open("images.xls","a") do |file|
      file.write("NAME,URL,SIZE,EXTENSION")
      file.write("\n")
  end
  


  while count_page <= max*110
      pagination_url ="https://www.123rf.com/stock-photo/#{keyword}.html?start=#{count_page}&sti=mwk3081ovjk7062i9c|"
      pagination_unparsed_page = open(pagination_url).read
      pagination_parsed_page = Nokogiri::HTML( pagination_unparsed_page  )
      pagination_list_imgs =  pagination_parsed_page.css('div.mosaic-main-container')
      puts "Page :#{count_page}"
      puts pagination_url
      puts " ..............."


      #Ghi những thông tin về ảnh mà ta muốn download được lưu vào trong mảng jobs
      pagination_list_imgs.each do |img_list|
          job={
              name: img_list.css('img').attr('src').text.split('/').last.to_s,
              link: img_list.css('img').attr('src').text,
              size: 'nil',
              extension: img_list.css('img').attr('src').text.split('.').last.to_s.split('?').first.to_s
  
          }   
          jobs << job  
      end
      downloadImages(jobs, destination)
  

      count_page+=110
  end

  #Ghi những thông tin ảnh vào file excel mà ta đã download về được từ mảng jobs
  jobs.each do |curr_image| 
      File.open("./images.xls","a+") do |file|
          file.write(curr_image[:name].concat(",").concat(curr_image[:link]).concat(",").concat(curr_image[:size]).concat(",").concat(curr_image[:extension]))
        file.write("\n")
      end
  end

end