首页 > 解决方案 > 如何使用 Waitr::Browser 显示动态站点内容以供 Nokogiri 抓取

问题描述

我创建了一个刮板,可以在各种职业网站上找到工作。在大约 80% 的网站上它可以工作,但我很难让它在其余页面上工作。

我认为原因是某些页面在其页面上具有生成动态内容的 JavaScript。因此刮刀失败。所以我尝试了 Watir 以及 Mechanize,但仍然无法正常工作。

https://www.climeworks.com/careers/是一个示例 URL。有人可以刮吗?

这是我的 Watir 刮刀:

def watirscraper
  require 'nokogiri'
  require 'watir'

  puts "starting newscraper"
  opts = {
      headless: true
    }

  # if (chrome_bin = ENV.fetch('GOOGLE_CHROME_SHIM', nil))
  #   opts.merge!( options: {binary: chrome_bin})
  # end

  browser = Watir::Browser.new :chrome, opts

  browser.goto self.career_url
  company = self
  job_url = self.career_url

  html_doc = Nokogiri::HTML.parse(browser.html)
  jobtitle = html_doc.css(":contains('Developer'):not(:has(:contains('Developer')))").map(&:text)
  puts jobtitle

end

标签: ruby-on-railsrubyweb-scrapingnokogiriwatir

解决方案


您需要等待页面稳定下来,然后才能提取内容。许多客户端应用程序至少需要几秒钟才能启动,甚至更多。

一种重构方法:

def wait_for_content(browser, selector)
  html_doc = Nokogiri::HTML.parse(browser.html)

  return if (html_doc.css(selector).first)

  sleep(5)

  # May want to have a limit here so it doesn't spin forever
  redo
end

你可以这样称呼它:

wait_for_content(browser, ":contains('Developer'):not(:has(:contains('Developer')))")

jobtitle = ...

或类似的规定。


推荐阅读