SlideShare a Scribd company logo
Юрий Бабуров (buriy)
Webdev, AI, HighLoad
Получаем текст веб-страниц из Python и как
это работает, или применение эвристик для
решения сложных задач
(На примере библиотеки readability-lxml)
План действий

Формулируем задачу

Из чего состоят новостные веб-страницы?

Придумываем алгоритм сами

Обобщим наш опыт

Пара историй для размышления

Рассматриваем альтернативные идеи
Зачем нужны новостные статьи

Сайты-агрегаторы новостей

Сниппеты новостей

Текстовые корпуса для лингвистов

Анализ потока новостной информации

Reading list в Safari
Поговорим не только про конкретную задачу,
но и про используемые технологии, обобщив
наш опыт
Формулируем задачу

Задачу можно формулировать и решать по-
разному, мы рассмотрим лишь одно из
возможных решений.

Сайтов нужно обработать много, статей –
ещё больше.
− Поэтому алгоритм должен работать быстро
− Но, по возможности, качественно
− У нас не так много времени на разработку
− Но надо иметь возможность настройки для
важных сайтов
− Мы можем ограничиться HTML-версиями
Получаем результат
$ sudo pip install readability-lxml
$ python -m readability.readability -b -u
http://lenta.ru/news/2015/08/26/nishtiak_the_cat/
конечно, то же самое можно сделать и из
программы на python, пример будет позднее
Как это может работать для
самых разных сайтов?
Даю 15 секунд на размышления
(только молча)
Из чего, из чего сделаны
новостные статьи...
Хорошая новостная
статья
Из чего, из чего сделаны
новостные статьи...
Хорошая новостная
статья:

Категория

Дата и время

Заголовок

Иллюстрация

Текст
Из чего, из чего сделаны
новостные статьи...
Что нас интересует в
первую очередь:

Заголовок

Иллюстрация

Текст
Из чего, из чего сделаны
новостные статьи...
Плохая новостная
статья:
Из чего, из чего сделаны
новостные статьи...
Плохая новостная
статья:

Социальные иконки

Вставки

Текстовая и
графическая
реклама
Из чего, из чего сделаны
новостные статьи...
Всё, кроме статьи:
Из чего, из чего сделаны
новостные статьи...
Всё, кроме статьи:

Подзаголовки

Блоки ссылок

Рекламные блоки
Тоже части веб-страницы
Ссылочные и рекламные блоки Ссылки на другие страницы и общая
для всех страниц информация
Как искать текст статьи

Чего хотим:
− Текст!
− Много текста рядом!

Не хотим:
− Ссылочных блоков
− Блоков с картинками
− Подзаголовков
− Маленьких картинок
Текст: Длинные законченные предложения
Заголовки: Короткие предложения без точки в конце
Мы нашли набор критериев, как отличить текст от всего остального.
Наше кольцо всевластья: основы

Получаем “веса”, оценивая “текстовость”
каждого блока на странице, штрафуя за
высокий процент текста ссылок и мелкие
иллюстрации.

Используем древовидность HTML: узлам-
родителям даём бонус за хороших
“детей” и “внуков” (50% от веса).

Удаляем нетекстовые блоки (с весом
меньше нуля)

Находим блок текста с наибольшим
весом – часто это наибольший блок

Надеемся на адекватность авторов веб-
странички!

<BODY>
− <DIV>

В Новосибирске
выбрали кота...

Помимо
торжественной
прогулки...

Блок с иконками
− <DIV>

ПОСЛЕДНИЕ
НОВОСТИ

Много ссылок
Увы, не всё так просто
Некоторые комментарии бывают
длиннее и лучше, чем текст статьи
Настоящим жадинам нужно
несколько страниц для одной новости
Как искать заголовок новости
Даю 15 секунд на размышления
(только молча)
Как искать заголовок новости

Поисковая
оптимизация – шаг к
унификации

<title>

<H1> или <H2>

<H3> и <H4>

Ищем заголовок,
похожий на Title
Как искать иллюстрации
Думаю, вы уже догадались...
Как искать иллюстрации
Положительные факторы:

Одна или несколько иллюстраций

Большого размера

Располагаются посреди текста или рядом
Отрицательные факторы:

Много иллюстраций

Маленького размера

Находятся далеко от текстовых блоков
Обобщение – мать учения

Использованный приём называется
“эвристика” или “эвристический алгоритм”
(heuristic)

