HTML scraping

Материал из Xgu.ru

Перейти к: навигация, поиск
В процессе HTML-скрейпинга данные из HTML-страницы извлекаются и представляются в виде структур данных программы, пригодных для дальнейшего использования

HTML scraping — техника, позволяющая извлекать структурированные данные из HTML-страниц.

Не все Web-сайты предоставляют информацию в удобном для использования в программах виде. Чаще они ориентированы на людей и визуальное представление информации. Для того чтобы использовать эту информацию в программах её нужно каким-то образом автоматически извлекать.

Существует огромное количество библиотек для различных языков программирования, облегчающих извлечение данных из HTML-страниц.

Различные техники извлечения информации из HTML-страниц известны под названием HTML-скрейпинг (англ. HTML scraping).

В скрейперах решены стандартные задачи по анализу HTML-страниц и упрощена задача поиска информации. Так, например, путь к искомой информации можно указать с помощью известных и привычных по jQuery CSS-селекторов.

Содержание

[править] Пример

Пример выполнений скрейпинга с помощью Python и BeautifulSoup:

import requests
import bs4

response = requests.get('http://pyvideo.org/category/50/pycon-us-2014')

soup = bs4.BeautifulSoup(response.text)
links = [a.attrs.get('href') for a in soup.select('div#video-summary-content a[href^=/video]')]

Здесь мы:

  1. Скачиваем страницу http://pyvideo.org/category/50/pycon-us-2014 с помощью requests;
  2. С помощью HTML-скрейпера BeautifulSoup извлекаем a-элементы (ссылки) у которых есть /video в атрибуте href;
  3. Проходимся по извлеченным элементам и находим значение их атрибутов href.

В результате у нас список ссылок на видео находится в переменной links.

Подробнее: Easy Web Scraping with Python (англ.).

[править] Переписывание HTML

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

Особенно далеко в этом пошёл Enlive, web-библиотека для Clojure, которая предлагает ещё один подход к созданию динамических вебсайтов (наряду с PHP-подобными языками, где программа совмещена с генерируемой страницей, и языками шаблонов типа Jinja2, где есть специальный язык шаблонов отвязанный от программы с основной логикой).

В Enlive сайт создаётся как чисто статический с заглушками на динамических участках, а потом оживляется с помощью данных, полученных динамически.

Пример статического шаблона:

<html>
  <head>
    <style type="text/css">
      body { font-family: sans-serif }
    </style>
  </head>
  <body>
    <div class="content">
      Content goes here.
    </div>
  </body>
</html>

Пример оживляющего кода:

(def things ["one" "two" "three" "four"])

(defn extract-body [html]
  (at html [#{:html :body}] unwrap))

(deftemplate layout "layout.html" [title content]
  [#{:title :h1}] (content title)
  [:div.content] (substitute (extract-body content)))

(defn show [things]
  (at (html-resource "show.html")
             [:li] (clone-for [thing things] (content thing))))

(def index (html-resource "index.html"))

(defroutes app
  (GET "/" [] (layout "Front page" index))
  (GET "/show" [] (layout "Show things" (show things))))

Подробнее:


[править] Поддержка HTML-скрейпинга в разных языках

  • Python
    • Beautiful Soup
    • lxml
    • HTQL
    • Scrapy
    • Mechanize
  • Ruby
    • Nokogiri
    • Hpricot
    • Mechanize
    • scrAPI
    • scRUBYt!
    • wombat
    • Watir
  • .NET
    • Html Agility Pack
    • WatiN
  • Perl
    • WWW::Mechanize
    • Web-Scraper
  • Java
    • Tag Soup
    • HtmlUnit
    • Web-Harvest
    • jARVEST
    • jsoup
    • Jericho HTML Parser
  • JavaScript
    • request
    • cheerio
    • artoo
    • node-horseman
    • phantomjs
  • PHP
    • htmlSQL
    • PHP Simple HTML DOM Parser
  • Clojure
    • Все библиотеки, которые подходят для Java
    • Enlive
  • Scala
    • Все библиотеки, которые подходят для Java
    • scala-scraper

Источник: [1]

[править] Альтернативы

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

Существуют различные методы, позволяющие извлечь данные в этом случае, все они базируются на исполнении кода и использовании данных, полученных в результате исполнения, но способ исполнения и способ доступа к полученным даным может отличаться.

Пример такого подхода:

[править] Дополнительная информация