如何使用Waitr :: Browser显示动态网站内容以供Nokogiri抓取

问题描述 投票:1回答:2

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

我认为原因是某些页面的页面上有JavaScript,这些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-rails ruby web-scraping nokogiri watir
2个回答
2
投票

您需要等待页面稳定后才能拉出内容。许多客户端应用程序至少需要几秒钟来启动,还有更多。

一种重构方法:

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 = ...

或类似的东西。


1
投票

首先,您在Watir代码中使用了一个孤立的Nokogiri语句,例如Nokogiri::HTML.parse(browser.html)。使用此类代码时,无法在Watir元素上调用方法。

[您在这里要做的就是安装watigiri gem,这是Watir的附加组件。安装后,您可以在内部自动使用Nokogiri的元素对象上使用方法text!。但是此方法不会等待页面完全加载,

如果在剪贴时正在加载页面,则必须在元素上使用text

Watir在写时使用Nokogiri:

b.element(name: "something").text!

Watir在编写时使用硒:

b.element(name: "something").text

有关更多信息,请参见Watigiri

© www.soinside.com 2019 - 2024. All rights reserved.