В библиотеке readability-lxml используется
порядка 50 эвристик.

Эвристика позволяет дать достаточно
хорошое решение в большинстве случаев,
но ошибается временами

Позволяет хоть как-то решать задачи, с
которыми не справиться другими методами

Или сократить скорость работы других
Примеры эвристик и других
вероятностных методов

Определить формат файла в большинстве
случаев можно по первым байтам

“Email – любая строка, содержащая @ и
точку после знака @”

“Email – строка, удовлетворяющая этому
длинному регулярному выражению”.

Выделение наиболее информативных
предложений из текста (text summarization)
Примеры: Шагомер, Kinect, поиск лиц на
Другие идеи
для задачи поиска текста

Использовать информацию из class=”...” и id=”...”, а также
название тега для улучшения критерия хороших и плохих тегов в
HTML

Использовать CSS-стили, например display:none

Загружать страницу в браузер:
− ждать выполнения Javascript
− определять и использовать координаты текстовых блоков
(текст статьи обычно выше комментариев, посторонние блоки
узкие и находятся сбоку)

При поиске заголовка использовать URL (nishtiak_the_cat/).
Дополнительные эвристики для
readability-lxml

Проблема: получили длинный комментарий
вместо короткого текста статьи

Предлагаемая эвристика: Использовать
страницу со списком статей или RSS-фид,
получить оттуда текст начала статьи или
описание, и сравнивать его с текстовыми
блоками (аналогия с заголовком)

Ещё одна эвристика. Если есть много статей
с одного источника:
− Можно классифицировать статьи по качеству:
например, полученные одинаковые статьи по
Жизненный цикл эвристики

Помните, кому-то придётся поддерживать ваш код, поэтому
обязательно комментируйте эвристики.

Выбор способа за вами, скажем
#Hack: … , docstring, ссылка на сайт-источник регулярного
выражения или ссылка на баг, из-за которого эвристика
появилась в вашем коде.
Определение похожести двух
текстов
def calc_quality(feed_text, article_text):
"""
Returns a number between 0 and 100
"""
feed_words = set(feed_text.split())
article_words = set(article_text.split())
if not article_words: return 20
intersection = len(article_words & feed_words)
return int(10 * min(10, max(5 + intersection - 0.6 * len(feed_words),
0)))
-------------------------------------------------------
from readability.readability import Document
import urllib
html = urllib.urlopen(url).read()
readable_article = Document(html).summary()
readable_title = Document(html).short_title()
Сортируем тексты по похожести
class MyDocument(Document):
def select_best_candidate(self, candidates):
if not candidates: return None
feed_text = html2text(self.article.feed_snippet)
if not feed_text:
feed_text = self.article.title
sorted_candidates = sorted(candidates.values(), reverse=True,
key=lambda x: x['content_score'])
for candidate in sorted_candidates[:50]:
elem_text = html2text(tounicode(candidate['elem']))
quality = calc_quality(feed_text, elem_text)
if quality > 50:
candidate['content_score'] += 10
elif quality > 0:
candidate['content_score'] += 1
sorted_candidates = sorted(candidates.values(), reverse=True,
key=lambda x: x['content_score'])
return sorted_candidates[0]
Спасибо за внимание
Ваши вопросы

More Related Content

What's hot

NoSQL - взрыв возможностей
NoSQL - взрыв возможностейNoSQL - взрыв возможностей
NoSQL - взрыв возможностей
Aleksey Solntsev
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программиста
Slach
 
Оживление сайтов
Оживление сайтовОживление сайтов
Оживление сайтовMageCloud
 
кеширование на высоконагруженном Drupal сайте архаров роман (rus)
кеширование на высоконагруженном Drupal сайте архаров роман (rus)кеширование на высоконагруженном Drupal сайте архаров роман (rus)
кеширование на высоконагруженном Drupal сайте архаров роман (rus)drupalconf
 
А. Лозенко: SEO-копирайтинг with HTML
А. Лозенко: SEO-копирайтинг with HTMLА. Лозенко: SEO-копирайтинг with HTML
А. Лозенко: SEO-копирайтинг with HTMLAweb
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Ontico
 
Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера
Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера
Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера
RIF-Technology
 
Антон Забанных, Роман Иванов "Яндекс.Почта"
Антон Забанных, Роман Иванов "Яндекс.Почта"Антон Забанных, Роман Иванов "Яндекс.Почта"
Антон Забанных, Роман Иванов "Яндекс.Почта"
Yandex
 
