ruby-on-rails - 如何使用 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
解决方案
您需要等待页面稳定下来,然后才能提取内容。许多客户端应用程序至少需要几秒钟才能启动,甚至更多。
一种重构方法:
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 = ...
或类似的规定。
推荐阅读
- android - 多行阿拉伯语文本的 StaticLayout 高度不准确
- html - 如何从电子邮件地址获取输入?
- kubernetes - traefik 入口通配符支持
- javascript - 如何从javascript返回服务器端onclick
- macos - 使用 osascript 脚本打开终端并运行 npm 命令
- ruby-on-rails - 如何使用 Rails 5.2 form_with 触发特定动作?
- oauth - Coldfusion 10 支持
标签与否? - saml-2.0 - RelayStateQuery 中没有键
- tensorflow - 如何定义 prob_threshold 以避免在对象检测期间重复计数?
- html - 当用户想要打印页面时,有没有办法隐藏图像但显示文本?