如何使用Selenium-webdriver和nokogiri提取JS呈现的HTML?

时间:2018-07-22 06:06:23

标签: ruby selenium-webdriver web-scraping nokogiri scraper

请考虑两个网页onetwo。使用nokogiri可以轻松抓取第二个站点,因为它不使用JS。但是,仅使用nokogiri不能刮掉第一号站点。我在Google上进行了广泛的搜索,发现如果我用自动的Web浏览器加载页面,则可以抓取渲染的HTML。我在下面有以下代码:

# creates an instance
driver = Selenium::WebDriver.for :chrome

# opens an existing webpage
driver.get 'http://www.bigstub.com/search.aspx' 

# wait is used to let the webpage load up and let the JS render
wait = Selenium::WebDriver::Wait.new(:timeout => 5)

我的问题是,一旦获得所需的课程,我试图立即让页面加载关闭。例如,如果我将超时时间调整为10秒,直到找到类.title-holder,我将如何编写此代码?

Pusedo代码: 如果.include?("title-holder"),则render_source_page将超时。我只是不知道怎么写。

更新: 关于无头问题,硒具有选项或配置,您可以在其中添加无头选项。这是通过以下代码完成的:

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
driver = Selenium::WebDriver.for :chrome, options: options

对于下一个问题,为了使网站完全抓取JS呈现的HTML,我将超时变量设置为5秒:

wait = Selenium::WebDriver::Wait.new(:timeout => 5)
wait.until { /title-holder/.match(driver.page_source) }

wait.until几乎意味着要等待5秒钟,直到我在title-holder或渲染的HTML中找到一个page_source类。这几乎解决了我所有的问题。

2 个答案:

答案 0 :(得分:0)

我假设您正在服务器上运行硒。因此,首先安装Xvfb

sudo apt-get install xvfb

安装firefox

sudo apt-get install firefox

将以下两个gem添加到您的gemfile中。您将毫无头绪,因为您想在服务器上运行Selenium Webdriver。 Headless将为您启动和停止Xvfb。

#gemfile

gem 'selenium-webdriver'
gem 'headless'

抓取代码

  headless = Headless.new
  headless.start
  driver = Selenium::WebDriver.for :firefox
  driver.navigate.to example.com
  wait = Selenium::WebDriver::Wait.new(:timeout => 30)
  #scraping code comes here

客房整理,以免耗尽内存。

  driver.quit
  headless.destroy

希望这会有所帮助。

答案 1 :(得分:0)

关于无头问题,硒具有选项或配置,您可以在其中添加无头选项。这是通过以下代码完成的:

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
driver = Selenium::WebDriver.for :chrome, options: options

对于下一个问题,为了使网站完全抓取JS呈现的HTML,我将超时变量设置为5秒:

wait = Selenium::WebDriver::Wait.new(:timeout => 5)
wait.until { /title-holder/.match(driver.page_source) }

wait.until几乎意味着要等待5秒钟,直到我在title-holder或渲染的HTML中找到一个page_source类。这几乎解决了我所有的问题。