【问题标题】:Parsing a site with dynamic content解析具有动态内容的站点
【发布时间】:2013-11-25 06:47:19
【问题描述】:

我正在使用 Nokogiri 解析 TechCrunch [带有特定搜索词。

http://techcrunch.com/search/education#stq=education&stp=1

问题是网站在返回与搜索项相关的列表之前有几秒钟的延迟,所以我输入到 Nokogiri 解析的 URL 在 Nokogiri 检索时没有相关内容。

内容似乎会在几秒钟后动态加载 - 我猜是 Javascript。 关于如何稍微延迟检索 HTML 的任何想法?

【问题讨论】:

  • 查看编辑后的回复。
  • 您需要对动态加载的内容进行请求。

标签: javascript ruby-on-rails ruby parsing nokogiri


【解决方案1】:

使用 Ruby 方法,sleep

seconds_to_delay = 5
sleep seconds_to_delay

编辑 1:处理在文档完成加载后一段时间加载的 div

我讨厌这种情况。我必须处理完全相同的情况,所以这就是我解决它的方法。 你需要使用selenium-webdriver gem 之类的东西。

require 'selenium-webdriver'
url = "http://techcrunch.com/search/education#stq=education&stp=1"

css_selector = ".tab-panel.active"

driver = Selenium::WebDriver.for :firefox
driver.get(url)
driver.switch_to.default_content
posts_text = driver.find_element(:css, css_selector).text
puts posts_text
driver.quit

如果您在 Heroku、AWS EC2 或 Digital Ocean 等虚拟机上运行此程序,则无法使用 firefox。相反,您需要像 phantom.js 这样的无头浏览器。

为了使用 phantom.js 而不是 firefox,首先,在 VM 上安装 phantomjs。然后改成driver = Selenium::WebDriver.for :phantomjs

您可以使用this gem 实际为您安装 phantomjs。


第二次修改问题 b)

require 'selenium-webdriver'
url = "http://techcrunch.com/search/education#stq=education&stp=1"

css_selector = ".tab-panel.active ul.river-compact.river-search li"

driver = Selenium::WebDriver.for :phantomjs
driver.get(url)
driver.switch_to.default_content
items = driver.find_elements(:css, css_selector)
items.each {|x| puts x }
driver.quit

【讨论】:

  • 问题是通过 Nokogiri 的 get 请求得到一个空页面,其内容由 Javascript 加载并在几秒钟后出现。所以我认为这不会有帮助。不过,感谢您提供的方法,v 有趣的一个
  • 我以前也遇到过同样的问题。我将编辑我的答案。 sleep 10_min 给我 :)
  • 很好奇。它实际上为您启动了 Firefox!有什么方法可以 a) 不这样做 b) 像在 Nokogiri(doc.css('li').each {|link| puts link.content}) 等中那样循环
  • 项目吗?
  • a) 对了,如果你不想使用 Firefox,你需要运行像 phantomjs 这样的无头浏览器。 Phantomjs 将模仿真实的浏览器,而无需实际打开像 Firefox 或 Chrome 这样的浏览器。请参阅我在响应中使用 Phantomjs 的说明。
  • 太好了,谢谢。最后一个q - 能不能推荐一个地方去看看如何用这种方式轻松遍历Selenium节点?我想部分获取文本,部分获取图像的 src 属性等内部内容。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签