Как оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых системКак оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых систем
Сергей Кокшаров
 
Мастер-класс "Привет, Drupal"
Мастер-класс "Привет, Drupal"Мастер-класс "Привет, Drupal"
Мастер-класс "Привет, Drupal"
zabej
 
Drupalconf moscow-2012-arkharov
Drupalconf moscow-2012-arkharovDrupalconf moscow-2012-arkharov
Drupalconf moscow-2012-arkharovrrromka
 
"Автоматический подбор семантики" Михаил РАЙЦИН
"Автоматический подбор семантики" Михаил РАЙЦИН"Автоматический подбор семантики" Михаил РАЙЦИН
"Автоматический подбор семантики" Михаил РАЙЦИНNika Stuard
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Yandex
 
Как оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страницКак оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страницСергей Кокшаров
 
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...PVasili
 
Lesson1
Lesson1Lesson1
Lesson1
jinol
 
Web весна 2013 лекция 1
Web весна 2013 лекция 1Web весна 2013 лекция 1
Web весна 2013 лекция 1Technopark
 
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Ontico
 
Фотострана, Дмитрий Смирнов
Фотострана, Дмитрий СмирновФотострана, Дмитрий Смирнов
Фотострана, Дмитрий Смирнов
EYevseyeva
 
HappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный веб
HappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный вебHappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный веб
HappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный веб
HappyDev-lite
 

What's hot (20)

NoSQL - взрыв возможностей
NoSQL - взрыв возможностейNoSQL - взрыв возможностей
NoSQL - взрыв возможностей
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программиста
 
Оживление сайтов
Оживление сайтовОживление сайтов
Оживление сайтов
 
кеширование на высоконагруженном Drupal сайте архаров роман (rus)
кеширование на высоконагруженном Drupal сайте архаров роман (rus)кеширование на высоконагруженном Drupal сайте архаров роман (rus)
кеширование на высоконагруженном Drupal сайте архаров роман (rus)
 
А. Лозенко: SEO-копирайтинг with HTML
А. Лозенко: SEO-копирайтинг with HTMLА. Лозенко: SEO-копирайтинг with HTML
А. Лозенко: SEO-копирайтинг with HTML
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
 
Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера
Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера
Юрий Буянов | (Одноклассники)Нюансы разработки мобильного мессенджера
 
Антон Забанных, Роман Иванов "Яндекс.Почта"
Антон Забанных, Роман Иванов "Яндекс.Почта"Антон Забанных, Роман Иванов "Яндекс.Почта"
Антон Забанных, Роман Иванов "Яндекс.Почта"
 
Как оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых системКак оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых систем
 
Мастер-класс "Привет, Drupal"
Мастер-класс "Привет, Drupal"Мастер-класс "Привет, Drupal"
Мастер-класс "Привет, Drupal"
 
Drupalconf moscow-2012-arkharov
Drupalconf moscow-2012-arkharovDrupalconf moscow-2012-arkharov
Drupalconf moscow-2012-arkharov
 
"Автоматический подбор семантики" Михаил РАЙЦИН
"Автоматический подбор семантики" Михаил РАЙЦИН"Автоматический подбор семантики" Михаил РАЙЦИН
"Автоматический подбор семантики" Михаил РАЙЦИН
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Как оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страницКак оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страниц
 
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
 
Lesson1
Lesson1Lesson1
Lesson1
 
Web весна 2013 лекция 1
Web весна 2013 лекция 1Web весна 2013 лекция 1
Web весна 2013 лекция 1
 
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
 
Фотострана, Дмитрий Смирнов
Фотострана, Дмитрий СмирновФотострана, Дмитрий Смирнов
Фотострана, Дмитрий Смирнов
 
HappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный веб
HappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный вебHappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный веб
HappyDev-lite-2016-весна 02 Дмитрий Пашкевич. Нетривиальный веб
 

Viewers also liked

Python инструменты решения типичных задач
Python  инструменты решения типичных задачPython  инструменты решения типичных задач
Python инструменты решения типичных задач
PyNSK
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
 
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
PyNSK
 
Интерфейсы в Python
Интерфейсы в PythonИнтерфейсы в Python
Интерфейсы в Python
Andrew Svetlov
 
