Вопрос:

Как я могу извлечь HTML из URL, который требует JavaScript?

ruby

76 просмотра

1 ответ

1155 Репутация автора

Я пытаюсь извлечь необработанный HTML-код со страницы, которая требует JavaScript (с конечной целью извлечения только простого текста). К сожалению, простые getзапросы возвращают HTML, указывая необходимость браузера с JS. Пример:

> html = open('https://www.medicare.gov/Publications/').read
"<!DOCTYPE HTML>\n<!--[if lt IE 8]><html class=\"no-js oldIE\" lang=\"en-US\"><![endif]-->\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en-US\"><![endif]-->\n<!--[if IE 9]><html class=\"no-js ie9\" lang=\"en-US\"><![endif]-->\n<!--[if IE 11]>\n<style>\nbody{\ndisplay:none;\n}\n</style>\n<![endif]-->\n<!--[if (gt IE )|!(IE)]><!-->\n<html lang=\"en-US\" class=\"no-js not-ie\">\n    <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <!--<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">-->\n        <title>Publications</title>...
<body>\n        <div class=\"wrapper sl-translate\">\n            <div class=\"needCSS hidden\">\n                This application is not fully accessible to users whose browsers do not support or have Cascading Style Sheets (CSS) disabled. For a more optimal experience viewing this application, please enable CSS in your browser and refresh the page.\n            </div>\n            <!--<p class=\"browsehappy\">\n                Your browser is out of date  or not supported. Please visit <a href=\"http://browsehappy.com/\">browse happy</a> to upgrade to a better supported, modern browser.\n            </p>-->\n            <div class=\"js-off-message\">\n                <noscript>\n                The page could not be loaded. This application currently does not support browsers with \"JavaScript\" disabled. Please enable JavaScript and refresh the page to view this application.\n                </noscript>"

Я попытался обманом заставить страницу думать, что я использую браузер с JS, но (шокер) это тоже не сработало:

html = = HTTP.headers(user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36").follow.get(url).to_s

Есть ли хитрость в извлечении статического HTML из JS-страницы, например https://www.medicare.gov/hospicecompare/ ?

Автор: MothOnMars Источник Размещён: 02.01.2018 07:49

Ответы (1)


1 плюс

1155 Репутация автора

Решение

Основываясь на комментариях, предлагающих использовать браузер без головы, и подход, описанный в https://readysteadycode.com/howto-scrape-websites-with-ruby-and-headless-chrome , я смог извлечь HTML и простой текст используя следующее:

Установить ChromeDriver

$ brew install chromedriver

Установить селен-webdriver gem

$ gem install selenium-webdriver

Получить веб-страницу

> require 'selenium-webdriver'
> options = Selenium::WebDriver::Chrome::Options.new(args: ['headless'])
> driver = Selenium::WebDriver.for(:chrome, options: options)
> driver.get 'https://www.medicare.gov/hospicecompare/'

Извлечь HTML

> driver.find_element(css: 'html').attribute('innerHTML')

Извлечь обычный текст

> driver.find_element(css: 'html').text

Рекомендации

https://readysteadycode.com/howto-scrape-websites-with-ruby-and-headless-chrome https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings

Автор: MothOnMars Размещён: 02.01.2018 09:01
Вопросы из категории :
32x32