Соскребание - Загрузка кнопок Dynami c - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь отсканировать в интернете продукты "Fre sh & Chilled" Waitrose & Partners , используя Ruby и Nokogiri.

Чтобы загрузить больше продуктов Мне нужно нажать «Загрузить еще ...», чтобы динамически загружать больше продуктов без изменения URL-адреса или перенаправления на новую страницу.

Как мне «нажать» на «Загрузить еще» кнопка, чтобы загрузить больше продуктов?

enter image description here

Я думаю, что это динамичный c веб-сайт, поскольку элементы загружаются динамически после нажатия «Загрузить еще .. . "и URL не изменяется вообще (поэтому пагинация не видна)

Вот код, который я пробовал до сих пор, но я застрял в загрузке большего количества элементов. Я предполагаю, что DOM загружается сам по себе, но вы не можете фактически нажать кнопку, потому что она представляет собой вызов javascript метода, который загрузит остальные элементы.

require "csv"
require "json"
require "nokogiri"
require "open-uri"
require "pry"

def scrape_category(category)
  CSV.open("out/waitrose_items_#{category}.csv", "w") do |csv|
    headers = [:id, :name, :category, :price_per_unit, :price_per_quantity, :image_url, :available, :url]
    csv << headers
    url = "https://www.waitrose.com/ecom/shop/browse/groceries/#{category}"
    html = open(url)
    doc = Nokogiri::HTML(html)
    load_more = doc.css(".loadMoreWrapper___UneG1").first
    pages = 0
    while load_more != nil
      puts pages.to_s
      load_more.content # Here's where I don't know how to click the button to load more items
      products = doc.css(".podHeader___3yaub")
      puts "products = " + products.length.to_s
      pages = pages + 1

      load_more = doc.css(".loadMoreWrapper___UneG1").first
    end
    (0..products.length-1).each do |i|
      puts "url = " + products[i].text
    end
    load_more = doc.css(".loadMoreWrapper___UneG1")[0]

    # here goes the processing of each single item to put in csv file
  end
end

def scrape_waitrose
  categories = [
    "fresh_and_chilled",
  ]

  threads = categories.map do |category|
    Thread.new { scrape_category(category) }
  end

  threads.each(&:join)

end

#binding.pry

1 Ответ

1 голос
/ 20 марта 2020

Нокогири - это способ разбора HTML. Это Ruby эквивалент Javascript Cheerio или Java Jsoup. На самом деле это не вопрос Нокогири.

Что вас смущает, так это способ синтаксического анализа HTML и метод сбора HTML, доставленный по сети. Важно помнить, что многие функции, такие как нажатие кнопок, включаются Javascript. В наши дни многие сайты, такие как сайты React, полностью построены на Javascript.

Так что, когда вы выполняете эту строку:

doc = Nokogiri::HTML(html)

Это переменная html, которую вы должны сконцентрировать на. Ваш html НЕ такой же, как html, который я бы просматривал на той же странице в своем браузере.

Для того, чтобы выполнить какой-либо надежный поиск в Интернете, вы * У 1012 * есть , чтобы использовать безголовый браузер, который будет выполнять Javascript файлы. В терминах Ruby это означало использование Poltergeist для управления Phantom js, безголовой версией браузера Webkit. Призрак js стал без поддержки, когда прибыл Кукольник и безголовый Chrome.

...