Чем Python плох для стартапа?
Чем Python плох для стартапа?Чем Python плох для стартапа?
Чем Python плох для стартапа?
PyNSK
 
Применение криптографии для обезличивания персональных данных
Применение криптографии для обезличивания персональных данныхПрименение криптографии для обезличивания персональных данных
Применение криптографии для обезличивания персональных данных
Aleksey Lukatskiy
 

Viewers also liked (6)

Python инструменты решения типичных задач
Python  инструменты решения типичных задачPython  инструменты решения типичных задач
Python инструменты решения типичных задач
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
 
Интерфейсы в Python
Интерфейсы в PythonИнтерфейсы в Python
Интерфейсы в Python
 
Чем Python плох для стартапа?
Чем Python плох для стартапа?Чем Python плох для стартапа?
Чем Python плох для стартапа?
 
Применение криптографии для обезличивания персональных данных
Применение криптографии для обезличивания персональных данныхПрименение криптографии для обезличивания персональных данных
Применение криптографии для обезличивания персональных данных
 

Similar to Получаем текст веб-страниц из Python и как это работает

Usability и SEO. Юрий Грановский
Usability и SEO. Юрий ГрановскийUsability и SEO. Юрий Грановский
Usability и SEO. Юрий Грановский
Клуб Интернет-Маркетологов
 
Trening modul2-webinar11
Trening modul2-webinar11Trening modul2-webinar11
Trening modul2-webinar11
olgaoov
 
принципы написания и разметки новостей в интернет
принципы написания и разметки новостей в интернетпринципы написания и разметки новостей в интернет
принципы написания и разметки новостей в интернет
Oleg Khomenok
 
J query tutorial-for-beginners-1.0.0
J query tutorial-for-beginners-1.0.0J query tutorial-for-beginners-1.0.0
J query tutorial-for-beginners-1.0.0
Сергей Ядров
 
J query tutorial-for-beginners-1.0.1
J query tutorial-for-beginners-1.0.1J query tutorial-for-beginners-1.0.1
J query tutorial-for-beginners-1.0.1labzzzz
 
Основы работы в викивики теория
Основы работы в викивики теорияОсновы работы в викивики теория
Основы работы в викивики теорияJuliaNaz
 
Знакомство с Летописью.ru
Знакомство с Летописью.ruЗнакомство с Летописью.ru
Знакомство с Летописью.ru
JuliaNaz
 
сысоев андрей
сысоев андрейсысоев андрей
сысоев андрейVlado Sudin
 
сысоев андрей
сысоев андрейсысоев андрей
сысоев андрейVlado Sudin
 
Презентация SEO - все что нужно знать про поисковую оптимизацию сайта
Презентация SEO - все что нужно знать про поисковую оптимизацию сайтаПрезентация SEO - все что нужно знать про поисковую оптимизацию сайта
Презентация SEO - все что нужно знать про поисковую оптимизацию сайта
Andrew PersonBh
 
Использование тегов и мета-тегов на веб-страницах
Использование тегов и мета-тегов на веб-страницахИспользование тегов и мета-тегов на веб-страницах
Использование тегов и мета-тегов на веб-страницах
Netpeak
 
Основные положения SEO
Основные положения SEOОсновные положения SEO
Основные положения SEOAlex Lychack
 
Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?
Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?
Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?
NaZapad
 
Продвижение сайтов социальных проектов
Продвижение сайтов социальных проектов Продвижение сайтов социальных проектов
Продвижение сайтов социальных проектов
Irina Nikulina
 
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleЗачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Yandex
 
Как провести реанимацию контента и прокачать органический трафик
Как провести реанимацию контента и прокачать органический трафикКак провести реанимацию контента и прокачать органический трафик
Как провести реанимацию контента и прокачать органический трафик
Netpeak
 
FrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страниц
FrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страницFrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страниц
FrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страниц
FrontDays
 
99999999999999999999999
9999999999999999999999999999999999999999999999
99999999999999999999999
prmegaindex
 
Trening modul2-conf1-tema5
Trening modul2-conf1-tema5Trening modul2-conf1-tema5
Trening modul2-conf1-tema5
olgaoov
 

Similar to Получаем текст веб-страниц из Python и как это работает (20)

Usability и SEO. Юрий Грановский
Usability и SEO. Юрий ГрановскийUsability и SEO. Юрий Грановский
Usability и SEO. Юрий Грановский
 
