首页 > 解决方案 > 是否有另一种方法可以在 Ruby 中使用 while 循环仅获取最后加载的数据

问题描述

我正在使用具有“加载更多”按钮的动态网站进行网络抓取。虽然我通过使用 while 循环来解决负载更多的问题。当我试图抓取它不断增加的数据时,它还有另一个挑战。所以第一批数据是 24 条数据,当我抓取第二批时它也抓取了第一批,所以它抓取了 48 条数据,并且很快只添加了 24 条新数据。

这是我的代码。

        require "selenium-webdriver"

        driver = Selenium::WebDriver.for :chrome
        url ="https://www.example.com/categories/car-parts"

        driver.navigate.to "#{url}"
        wait = Selenium::WebDriver::Wait.new(:timeout => 20)

        while driver.page_source.include? "Load more"

            load_more = wait.until {
              load_more_element = driver.find_element(css: ".styles__loadMore___yYAF4")
            }
            sleep 3
            load_more.click()
            puts "load_more"
            sleep 3

            seller_url = wait.until {
          element = driver.find_elements(:css, ".desktop__itemOneFourth___2t71A .styles__link___9msaS:nth-child(1)")

        }
            seller_url.each do |line|
                seller_uri = line.attribute("href")
                seller_hand = seller_uri[/https:\/\/www.example.com(.*\/([.\w+]+))/i]

                seller_handle =  seller_hand.gsub("https://www.example.com/", "")

                seller = Seller.new
                seller.seller_url = seller_uri
                seller.seller_handle = seller_handle

                seller.save
                puts seller_handle
            end

            puts seller_url.size
            sleep 3

我想要的是我继续加载,但我想刮掉最后加载的批次减去所有之前的批次。

标签: rubyseleniumwhile-loop

解决方案


您知道每次点击加载更多按钮时加载了多少条记录,因此您可以轻松地仅访问seller_url数组中的新记录:

items_per_page = 24

while driver.page_source.include? "Load more"
  # ...

  seller_url = wait.until {
    element = driver.find_elements(:css, ".desktop__itemOneFourth___2t71A .styles__link___9msaS:nth-child(1)")
  }

  seller_url.last(items_per_page).each do |line|
    # do stuff
  end

  pages_loaded += 1
end

推荐阅读