2016-10-17 3 views
0

Я полный разработчик ruby ​​ruby. Я пытаюсь отказаться от данных с веб-сайта, и я успешно могу получить данные. Но проблема в том, что в следующий раз, когда я приведу данные, я просто хочу получать только новые данные, я не хочу переписывать все данные в базе данных. Я просто хочу добавить новую запись, добавленную недавно. Но я не могу найти решение для этого, как это сделать с минимальными запросами и минимальным кодом.Screen Scrapping с nokogiri

Вот мой код, который я использую на слом:

client = Mechanize.new 
     index_page = client.get('https://www.google.com/') 
     document_page_index = Nokogiri::HTML::Document.parse(index_page.body) 
     page_no_merchant = document_page_index.css('.pagination.pagination-centered ul li:nth-last-child(2) a').text.to_i 
     1.upto(page_no_merchant) do |page_number| 
      client.get("https://www.google.com/buy-gift-cards?page=#{page_number}") do |page| 
       document = Nokogiri::HTML::Document.parse(page.body) 


       document.css('.product-source').each do |item| 
        merchant_name= item.children.css('.name').text.gsub("Gift Cards", "") 
        puts merchant_name 
        href = item.css('a').first.attr('href') 
        puts href 
        image_url=item.children.css('.img img').attr('data-src').text.strip 
        puts image_url 

         image_url=URI.parse(image_url) 
         @merchant=Merchant.create!(name: merchant_name , image_url:image_url) 
        first_page = client.get("https://www.google.com#{href}") 
        document_page = Nokogiri::HTML::Document.parse(first_page.body) 
        page_no = document_page.css('.pagination.pagination-centered ul li:nth-last-child(2) a').text.to_i 

        1.upto(page_no) do |page_number_giftcard| 
         type1=[] 
         card_page = client.get("https://www.google.com#{href}?page=#{page_number_giftcard}") 
         document_page = Nokogiri::HTML::Document.parse(card_page.body) 
         document_page.xpath('//table/tbody/tr[@class="toggle-details"]').collect do |row| 



          row.at("td[2] ul").children.each do |typeli| 
          type = typeli.text.strip if typeli.text.strip.length != 0 
          type1 << type if typeli.text.strip.length != 0 
          end 

          value = row.at('td[3]').text.strip 
          value = value.to_s.tr('$', '').to_f 
          puts value 

          per_discount = row.at('td[4]').text.strip 
          per_discount = per_discount.to_s.tr('%', '').to_f 
          puts per_discount 

          final_price = row.at('td[5] strong').text.strip 
          final_price = final_price.to_s.tr('$', '').to_f 
          puts final_price 
          puts '******************************' 
           @giftcard=Giftcard.create(card_type:1, card_value:value, per_off:per_discount, card_price: final_price, merchant_id: @merchant.id) 
         end 
          @giftcard.update_attribute() 
        end 
       end 
      end 
     end 

Спасибо заранее.

ответ

0

В основном вы сохраняете все данные, делая это.

@merchant=Merchant.create!(name: merchant_name , image_url:image_url)

Вы можете попробовать что-то вроде find_or_create_by.

@merchant=Merchant.find_or_create_by(name: merchant_name , image_url:image_url)

http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/first_or_create http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by

+0

Thanks.its работает –

+0

теперь его не работает его показывая ошибку: –

+0

не может процитировать URI :: HTTPS –