如何使用 Waitr::浏览器显示动态网站内容供 Nokogiri 抓取



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

我认为原因是某些页面在其页面上具有生成动态内容的JavaScript。因此刮板出现故障。所以我尝试了瓦蒂尔和机械化,但它仍然不起作用。

https://www.climeworks.com/careers/是一个示例网址。任何人都可以刮吗?

这是我的瓦蒂尔刮刀:

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

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

重构它的一种方法:

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

或者类似的东西。

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

您所要做的就是安装watigirigem,它是 Watir 的插件。安装后,您可以在内部自动使用 Nokogiri 的元素对象上text!该方法。但是这种方法不会等待页面完全加载,

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

Watir 在你写的时候会使用 Nokogiri:

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

Watir 在你写的时候使用硒:

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

有关更多信息,请参阅瓦蒂吉里。

相关内容

  • 没有找到相关文章

最新更新