【问题标题】:My attempts at building the simplest web crawler w/Capybara are failing. What am I doing wrong?我尝试使用 Capybara 构建最简单的网络爬虫失败了。我究竟做错了什么?
【发布时间】:2019-10-24 15:04:47
【问题描述】:

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

水豚。机械化。诺科切里。硒。等等。

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

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

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

这是我尝试过的:

爬虫.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 转到一个愚蠢的网页并点击一个愚蠢的链接。

我不会尝试将此代码作为测试的一部分运行。我实际上只是希望 Ruby 使用 Capybara(或任何可以完成工作的工具,尽管最好是 Capybara)打开一个 Web 浏览器(我可以看到)并按照我的要求进行操作。但无论出于何种原因,这都是极其困难的,即使它显然已经完成了十亿次。

伙计们/女孩们,我在这里做错了什么?每当我尝试测试一个简单的想法时,像这样的东西会占用太多时间。

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

抱歉,这只是对开源软件的一般抱怨。我什至不是初级开发人员,而且我发现有时我需要花费几个小时来获得一个 gem 来完成它应该做的任何基本事情。

【问题讨论】:

  • 欢迎来到 Stack Overflow。这里不是吐槽的地方。 SO 是帮助您解决代码问题,而不是充当发声器。此外,SO 不是讨论列表,而是参考书,您的问题刚刚创建了一篇新文章,描述了如何解决您提出的问题。你认为在一本咆哮的参考书中写一篇文章是否合适?你会在百科全书、教科书或食谱中看到这样的内容吗?

标签: ruby-on-rails ruby selenium capybara


【解决方案1】:

selenium-webdriver 最近发布了 3.0.0,它默认使用 geckodriver 和 firefox(Capybara 默认使用),但在该组合中缺少一些功能。相反,我建议将它与 chrome 和 chromedriver 一起用于您的用例。您需要下载最新版本的 chromedriver 并将其放在 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 方法,而不是包括Capybara::DSL 到你的对象中,这会更像这样

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

【讨论】:

  • 它没有用。 :-( crawler.rb:5:in block in
    ': 未定义的局部变量或方法 app' for main:Object (NameError)
  • @MichaelP。抱歉 - 忘记了 register_driver 块上的参数 - 已修复
  • 感谢您的回复,汤姆。这是我运行该代码时得到的结果:无法找到 chromedriver。请从chromedriver.storage.googleapis.com/index.html 下载服务器并将其放置在您的路径中的某个位置。更多信息github.com/SeleniumHQ/selenium/wiki/ChromeDriver。 (Selenium::WebDriver::Error::WebDriverError)
  • 对 - 正如我的回答所说 - 你需要下载最新的 chromedriver - sites.google.com/a/chromium.org/chromedriver/downloads - 并将它放在你的路径中的某个地方
  • 不知道怎么安装驱动。那个页面和谷歌搜索没有告诉我怎么做。
【解决方案2】:

您可以在 capybara 中使用poltergeist 驱动程序,使用起来要简单得多。在 capybara 中还有一件事,默认驱动程序是 rack-test,所以我们需要通知我们将使用其他一些驱动程序。

就我而言,我确实喜欢这样

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

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2020-08-07
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多