我创建了一个刮板,可以在各种职业网站上找到工作。在大约80%的网站上都可以使用,但是我很难在其余页面上使用它。
我认为原因是某些页面的页面上有JavaScript,这些JavaScript会生成动态内容。因此刮板失效。所以我尝试了watir以及机械化(都是宝石)。但是它仍然不起作用。这是一个示例网址:https://www.climeworks.com/careers/
任何人都可以抓取吗?
Here is my watir scraper:
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 = ...
或类似的东西。
首先,您在WATIR代码中使用了Nokogiri::HTML.parse(browser.html)
之类的孤立的nokogiri语句,当您像这样使用时,将无法在watir元素上调用方法。
[您要做的就是,您必须安装watigiri
gem,这是WATIR的附加组件。安装后,您可以在元素对象上使用方法text!
,该方法自动在内部使用Nokogiri gem。但是此方法不会等待页面完全加载,如果在剪贴时正在加载页面,则必须在元素上使用text
。
[WATIR在编写时使用Nokogiri
b.element(name: "something").text!
WATIR在编写时使用硒
b.element(name: "something").text
更多信息
http://watir.com/watigiri/