ruby - 是否有另一种方法可以在 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
我想要的是我继续加载,但我想刮掉最后加载的批次减去所有之前的批次。
解决方案
您知道每次点击加载更多按钮时加载了多少条记录,因此您可以轻松地仅访问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
推荐阅读
- tensorflow - 使用估计器从经过训练的模型加载检查点
- java - JPA 仅获取一级关联
- python - Ruby 与 Python 中的 AES 加密差异
- javascript - 谷歌地图上有超过 1 个标记时删除功能失败
- spring-boot - 如何捕获和处理 InvalidGrantException(用户被禁用)?
- maven - Parent POM:跨子项目共享通用配置文件
- javascript - 通过NodeJS脚本迭代数组中的项目
- java - 离线模式下的 Firebase OnSuccessListener
- django - 在生产中不使用 django 模板将 Django + Angular 部署到 EB
- android - 屏幕变暗事件/用户不活动