Подтвердить что ты не робот

Веб-скребок с Haskell

Каково текущее состояние библиотек для очистки веб-сайтов с помощью Haskell?

Я пытаюсь сделать больше своих быстрых однопользовательских задач в Haskell, чтобы помочь повысить уровень комфорта с помощью языка.

В Python я использую для этого отличную PyQuery. Есть что-то подобное просто и легко в Haskell? Я просмотрел Tag Soup, и, хотя сам синтаксический анализатор кажется приятным, на самом деле перемещение страниц выглядит не так хорошо, как на других языках.

Есть ли лучший вариант там?

4b9b3361

Ответ 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, я бы определенно пошел на основе объектива.