【发布时间】:2014-12-08 21:21:05
【问题描述】:
我想在 Google 趋势中获取特定类别中最热门的查询。我可以下载该类别的 CSV,但这不是一个可行的解决方案,因为我想分支到每个查询并找到每个查询的趋势子查询。
我无法捕获下表的内容,该表包含某个主题的前 10 个热门查询。同样由于一些奇怪的原因,使用 capybara 截屏会返回一个变暗的图像。
<div id="TOP_QUERIES_0_0table" class="trends-table">
请在 Ruby 控制台上运行代码以查看它是否正常工作。捕获元素/屏幕截图适用于 facebook.com 或 google.com,但不适用于趋势。
我猜这与在页面加载时动态生成的表格有关,但我不确定这是否应该阻止 capybara 捕获页面上已加载的元素。任何提示都会非常有价值。
require 'capybara/poltergeist'
require 'capybara/dsl'
require 'csv'
class PoltergeistCrawler
include Capybara::DSL
def initialize
Capybara.register_driver :poltergeist_crawler do |app|
Capybara::Poltergeist::Driver.new(app, {
:js_errors => false,
:inspector => false,
phantomjs_logger: open('/dev/null')
})
end
Capybara.default_wait_time = 3
Capybara.run_server = false
Capybara.default_driver = :poltergeist_crawler
page.driver.headers = {
"DNT" => 1,
"User-Agent" => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0"
}
end
# handy to peek into what the browser is doing right now
def screenshot(name="screenshot")
page.driver.render("public/#{name}.jpg",full: true)
end
# find("path") and all("path") work ok for most cases. Sometimes I need more control, like finding hidden fields
def doc
Nokogiri.parse(page.body)
end
end
crawler = PoltergeistCrawler.new
url = "http://www.google.com/trends/explore#cat=0-45&geo=US&date=today%2012-m&cmpt=q"
crawler.visit url
crawler.screenshot
crawler.find(:xpath, "//div[@id='TOP_QUERIES_0_0table']")
Capybara::ElementNotFound: 找不到 xpath "//div[@id='TOP_QUERIES_0_0table']"
来自 /Users/karan/.rvm/gems/ruby-1.9.3-p545/gems/capybara-2.4.4/lib/capybara/node/finders.rb:41:in block in find'
from /Users/karan/.rvm/gems/ruby-1.9.3-p545/gems/capybara-2.4.4/lib/capybara/node/base.rb:84:insynchronize'
来自 /Users/karan/.rvm/gems/ruby-1.9.3-p545/gems/capybara-2.4.4/lib/capybara/node/finders.rb:30:in find'
from /Users/karan/.rvm/gems/ruby-1.9.3-p545/gems/capybara-2.4.4/lib/capybara/session.rb:676:inblock (2 级) in '
来自 /Users/karan/.rvm/gems/ruby-1.9.3-p545/gems/capybara-2.4.4/lib/capybara/dsl.rb:51:in block (2 levels) in <module:DSL>'
from (irb):45
from /Users/karan/.rbenv/versions/1.9.3-p484/bin/irb:12:in'
【问题讨论】:
-
我打开了 js_errors 并且确实抛出了一个 javascript 错误。 .......Capybara::Poltergeist::JavascriptError: Capybara::Poltergeist::JavascriptError 来自 /Users/karan/.rvm/gems/ruby-1.9.3-p545/gems/poltergeist-1.5.1/lib /capybara/poltergeist/browser.rb:275:in `command' .....如何解决这个问题?
-
Turned inspector=> true and did crawler.page.driver.debug 脚本中有这个错误google.com/trends/resources/3724719769-alljs-bin__en_us.js ...TypeError: 'undefined' is not a function (evalating 'this.document_releaseCapture( )')
标签: ruby xpath capybara screen-scraping poltergeist