HTML scraping
Материал из Xgu.ru
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]')]
Здесь мы:
- Скачиваем страницу http://pyvideo.org/category/50/pycon-us-2014 с помощью requests;
- С помощью HTML-скрейпера BeautifulSoup извлекаем a-элементы (ссылки) у которых есть /video в атрибуте href;
- Проходимся по извлеченным элементам и находим значение их атрибутов 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))))
Подробнее:
- A Simple Enlive Example (англ.)
[править] Поддержка 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-скрейпинг далеко не всегда может помочь извлечь необходимые данные. Проблема в том, что данные могут генерироваться налету внутри страницы, и тогда тупой анализ кода страницы бессилен.
Существуют различные методы, позволяющие извлечь данные в этом случае, все они базируются на исполнении кода и использовании данных, полученных в результате исполнения, но способ исполнения и способ доступа к полученным даным может отличаться.
Пример такого подхода:
[править] Дополнительная информация
- Easy Web Scraping with Python (англ.)