Веб-скребок с Haskell
Каково текущее состояние библиотек для очистки веб-сайтов с помощью Haskell?
Я пытаюсь сделать больше своих быстрых однопользовательских задач в Haskell, чтобы помочь повысить уровень комфорта с помощью языка.
В Python я использую для этого отличную PyQuery. Есть что-то подобное просто и легко в Haskell? Я просмотрел Tag Soup, и, хотя сам синтаксический анализатор кажется приятным, на самом деле перемещение страниц выглядит не так хорошо, как на других языках.
Есть ли лучший вариант там?
Ответы
Ответ 1
Из моего поиска в списках рассылки Haskell, похоже, что TagSoup является доминирующим выбором для синтаксического анализа страниц. Например:
http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html
Что касается других аспектов веб-соскабливания (таких как сканирование, паучивание и кеширование), я искал http://hackage.haskell.org/package/ для этих ключевых слов но не нашел ничего перспективного. Я даже просматривал пакеты с упоминанием "http", но ничего не выскочил на меня.
Примечание. Я не обычный Хаскеллер, поэтому надеюсь, что другие могут прослушивать, если я что-то пропустил.
Ответ 2
http://hackage.haskell.org/package/shpider
Shpider - это библиотека веб-автоматизации для Haskell. Это позволяет быстро писать сканеры и для простых случаев ( как следующие ссылки) даже без чтение источника страницы.
Он имеет полезные функции, такие как поворот относительные ссылки со страницы на абсолютные ссылки, варианты авторизации транзакции только в данном домене, и возможность загружать только html документы.
Он также обеспечивает хороший синтаксис для заполнение форм.
Пример:
runShpider $ do
download "http://apage.com"
theForm : _ <- getFormsByAction "http://anotherpage.com"
sendForm $ fillOutForm theForm $ pairs $ do
"occupation" =: "unemployed Haskell programmer"
"location" =: "mother house"
Ответ 3
Хотя я все еще нахожусь новичком в Haskell, у меня есть сильное мнение о том, что синтаксический анализ HTML в 2012 году должен выполняться с помощью селекторов CSS, и, похоже, библиотеки, рекомендованные до сих пор, не используют этот принцип.
Одна из возможностей - HandsomeSoup, которая построена поверх HXT:
http://egonschiele.github.com/HandsomeSoup/
http://codingtales.com/2012/04/25/scraping-html-with-handsomesoup-in-haskell
Эта страница о HXT, на которую полагается HandsomeSoup, также будет полезна (вам понадобится getText или глубокий getText):
http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html
Но другой выбор - dom-selector:
http://hackage.haskell.org/package/dom-selector
Именно сейчас альфа и ее долгосрочное обслуживание могут быть проблемой. Преимущество dom-selector заключается в том, что я не мог заставить символы Unicode работать с HandsomeSoup. Они работали из коробки с dom-селектором.
Этот вопрос связан с этим:
Можно ли использовать Text или ByteString для HXT в Haskell?
dom-селектор основан на html-канале и xml-канале, для которых обслуживание гарантируется.
EDIT: обратите внимание на мой новый ответ об анализе на основе объективов. Я оставил этот ответ, поскольку он по-прежнему хорош сам по себе, но теперь я бы скорее использовал другой подход.
Ответ 4
Я уже написал еще один ответ на этот вопрос, предложив синтаксический анализ на основе селекторов CSS, однако этот ответ теперь полтора года, и в настоящее время я думаю, что линзы могут быть лучшим подходом в haskell. На самом деле вы получаете что-то вроде скомпилированных селекторов типа.
См. это reddit обсуждение для нескольких вариантов в этом ключе. Если ссылка исчезнет, я скопирую прямые ссылки:
Я пока не использовал ни одного из них, но если бы я сегодня писал новый синтаксический анализ кода HTML, я бы определенно пошел на основе объектива.