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

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

Вопрос. Встречал ли кто-то в открытом доступе скрипты, с помощью которых можно такое делать и прикрутить к собственному проекту, чтобы можно было и себе "засасывать" страницы? ;)
  • Вопрос задан
  • 5973 просмотра
Пригласить эксперта
Ответы на вопрос 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 Получает только контент страницы. В большинстве сайтов с нормальной версткой работает отлично.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Sveak Барнаул
от 50 000 руб.
Девять линий Ульяновск
от 45 000 до 80 000 руб.
AwardWallet Пермь
от 40 000 до 100 000 руб.
16 июн. 2019, в 19:42
500 руб./за проект
16 июн. 2019, в 18:38
5000 руб./за проект
16 июн. 2019, в 17:14
5000 руб./за проект