Веб-скрэпинг. HTML и CSS

Один из основных источников данных – это, конечно, Интернет. И я даже не о данных, которые можно скачать по ссылке в .csv или каком-то другом табличном формате. Данные можно напрямую собирать с самих веб-страниц – это называется веб-скрэпингом. Для этого нам нужно немного разобраться с тем, а как вообще работает этот ваш Интернет. [Working of Domain Name System (DNS) Server - GeeksforGeeks

Когда в веб-браузере (например, Chrome, Safari или Firefox) мы пишем адрес в адресной строке, то происходит два процесса: сначала происходит обращение к DNS-серверу, который связывает строковое название сайта и IP-адрес – уникальный адрес сайта в сети. Потом браузер обращается по IP-адресу к веб-серверу и возвращает нам текст, размеченный с помощью языка разметки HTML. Затем веб-браузер рендерит (т.е. отрисовывает) нам полученную веб-страницу.

Веб-скрэпинг вклинивается в этот “естественный” процесс: с помощью R мы имитируем работу веб-браузера. Мы передаем адрес веб-сайта, получаем IP-адрес, передаем его веб-серверу и получаем HTML-страницу. Однако вместо отрисовки этой веб-страницы, мы пытаемся вытащить из нее то, что нам интересно. Для этого нам нужно знать как устроена HTML-страница

HTML разметка

HTML расшифровывается как HyperText Markup Language, это стандартизированный язык разметки, который используется для разметки веб-страниц в Интернете. Он был разработан сэром Тимом Бернерсом-Ли вместе с Всемирной паутиной (World Wide Web), протоколом передачи данных HTTP, стандартом веб-адресов URL – в общем, вместе со всем современным Интернетом как мы его знаем.

Давайте посмотрим на пример простой веб-страницы в формате HTML:

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
    </head>
    <body>
      <h2>Классная веб-страничка!</h2>
      <p>Здесь написан какой-то текст.</p>
    </body>
  </html>

Если внимательно приглядеться, то можно увидеть несколько предложений на русском языке, которые со всех сторон завернуты в теги. Теги начинаются с значка <и заканчиваются >. Большинство тегов проставляются два раза: для открытия и для закрытия. Закрывающий тег выглядит так же, как и открывающий, но в нем стоит / после <:

<h1>h1 – тег для закоголовка первого уровня</h1>

Теги задают структуру страницы, а так же форматируют текст желаемым образом. Давайте сначала разберемся со структурой HTML-документа, она универсальна для всех веб-страниц. 1. Сверху нас ждет <!DOCTYPE HTML> – это просто говорит нам о том, что это HTML-страница, а не что-то еще. 2. После <!DOCTYPE HTML> идет тег <html>, внутри которого есть два тега: <head> – внутри него лежит название страницы, подключаемые стили CSS и подключаемые элементы JavaScript (которые дают странице интерактивность). Короче говоря, <head> – это мета-данные страницы. 3. Второй тег внутри <html><body>, где лежит собственно содержание веб-страницы: сам ее текст, картинки, таблицы и т.д.

Внутри <body> находятся теги, которые форматируют внешний вид текста веб-страницы: заголовки, параграфы, списки и т.д. Например, для создания обычного параграфа текста используется тег <p>, а для заголовков – <h*>, где вместо * – уровень заголовка от 1 до 6.

Давайте теперь посмотрим, как эта HTML-страница отрендерится в веб-браузере (если вы работаете из RStudio, то для .html документов есть кнопка >Preview):

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
    </head>
    <body>
      <h2>Классная веб-страничка!</h2>
      <p>Здесь написан какой-то текст.</p>
    </body>
  </html>

Теперь попробуем добавить чего-то новенькое, например, гиперссылку на веб-страницу в Интернете. Для этого нам понадобится не только тег <a>, но и прописать атрибут href для этого тега. Выглядеть это будет следующим образом.

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
    </head>
    <body>
      <h2>Классная веб-страничка!</h2>
      <p>Здесь написан какой-то текст.</p>
      <p><a href="https://www.w3schools.com/html/">Здесь</a> можно узнать про HTML-теги гораздо больше.</p>
    </body>
  </html>

Теперь попробуйте самостоятельно: 1. Добавить еще один заголовок второго уровня 2. Добавить еще один абзац с текстом 3. Добавить пронумерованный список. Для этого вам нужно самостоятельно найти нужные теги по ссылке

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
    </head>
    <body>
      <h2>Классная веб-страничка!</h2>
      <p>Здесь написан какой-то текст.</p>
      <p><a href="https://www.w3schools.com/html/">Здесь</a> можно узнать про HTML-теги гораздо больше.</p>
      <h2>Еще один заголовок!</h2>
      <p>А еще можно создать пронумерованный список:</p>
      <ol>
        <li>Первый элемент</li>
        <li>Второй элемент</li>
        <li>Третий элемент</li>
      </ol>
    </body>
  </html>

Для веб-скрэпинга особенно важны таблицы, давайте посмотрим как они устроены в HTML-разметке.

      <h2>Мои любимые цвета</h2>
      <table>
        <tr><th>Ранг</th><th>Цвет</th></tr>
        <tr><td>1</td><td>Зеленый</td></tr>
        <tr><td>2</td><td>Голубой</td></tr>
        <tr><td>3</td><td>Черный</td></tr>
        <tr><td>4</td><td>Желтый</td></tr>
      </table>

CSS

Если мы хотим поменять внешний вид какого-либо элемента, то мы можем тоже прописать как атрибут style внутри интересующего нас тега:

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
    </head>
    <body>
      <h2 style="color:green">Классная веб-страничка!</h2>
      <p>Здесь написан какой-то текст.</p>
      <p><a href="https://www.w3schools.com/html/">Здесь</a> можно узнать про HTML-теги гораздо больше.</p>
      <h2>Еще один заголовок!</h2>
      <p>А еще можно создать пронумерованный список:</p>
      <ol>
        <li>Первый элемент</li>
        <li>Второй элемент</li>
        <li>Третий элемент</li>
      </ol>
    </body>
  </html>

Но так сегодня никто не делает: прописывать для каждого отдельного тега стиль – дело неблагодарное! Вместо этого делают каскадные таблицы стилей (CSS), которые выглядят следующим образом:

h2 {
  color:blue;
  font-family: Arial;
}

p {
  color: #3333AA;
  font-family: Helvetica;
  font-size: 20;
}

Для каждого интересующего тега (заголовка второго уровня <h2> и параграфа <p> мы прописали свой стиль. Этот код нам нужно сохранить в отдельный файл с расширением .css (назовем его my_style.css). Затем файл со стилями нужно прикрепить в шапке (<head>) HTML-документа:

      <link rel="stylesheet" href="my_style.css">

Если мы положим наш .css-файл с my_style.css в папку с HTML-файлом, то теперь HTML-страница будет рендериться следующим образом:

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
      <link rel="stylesheet" href="my_style.css">
    </head>
    <body>
      <h2 style="color:green">Классная веб-страничка!</h2>
      <p>Здесь написан какой-то текст.</p>
      <p><a href="https://www.w3schools.com/html/">Здесь</a> можно узнать про HTML-теги гораздо больше.</p>
      <h2>Еще один заголовок!</h2>
      <p>А еще можно создать пронумерованный список:</p>
      <ol>
        <li>Первый элемент</li>
        <li>Второй элемент</li>
        <li>Третий элемент</li>
      </ol>
    </body>
  </html>

Более того, мы можем создавать собственные классы стилей, которые затем будем использовать для произвольных элементов веб-страницы:

h2 {
  color:blue;
  font-family: Arial;
}

p {
  color: #3333AA;
  font-family: Helvetica;
  font-size: 20;
}

.working_class {
  color: red;
}

Давайте назовем этот файл “my_style2.css” и присоединим его к некоторым элементам:

<!DOCTYPE HTML>
  <html>
    <head>
      <title>Моя веб-страничка</title>
      <link rel="stylesheet" href="my_style2.css">
    </head>
    <body>
      <h2 style="color:green">Классная веб-страничка!</h2>
      <p class="working_class">Здесь написан какой-то текст.</p>
      <p><a href="https://www.w3schools.com/html/">Здесь</a> можно узнать про HTML-теги гораздо больше.</p>
      <h2>Еще один заголовок!</h2>
      <p>А еще можно создать пронумерованный список:</p>
      <ol>
        <li class="working_class">Первый элемент</li>
        <li>Второй элемент</li>
        <li>Третий элемент</li>
      </ol>
    </body>
  </html>