使用Poltergeist / PhantomJS / Capybara / Nokogiri抓取网站的困难。在网站上举起来

时间:2016-06-11 19:05:23

标签: ruby web-scraping phantomjs capybara poltergeist

我正试图在ruby脚本中使用poltergeist和copybara访问一系列网站。我对某个特定网站遇到了奇怪的问题:http://www.slate.com/

以下是该脚本的基本元素:

require 'nokogiri'
require 'capybara/poltergeist'
slate = "http://www.slate.com"
OPTIONS = {:js_errors => false, :debug => true, :timeout => 120, :phantomjs_options => ['--ignore-ssl-errors=false', '--load-images=false']}
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, OPTIONS)
end

session = Capybara::Session.new(:poltergeist)

session.driver.headers = {"User-Agent" => USER_AGENT}

session.visit slate

我得到的回复是奇怪的,不像我以这种方式访问​​的其他网站。在session.visit它返回[object Object],然后请求成功并返回我的IRB提示符。但是我会在大约5或10秒内自动进入提示timeout timeout,然后MySlateData data is empy

irb(main):016:0> session.visit slate
[object Object]
=> {"status"=>"success"}
irb(main):017:0> timeout timeout
MySlateData data is empty

无论如何都要弄清楚为什么响应似乎以一种奇怪的方式保持我的会话?如果我使用调试运行OPTIONS,我真的看不到更多有用的东西。

irb(main):014:0> session.visit slate
{"id":"bba72e5e-fd27-4d92-bdb8-7cc0172afaf6","name":"visit","args":["http://www.slate.com"]}
[object Object]
{"command_id":"bba72e5e-fd27-4d92-bdb8-7cc0172afaf6","response":{"status":"success"}}
=> {"status"=>"success"}
irb(main):015:0> timeout timeout
MySlateData data is empty

无论出于何种原因,我都无法抓取生成的HTML,因为它干扰了将html加载到nokogiri中。

1 个答案:

答案 0 :(得分:0)

Capybara并没有保持你的会话。 Poltergeist / PhantomJS正在运行"浏览器"与您的代码异步 - 您在输出中看到的无关内容是来自您访问过的网站的控制台日志的输出。确保您使用最新版本的poltergeist(1.9+)和phantomjs(2.1.1+)可能会删除其中的一些,因为它们会在页面中创建更少的错误