Парсим/грабим веб-страницы без мусора?

В последнее время появилось много сервисов отложенного чтения, которые "грабят" контент сайтов прямо со страницы (не из фидов), красиво очищая все лишнее и оставляя только размеченный текст без всяких спанов, размеров шрифтов и прочего, да картинки. Например https://getpocket.com/

Вопрос. Встречал ли кто-то в открытом доступе скрипты, с помощью которых можно такое делать и прикрутить к собственному проекту, чтобы можно было и себе "засасывать" страницы? ;)
  • Вопрос задан
  • 6716 просмотров
Пригласить эксперта
Ответы на вопрос 9
@mik222
Эта задача называется data region mining и является довольно хитрой проблемой, т.к. верстка может быть везде разной, а вы решаете задачу поиска основного контента на сайте(т.е. обрезать рекламу, навигационные блоки, левые вставки, спрятанный контент и прочее)
Вот вам на вскидку алгоритм:
1. Для каждой html ноды в дереве, вычислить её площадь(рендерите через phantom.js и вычисляете площадь через Element.getBoundingClientRect())
2. Удаляете все, что меньше средней площади на этом уровне. (Вычищаем не имеющие значения блоки)
3. Спускаетесь вниз на один уровень и повторяете алгоритм


В результате получите набор текстовых блоков, которые имеют максимальный объем на странице.

Вам нужно будет эмпирически до настроить алгоритм под ваш use case:
Например, если перед вами регион с большим количеством текстовых блоков, то достать текст из всех дочерних и уложить в регион(таким образом мы избегаем вырезки bold italic текста).

Дальше за вами стоит задача объединить эти регионы в статью/статьи(в случае с лентой).
--------
Существуют и более любопытные алгоритмы по вычислению попарной similarity между произвольными дочерними нодами с целью найти data region
Но это вам нужно читать опубликовынные статьи на эту тему, например:
dl.acm.org/citation.cfm?id=1060761
Ответ написан
leahch
@leahch
Я мастер на все руки, я козлик Элек Мэк :-)
Конечно есть - lxml.de/lxmlhtml.html#cleaning-up-html
Ну и уже из очищенного можно выделять что нужно.
Да, забирать лучше библиотекой requests - docs.python-requests.org/en/master
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
Штучная ручная работа, под каждый сайт пишется свой маленький велосипедик.
Ну, не велосипедик, скорее прикручиваются другие колеса к одному велосипеду.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
ну, если кратко: это задача поиска ОСНОВНОГО контента страницы.
1. Удаляем все контейнеры, с количеством дочерних элементов превышающих 1.
2. Чистим контейнер body от всех тегов, кроме тегов-контейнеров (div,td)
3. Находим контейнер (div,td) с самым длинным текстом.
4. Смело его грабим.
Ответ написан
@beatleboy
Apist - отличная вещь! Позволяет с легкостью парсить страницы, обращайся к элементам в стиле jquery. Пример парсинга Хабра:

public function index()
{
	return $this->get('/', [
		'title' => Apist::filter('.page_head .title')->text()->trim(),
		'posts' => Apist::filter('.posts .post')->each([
			'title'      => Apist::filter('h1.title a')->text(),
			'link'       => Apist::filter('h1.title a')->attr('href'),
			'hubs'       => Apist::filter('.hubs a')->each(Apist::filter('*')->text()),
			'author'     => [
				'username'     => Apist::filter('.author a'),
				'profile_link' => Apist::filter('.author a')->attr('href'),
				'rating'       => Apist::filter('.author .rating')->text()
			]
		])
	]);
}


Возвращает данные массивом:
{
    "title": "Публикации",
    "posts": [
        {
            "title": "Проверьте своего хостера на уязвимость Shellshock (часть 2)",
            "link": "http:\/\/habrahabr.ru\/company\/host-tracker\/blog\/240389\/",
            "hubs": [
                "Блог компании ХостТрекер",
                "Серверное администрирование",
                "Информационная безопасность"
            ],
            "author": {
                "username": "smiHT",
                "profile_link": "http:\/\/habrahabr.ru\/users\/smiHT\/",
                "rating": "26,9"
            }
        },
        {
            "title": "Курсы этичного хакинга и тестирования на проникновение от PentestIT",
            "link": "http:\/\/habrahabr.ru\/company\/pentestit\/blog\/240995\/",
            "hubs": [
                "Блог компании PentestIT",
                "Учебный процесс в IT",
                "Информационная безопасность"
            ],
            "author": {
                "username": "pentestit-team",
                "profile_link": "http:\/\/habrahabr.ru\/users\/pentestit-team\/",
                "rating": "36,4"
            }
        },
        ...
    ]
}

Тут подробнее
Ответ написан
Vlad_IT
@Vlad_IT Куратор тега HTML
Front-end разработчик
Для Python 3 использовал либу https://pypi.python.org/pypi/newspaper Получает только контент страницы. В большинстве сайтов с нормальной версткой работает отлично.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы