Ruby 刮削-加载动态按钮

Ruby 刮削-加载动态按钮,ruby,web-scraping,nokogiri,Ruby,Web Scraping,Nokogiri,我正试图用Ruby和Nokogiri从网上搜刮“新鲜和冷冻”的产品 为了加载更多的产品,我需要单击“加载更多…”,这将动态加载更多的产品,而不会更改URL或重定向到新页面 如何“单击”“加载更多”按钮加载更多产品 我认为这是一个动态的网站,因为在点击“加载更多…”按钮后,项目会动态加载,并且URL根本没有被更改(因此没有可见的分页) 这是我到目前为止尝试过的代码,但我一直在加载更多的项目。我的猜测是DOM是自己加载的,但实际上不能单击按钮,因为它表示调用javascript方法,该方法将加载其

我正试图用Ruby和Nokogiri从网上搜刮“新鲜和冷冻”的产品

为了加载更多的产品,我需要单击“加载更多…”,这将动态加载更多的产品,而不会更改URL或重定向到新页面

如何“单击”“加载更多”按钮加载更多产品

我认为这是一个动态的网站,因为在点击“加载更多…”按钮后,项目会动态加载,并且URL根本没有被更改(因此没有可见的分页)

这是我到目前为止尝试过的代码,但我一直在加载更多的项目。我的猜测是DOM是自己加载的,但实际上不能单击按钮,因为它表示调用javascript方法,该方法将加载其余的项

require "csv"
require "json"
require "nokogiri"
require "open-uri"
require "pry"

def scrape_category(category)
  CSV.open("out/waitrose_items_#{category}.csv", "w") do |csv|
    headers = [:id, :name, :category, :price_per_unit, :price_per_quantity, :image_url, :available, :url]
    csv << headers
    url = "https://www.waitrose.com/ecom/shop/browse/groceries/#{category}"
    html = open(url)
    doc = Nokogiri::HTML(html)
    load_more = doc.css(".loadMoreWrapper___UneG1").first
    pages = 0
    while load_more != nil
      puts pages.to_s
      load_more.content # Here's where I don't know how to click the button to load more items
      products = doc.css(".podHeader___3yaub")
      puts "products = " + products.length.to_s
      pages = pages + 1

      load_more = doc.css(".loadMoreWrapper___UneG1").first
    end
    (0..products.length-1).each do |i|
      puts "url = " + products[i].text
    end
    load_more = doc.css(".loadMoreWrapper___UneG1")[0]

    # here goes the processing of each single item to put in csv file
  end
end

def scrape_waitrose
  categories = [
    "fresh_and_chilled",
  ]

  threads = categories.map do |category|
    Thread.new { scrape_category(category) }
  end

  threads.each(&:join)

end

#binding.pry
需要“csv”
需要“json”
需要“nokogiri”
需要“打开uri”
需要“撬动”
def刮水_类别(类别)
CSV.open(“out/waitrose_items_35;{category}.CSV”,“w”)do|CSV|
headers=[:id,:name,:category,:price_per_unit,:price_per_quantity,:image_url,:available,:url]

csvNokogiri是解析HTML的一种方法。它的Ruby等价于Javascript的Cheerio或Java的Jsoup。这实际上不是一个Nokogiri问题

让您感到困惑的是解析HTML的方法和收集HTML的方法(通过网络交付)。重要的是要记住,很多功能,比如点击按钮,都是由Javascript启用的。如今,许多站点,如React站点,完全由Javascript构建

因此,当您执行这一行时:

doc = Nokogiri::HTML(html)
这是您必须关注的html变量。您的html与我在浏览器中从同一页面查看的html不同


为了进行任何类型的可靠的web抓取,您必须使用能够执行Javascript文件的无头浏览器。用Ruby术语来说,这曾经意味着使用恶鬼来控制Phantomjs,这是Webkit浏览器的无头版本。当傀儡演员和无头铬到达时,幻影不再受到支持

你的问题问得不好。我们需要看到你努力的证据。请参阅“”和“”及其所有链接页面。你研究过这个吗?哪里如果没有帮助,告诉我们原因。你试了什么?如果你不尝试,为什么不呢?如果你做了,你做了什么?我们希望你尽可能少地解决这个问题。页面是DHTML还是静态的?如果是静态的,Nokogiri非常适合抓取,但是Mechanize会是更好的工具。所以你没有任何代码显示你迄今为止所做的尝试?没有任何迹象表明你曾试图先自己做这件事?甚至没有一行代码作为起点?“我本可以花几个小时研究所有这些主题,但这不是社区的目的吗?”没有。所以不是一个为你做研究的网站;最后的选择也是如此。我强烈建议你阅读下一页;它很长但很彻底,经常被推荐:我毫不怀疑,如果不是因为悬赏,这个问题已经结束了。我建议你阅读第一条评论中的链接,并更新这篇文章,以至少满足这里问题的最低要求。@Antonio-javascript方法可能会进行Ajax调用-如果你可以获得Ajax调用正在进行的URL,也许你可以自己进行调用:当然可以,服务器不会限制你自己打电话。谢谢@Tom的回复。这给了我很多指导。所以你建议在NodeJS中使用木偶演员吗?嗨,很抱歉反应太晚了。这些天我在Ruby方面做的不多,有木偶师的宝石吗?如果不是,那么Node就是这样做的。我对Node vs Ruby的体验非常积极,puppeter现在拥有一个庞大的用户社区。如果您认为答案有帮助,请接受或投票给未来的访客?谢谢您的回答和解释。我将切换到Node。赏金已经过期了,很抱歉我不能给你:(