Trening modul2-webinar11
Trening modul2-webinar11Trening modul2-webinar11
Trening modul2-webinar11
 
принципы написания и разметки новостей в интернет
принципы написания и разметки новостей в интернетпринципы написания и разметки новостей в интернет
принципы написания и разметки новостей в интернет
 
J query tutorial-for-beginners-1.0.0
J query tutorial-for-beginners-1.0.0J query tutorial-for-beginners-1.0.0
J query tutorial-for-beginners-1.0.0
 
J query tutorial-for-beginners-1.0.1
J query tutorial-for-beginners-1.0.1J query tutorial-for-beginners-1.0.1
J query tutorial-for-beginners-1.0.1
 
Основы работы в викивики теория
Основы работы в викивики теорияОсновы работы в викивики теория
Основы работы в викивики теория
 
Знакомство с Летописью.ru
Знакомство с Летописью.ruЗнакомство с Летописью.ru
Знакомство с Летописью.ru
 
сысоев андрей
сысоев андрейсысоев андрей
сысоев андрей
 
сысоев андрей
сысоев андрейсысоев андрей
сысоев андрей
 
Lect1
Lect1Lect1
Lect1
 
Презентация SEO - все что нужно знать про поисковую оптимизацию сайта
Презентация SEO - все что нужно знать про поисковую оптимизацию сайтаПрезентация SEO - все что нужно знать про поисковую оптимизацию сайта
Презентация SEO - все что нужно знать про поисковую оптимизацию сайта
 
Использование тегов и мета-тегов на веб-страницах
Использование тегов и мета-тегов на веб-страницахИспользование тегов и мета-тегов на веб-страницах
Использование тегов и мета-тегов на веб-страницах
 
Основные положения SEO
Основные положения SEOОсновные положения SEO
Основные положения SEO
 
Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?
Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?
Обратные ссылки или внутренняя оптимизация: какому потоку отдать приоритет?
 
Продвижение сайтов социальных проектов
Продвижение сайтов социальных проектов Продвижение сайтов социальных проектов
Продвижение сайтов социальных проектов
 
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleЗачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
 
Как провести реанимацию контента и прокачать органический трафик
Как провести реанимацию контента и прокачать органический трафикКак провести реанимацию контента и прокачать органический трафик
Как провести реанимацию контента и прокачать органический трафик
 
FrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страниц
FrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страницFrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страниц
FrontDays #1. Илья Кучмин, Оптимизация загрузки тяжелых страниц
 
99999999999999999999999
9999999999999999999999999999999999999999999999
99999999999999999999999
 
Trening modul2-conf1-tema5
Trening modul2-conf1-tema5Trening modul2-conf1-tema5
Trening modul2-conf1-tema5
 

More from PyNSK

Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
PyNSK
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
PyNSK
 
Asyncio для процессинга распределенной базы данных
Asyncio для процессинга  распределенной базы данныхAsyncio для процессинга  распределенной базы данных
Asyncio для процессинга распределенной базы данных
PyNSK
 
Python для GameDev
Python для GameDevPython для GameDev
Python для GameDev
PyNSK
 
Python инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестированияPython инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестирования
PyNSK
 
Python, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системыPython, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системы
PyNSK
 
Настрой контент под пользователя!
Настрой контент под пользователя!Настрой контент под пользователя!
Настрой контент под пользователя!
PyNSK
 
Питон в малине
Питон в малинеПитон в малине
Питон в малине
PyNSK
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
PyNSK
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на Python
PyNSK
 
Во внутренности Kivy
Во внутренности KivyВо внутренности Kivy
Во внутренности Kivy
PyNSK
 
Зоопарк python веб-фреймворков
Зоопарк python веб-фреймворковЗоопарк python веб-фреймворков
Зоопарк python веб-фреймворков
PyNSK
 
Как Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикойКак Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикой
PyNSK
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
PyNSK
 
Ctypes в игровых приложениях на python
Ctypes в игровых приложениях на pythonCtypes в игровых приложениях на python
Ctypes в игровых приложениях на python
PyNSK
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
PyNSK
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
PyNSK
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
PyNSK
 
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST""Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
PyNSK
 
Быстрый старт в gDrive API
Быстрый старт в gDrive APIБыстрый старт в gDrive API
Быстрый старт в gDrive API
PyNSK
 

More from PyNSK (20)

Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
 
