如何使用 Selenium-webdriver 和 nokogiri 提取呈现 HTML 的 JS?
How to extract JS rendered HTML using Selenium-webdriver and nokogiri?
考虑两个网页 one and two。第二个站点很容易使用 nokogiri 进行抓取,因为它不使用 JS。然而,不能仅使用 nokogiri 抓取第一个站点。我用谷歌搜索并广泛搜索,发现如果我使用自动网络浏览器加载页面,我可以抓取呈现的 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)
我的问题是,我试图让页面在获得所需 class 后立即关闭。一个例子是,如果我将超时调整为 10 秒,直到我找到 class .title-holder
我将如何编写这段代码?
伪代码:
如果 .include?("title-holder")
,rendered_source_page 将超时。我只是不知道怎么写。
更新:
关于无头问题,selenium 有一个选项或配置,您可以在其中添加无头选项。这是通过以下代码完成的:
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 秒,直到我在 page_source
或渲染的 HTML 中找到 title-holder
class。这几乎解决了我所有的问题。
我假设您在服务器上 运行ning selenium。所以先安装Xvfb
sudo apt-get install xvfb
安装火狐
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
希望这对您有所帮助。
关于无头问题,selenium 有一个选项或配置,您可以在其中添加无头选项。这是通过以下代码完成的:
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 秒,直到我在 page_source
或渲染的 HTML 中找到 title-holder
class。这几乎解决了我所有的问题。
考虑两个网页 one and two。第二个站点很容易使用 nokogiri 进行抓取,因为它不使用 JS。然而,不能仅使用 nokogiri 抓取第一个站点。我用谷歌搜索并广泛搜索,发现如果我使用自动网络浏览器加载页面,我可以抓取呈现的 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)
我的问题是,我试图让页面在获得所需 class 后立即关闭。一个例子是,如果我将超时调整为 10 秒,直到我找到 class .title-holder
我将如何编写这段代码?
伪代码:
如果 .include?("title-holder")
,rendered_source_page 将超时。我只是不知道怎么写。
更新: 关于无头问题,selenium 有一个选项或配置,您可以在其中添加无头选项。这是通过以下代码完成的:
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 秒,直到我在 page_source
或渲染的 HTML 中找到 title-holder
class。这几乎解决了我所有的问题。
我假设您在服务器上 运行ning selenium。所以先安装Xvfb
sudo apt-get install xvfb
安装火狐
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
希望这对您有所帮助。
关于无头问题,selenium 有一个选项或配置,您可以在其中添加无头选项。这是通过以下代码完成的:
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 秒,直到我在 page_source
或渲染的 HTML 中找到 title-holder
class。这几乎解决了我所有的问题。