我尝试构建最简单的网络爬虫 w/Capybara 失败了。我究竟做错了什么?
My attempts at building the simplest web crawler w/Capybara are failing. What am I doing wrong?
[警告:提前咆哮。请不要编辑咆哮。我想知道我遇到的是否正常。这些障碍绝对毁了我作为开发人员的一天。它们比尝试解决我打算解决的任何业务问题都要困难。]
水豚。机械化。 Nokogiri。硒。等等。
我尝试构建最简单的 Ruby 小程序,它执行以下操作:
- 打开网络浏览器
- 导航到网站
- 点击 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)
[警告:提前咆哮。请不要编辑咆哮。我想知道我遇到的是否正常。这些障碍绝对毁了我作为开发人员的一天。它们比尝试解决我打算解决的任何业务问题都要困难。]
水豚。机械化。 Nokogiri。硒。等等。
我尝试构建最简单的 Ruby 小程序,它执行以下操作:
- 打开网络浏览器
- 导航到网站
- 点击 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)