Как использовать Waitr :: Browser для отображения содержимого сайта Dynami c, который Nokogiri должен очистить - PullRequest
1 голос
/ 19 января 2020

Я создал скребок, который находит работу на различных сайтах карьеры. На примерно 80% сайтов это работает, но мне трудно заставить его работать на остальных страницах.

Я думал, что причина в том, что на некоторых страницах есть JavaScript на их странице, которая генерирует содержание c. И поэтому скребок выходит из строя. Поэтому я попробовал Watir так же хорошо, как Mechanize, но все равно он не работает.

https://www.climeworks.com/careers/ - пример URL. Кто-нибудь может это почистить?

Вот мой скребок Watir:

def watirscraper
  require 'nokogiri'
  require 'watir'

  puts "starting newscraper"
  opts = {
      headless: true
    }

  # if (chrome_bin = ENV.fetch('GOOGLE_CHROME_SHIM', nil))
  #   opts.merge!( options: {binary: chrome_bin})
  # end

  browser = Watir::Browser.new :chrome, opts

  browser.goto self.career_url
  company = self
  job_url = self.career_url

  html_doc = Nokogiri::HTML.parse(browser.html)
  jobtitle = html_doc.css(":contains('Developer'):not(:has(:contains('Developer')))").map(&:text)
  puts jobtitle

end

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Вам нужно будет дождаться стабилизации страницы, прежде чем вы сможете извлечь содержимое. Многим клиентским приложениям для загрузки требуется как минимум несколько секунд, а то и больше.

Один из способов рефакторинга:

def wait_for_content(browser, selector)
  html_doc = Nokogiri::HTML.parse(browser.html)

  return if (html_doc.css(selector).first)

  sleep(5)

  # May want to have a limit here so it doesn't spin forever
  redo
end

Где вы можете назвать его следующим образом:

wait_for_content(browser, ":contains('Developer'):not(:has(:contains('Developer')))")

jobtitle = ...

Или что-то в этом роде.

1 голос
/ 19 января 2020

Прежде всего, вы используете изолированное выражение Nokogiri, например Nokogiri::HTML.parse(browser.html) внутри кода Watir. Когда вы используете такой код, вы не можете вызывать методы для элементов Watir.

Все, что вам нужно сделать, это установить гем watigiri, который является дополнением для Watir. После того, как вы установили его, вы можете использовать метод text! для объекта-элемента, который автоматически использует Nokogiri для внутреннего использования. Но этот метод не ожидает полной загрузки страницы,

Если страница загружается во время ее очистки, вы должны использовать text для элемента.

Ватир использует Нокогири, когда вы пишете:

b.element(name: "something").text!

Ватир использует Селен, когда вы пишете:

b.element(name: "something").text

Для получения дополнительной информации см. Ватигири .

...