我尝试构建最简单的网络爬虫 w/Capybara 失败了。我究竟做错了什么?

My attempts at building the simplest web crawler w/Capybara are failing. What am I doing wrong?

[警告:提前咆哮。请不要编辑咆哮。我想知道我遇到的是否正常。这些障碍绝对毁了我作为开发人员的一天。它们比尝试解决我打算解决的任何业务问题都要困难。]

水豚。机械化。 Nokogiri。硒。等等。

我尝试构建最简单的 Ruby 小程序,它执行以下操作:

  1. 打开网络浏览器
  2. 导航到网站
  3. 点击 link

。 . .但基本上没有成功。**

这是我尝试过的方法:

crawler.rb

require "capybara"
require "capybara/dsl"

class Crawler
  include Capybara::DSL

  def initialize
    visit "http://www.google.com"
  end
end

crawler = Crawler.new

当我 运行 该代码时,出现错误。

rack-test requires a rack application, but none was given (ArgumentError)

我在文档中没有的地方读到应该修复它:

require "capybara"
require "capybara/dsl"

class Crawler
  include Capybara::DSL

  def initialize
    Capybara.default_driver = :selenium
    visit "http://www.google.com"
  end
end

crawler = Crawler.new

然后,当我解决那个错误时,我得到另一个与其他依赖项相关的问题。

Unable to find Mozilla geckodriver. Please download the server from https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH. More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver. (Selenium::WebDriver::Error::WebDriverError)

我下载了驱动程序,尽管阅读并遵循了另一组椭圆形的说明,但对于如何实际安装它一无所知,但我已经有一种明显的感觉,我正在沿着一条成功的剃牛之路前进结出任何果实,因为我只想让 Ruby 转到一个愚蠢的网页并单击一个愚蠢的 link。

我并不是要 运行 将此代码作为测试的一部分。我真的只想 Ruby 使用 Capybara(或任何完成工作的工具,但最好是 Capybara)打开一个网络浏览器(我可以看到)并执行我的命令。但无论出于何种原因,这都非常困难,即使它显然已经完成了十亿次。

Guys/Gals,我做错了什么?每当我尝试尽可能多地测试一个简单的想法时,像这样的东西就会浪费太多时间。

** 这绝对令人气愤——尤其是因为您认为它就像遵循给定 gem 的文档一样简单。但是,一般来说,我发现 gems 被省略地记录下来。大约 90% 的时间,我必须去 Whosebug 或 google 某人的教程,以学习如何使用像上面那样的流行 gem 来做最基本的事情,因为它们很少能正常工作.几乎总是有一些疯狂的体操,如果没有其他人的帮助,我对如何克服的线索为零。

抱歉——这只是对开源软件的普遍抱怨。我什至不是初级开发人员,我发现有时我需要花费 HOURS 才能让 gem 做它应该做的任何基本事情。

selenium-webdriver 最近发布了 3.0.0,默认使用 geckodriver 和 firefox(Capybara 默认使用),但在该组合中缺少一些功能。相反,我建议将它与 chrome 和 chrome 驱动程序一起用于您的用例。您需要下载最新版本的 chrome 驱动程序并将其放在您的 PATH 中的某个位置。然后

require "capybara/dsl"
require "selenium-webdriver"

Capybara.register_driver :crawler_driver do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end
Capybara.default_driver = :crawler_driver

class Crawler
  include Capybara::DSL

  def initialize
    visit "http://www.google.com"
  end
end

crawler = Crawler.new

应该做你想做的事。但是,一旦您创建另一个 Crawler 实例,您就会遇到问题,因为它们都将使用相同的 Capybara 会话和冲突。如果你不打算创建多个实例那么你很好,如果你是那么你会想要在爬虫的每个实例中创建一个新的 Capybara::Session 并调用该会话对象上的所有水豚方法而不是将 Capybara::DSL 包含到您的对象中,更像是这样

class Crawler
  def initialize
    @session = Capybara::Session.new(:crawler_driver)
    @session.visit "http://www.google.com"
  end
end

可以使用poltergeist水豚驱动,使用起来更简单。在水豚中还有一件事,默认驱动程序是机架测试,因此我们需要告知我们将使用其他驱动程序。

就像我的情况一样,我确实喜欢那样

require "capybara/poltergeist"
capybara = Capybara::Session.new(:poltergeist)