请考虑两个网页one和two。使用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
类。这几乎解决了我所有的问题。
答案 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
类。这几乎解决了我所有的问题。