我创建了一个抓取工具,可以在各种职业网站上找到工作。 在大约 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 元素上调用方法。
您所要做的就是安装watigiri
gem,它是 Watir 的插件。安装后,您可以在内部自动使用 Nokogiri 的元素对象上text!
该方法。但是这种方法不会等待页面完全加载,
如果在抓取页面时正在加载页面,则必须在元素上使用text
。
Watir 在你写的时候会使用 Nokogiri:
b.element(name: "something").text!
Watir 在你写的时候使用硒:
b.element(name: "something").text
有关更多信息,请参阅瓦蒂吉里。