【问题标题】:Trouble scraping Google trends using Capybara and Poltergeist无法使用 Capybara 和 Poltergeist 抓取 Google 趋势
【发布时间】: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


【解决方案1】:

javascript 错误是由于不正确的 USER-Agent 造成的。一旦我将用户代理更改为我的 chrome 浏览器的用户代理,它就可以工作了!

"User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多