Asyncio для процессинга распределенной базы данных
Asyncio для процессинга  распределенной базы данныхAsyncio для процессинга  распределенной базы данных
Asyncio для процессинга распределенной базы данных
 
Python для GameDev
Python для GameDevPython для GameDev
Python для GameDev
 
Python инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестированияPython инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестирования
 
Python, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системыPython, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системы
 
Настрой контент под пользователя!
Настрой контент под пользователя!Настрой контент под пользователя!
Настрой контент под пользователя!
 
Питон в малине
Питон в малинеПитон в малине
Питон в малине
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на Python
 
Во внутренности Kivy
Во внутренности KivyВо внутренности Kivy
Во внутренности Kivy
 
Зоопарк python веб-фреймворков
Зоопарк python веб-фреймворковЗоопарк python веб-фреймворков
Зоопарк python веб-фреймворков
 
Как Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикойКак Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикой
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
 
Ctypes в игровых приложениях на python
Ctypes в игровых приложениях на pythonCtypes в игровых приложениях на python
Ctypes в игровых приложениях на python
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
 
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST""Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
 
Быстрый старт в gDrive API
Быстрый старт в gDrive APIБыстрый старт в gDrive API
Быстрый старт в gDrive API
 

Получаем текст веб-страниц из Python и как это работает

  • 1. Юрий Бабуров (buriy) Webdev, AI, HighLoad Получаем текст веб-страниц из Python и как это работает, или применение эвристик для решения сложных задач (На примере библиотеки readability-lxml)
  • 2. План действий  Формулируем задачу  Из чего состоят новостные веб-страницы?  Придумываем алгоритм сами  Обобщим наш опыт  Пара историй для размышления  Рассматриваем альтернативные идеи
  • 3. Зачем нужны новостные статьи  Сайты-агрегаторы новостей  Сниппеты новостей  Текстовые корпуса для лингвистов  Анализ потока новостной информации  Reading list в Safari Поговорим не только про конкретную задачу, но и про используемые технологии, обобщив наш опыт
  • 4. Формулируем задачу  Задачу можно формулировать и решать по- разному, мы рассмотрим лишь одно из возможных решений.  Сайтов нужно обработать много, статей – ещё больше. − Поэтому алгоритм должен работать быстро − Но, по возможности, качественно − У нас не так много времени на разработку − Но надо иметь возможность настройки для важных сайтов − Мы можем ограничиться HTML-версиями
  • 5. Получаем результат $ sudo pip install readability-lxml $ python -m readability.readability -b -u http://lenta.ru/news/2015/08/26/nishtiak_the_cat/ конечно, то же самое можно сделать и из программы на python, пример будет позднее
  • 6. Как это может работать для самых разных сайтов? Даю 15 секунд на размышления (только молча)
  • 7. Из чего, из чего сделаны новостные статьи... Хорошая новостная статья
  • 8. Из чего, из чего сделаны новостные статьи... Хорошая новостная статья:  Категория  Дата и время  Заголовок  Иллюстрация  Текст
  • 9. Из чего, из чего сделаны новостные статьи... Что нас интересует в первую очередь:  Заголовок  Иллюстрация  Текст
  • 10. Из чего, из чего сделаны новостные статьи... Плохая новостная статья:
  • 11. Из чего, из чего сделаны новостные статьи... Плохая новостная статья:  Социальные иконки  Вставки  Текстовая и графическая реклама
  • 12. Из чего, из чего сделаны новостные статьи... Всё, кроме статьи:
  • 13. Из чего, из чего сделаны новостные статьи... Всё, кроме статьи:  Подзаголовки  Блоки ссылок  Рекламные блоки
  • 14. Тоже части веб-страницы Ссылочные и рекламные блоки Ссылки на другие страницы и общая для всех страниц информация
  • 15. Как искать текст статьи  Чего хотим: − Текст! − Много текста рядом!  Не хотим: − Ссылочных блоков − Блоков с картинками − Подзаголовков − Маленьких картинок Текст: Длинные законченные предложения Заголовки: Короткие предложения без точки в конце Мы нашли набор критериев, как отличить текст от всего остального.
  • 16. Наше кольцо всевластья: основы  Получаем “веса”, оценивая “текстовость” каждого блока на странице, штрафуя за высокий процент текста ссылок и мелкие иллюстрации.  Используем древовидность HTML: узлам- родителям даём бонус за хороших “детей” и “внуков” (50% от веса).  Удаляем нетекстовые блоки (с весом меньше нуля)  Находим блок текста с наибольшим весом – часто это наибольший блок  Надеемся на адекватность авторов веб- странички!  <BODY> − <DIV>  В Новосибирске выбрали кота...  Помимо торжественной прогулки...  Блок с иконками − <DIV>  ПОСЛЕДНИЕ НОВОСТИ  Много ссылок
  • 17. Увы, не всё так просто Некоторые комментарии бывают длиннее и лучше, чем текст статьи Настоящим жадинам нужно несколько страниц для одной новости
  • 18. Как искать заголовок новости Даю 15 секунд на размышления (только молча)
  • 19. Как искать заголовок новости  Поисковая оптимизация – шаг к унификации  <title>  <H1> или <H2>  <H3> и <H4>  Ищем заголовок, похожий на Title
  • 20. Как искать иллюстрации Думаю, вы уже догадались...
  • 21. Как искать иллюстрации Положительные факторы:  Одна или несколько иллюстраций  Большого размера  Располагаются посреди текста или рядом Отрицательные факторы:  Много иллюстраций  Маленького размера  Находятся далеко от текстовых блоков
  • 22. Обобщение – мать учения  Использованный приём называется “эвристика” или “эвристический алгоритм” (heuristic)  В библиотеке readability-lxml используется порядка 50 эвристик.  Эвристика позволяет дать достаточно хорошое решение в большинстве случаев, но ошибается временами  Позволяет хоть как-то решать задачи, с которыми не справиться другими методами  Или сократить скорость работы других
  • 23. Примеры эвристик и других вероятностных методов  Определить формат файла в большинстве случаев можно по первым байтам  “Email – любая строка, содержащая @ и точку после знака @”  “Email – строка, удовлетворяющая этому длинному регулярному выражению”.  Выделение наиболее информативных предложений из текста (text summarization) Примеры: Шагомер, Kinect, поиск лиц на
  • 24. Другие идеи для задачи поиска текста  Использовать информацию из class=”...” и id=”...”, а также название тега для улучшения критерия хороших и плохих тегов в HTML  Использовать CSS-стили, например display:none  Загружать страницу в браузер: − ждать выполнения Javascript − определять и использовать координаты текстовых блоков (текст статьи обычно выше комментариев, посторонние блоки узкие и находятся сбоку)  При поиске заголовка использовать URL (nishtiak_the_cat/).
  • 25. Дополнительные эвристики для readability-lxml  Проблема: получили длинный комментарий вместо короткого текста статьи  Предлагаемая эвристика: Использовать страницу со списком статей или RSS-фид, получить оттуда текст начала статьи или описание, и сравнивать его с текстовыми блоками (аналогия с заголовком)  Ещё одна эвристика. Если есть много статей с одного источника: − Можно классифицировать статьи по качеству: например, полученные одинаковые статьи по
  • 26. Жизненный цикл эвристики  Помните, кому-то придётся поддерживать ваш код, поэтому обязательно комментируйте эвристики.  Выбор способа за вами, скажем #Hack: … , docstring, ссылка на сайт-источник регулярного выражения или ссылка на баг, из-за которого эвристика появилась в вашем коде.
  • 27. Определение похожести двух текстов def calc_quality(feed_text, article_text): """ Returns a number between 0 and 100 """ feed_words = set(feed_text.split()) article_words = set(article_text.split()) if not article_words: return 20 intersection = len(article_words & feed_words) return int(10 * min(10, max(5 + intersection - 0.6 * len(feed_words), 0))) ------------------------------------------------------- from readability.readability import Document import urllib html = urllib.urlopen(url).read() readable_article = Document(html).summary() readable_title = Document(html).short_title()
  • 28. Сортируем тексты по похожести class MyDocument(Document): def select_best_candidate(self, candidates): if not candidates: return None feed_text = html2text(self.article.feed_snippet) if not feed_text: feed_text = self.article.title sorted_candidates = sorted(candidates.values(), reverse=True, key=lambda x: x['content_score']) for candidate in sorted_candidates[:50]: elem_text = html2text(tounicode(candidate['elem'])) quality = calc_quality(feed_text, elem_text) if quality > 50: candidate['content_score'] += 10 elif quality > 0: candidate['content_score'] += 1 sorted_candidates = sorted(candidates.values(), reverse=True, key=lambda x: x['content_score']) return sorted_candidates[0]