简体   繁体   English

如何使用水豚获取动态页面内容

[英]How to get dynamic page content with capybara

Trying to get text from elements: 尝试从元素中获取文本:

<div class="points-text" data-reactid=".2765swfgy68.1.2.2.1:$sony-xperia-z1-compact.2.0.4.0.0.1">29,367 points</div>

I guess websites uses Reactjs and capybara can't get content even with Poltergeist driver. 我猜网站使用Reactjs,即使使用Poltergeist驱动程序,水豚也无法获得内容。 Is there any workaround? 有什么解决方法吗?

Here is my code: 这是我的代码:

require 'rubygems'
require 'capybara'
require 'capybara/poltergeist'


Capybara.default_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {js_errors: false})
end


class WebScraper
  include Capybara::DSL

  def get_page_data(url)
    visit(url)
    doc = Nokogiri::HTML(page.html)
    p doc.css('.points-text')
  end
end


scraper = WebScraper.new
puts scraper.get_page_data('http://versus.com/en/sony-xperia-z1-compact')

There is no need to parse the html with Nokogiri if you're already visiting with Capybara. 如果您已经使用Capybara进行了访问,则无需使用Nokogiri解析html。

def get_page_data(url)
  visit(url)
  p find(:css, '.points-text').text      
end

will print the visible text in the element with class points-text 将使用class points-text类在元素中显示可见文本

This code works with selenium and webkit but it does NOT work with poltergeist driver. 此代码适用于seleniumwebkit,但不适用于poltergeist驱动程序。 From the screenshots i can see that javascript on the website is not even executed. 从屏幕截图中,我可以看到该网站上的javascript甚至没有执行。

require 'capybara'
require 'capybara-webkit'
require 'capybara/poltergeist'

Capybara.default_driver = :poltergeist
# Capybara.default_driver = :selenium
# Capybara.default_driver = :webkit
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {js_errors: false})
end
Capybara::Webkit.configure do |config|
  config.allow_unknown_urls
end


class WebScraper
  include Capybara::DSL

  def get_page_data(url)
    visit(url)

    max_same_times = 3
    same_times = 0
    old_points = nil
    20.times do |i|
      doc = Nokogiri::HTML(page.html)
      # p doc.css('.points-text')
      points = doc.css('.points-text')
      # p [same_times, max_same_times]
      if same_times == max_same_times
        break
      end
      if points.length > 0
        points = points[0].text
        # p [old_points, points]
        if old_points == points
          same_times += 1
        else
          same_times = 0
        end
        old_points = points
      end
      page.save_screenshot("#{i}.png")
    end
    old_points
  end
end


scraper = WebScraper.new
puts scraper.get_page_data('http://versus.com/en/sony-xperia-z1-compact')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM