реклама
разместить

Пишем простой граббер статей на Python

Новостные сайты являются хорошим источником данных для обработки моделями машинного обучения. При этом, большинство новостных web-ресурсов перегружено различной «лишней» информацией, не относящейся к сути статей, будь то навязчивая реклама, всплывающие окна со служебной информацией и т.д. Очистка статей при выгрузке с web-ресурсов от «шума» помогла бы снизить количество ошибок обработки данных.

В этой статье мы рассмотрим создание инструмента, с помощью которого можно получать читабельный текст из статей с минимальной «лишней» информацией.

Пишем простой граббер статей на Python

Чтобы написать Ваш собственный граббер самостоятельно, Вам потребуются знания в области Web-разработки, такие как понимание языка гипертекстовой разметки HTML (понимание значений тегов, размещение информации внутри них) и основной информации о структуре DOM-дерева при отрисовке сайтов, а также базовые навыки программирования на языке Python.

Итак, начнем.

Для работы нам потребуются библиотеки:

  • request
  • BeautifulSoup

Библиотека requests по факту является стандартом при работе с составлением HTTP-запросов к web-ресурсам. В этой библиотеке собрано множество методов, с помощью которых значительно упрощается процесс создания запросов и разбора ответов от сервера. И это помогает нам сосредоточиться на написании непосредственно нашего алгоритма, а не на поиске способов обеспечить стабильную связь и получение данных с web-ресурсов.

В нашем скрипте будем использовать получение данных при помощи HTTP-метода GET. Метод GET является инструкцией web-ресурсу о том, что с него запрашиваются некоторые данные, указанные как параметр к GET. Чтобы выполнить такой запрос, используя библиотеку requests, достаточно ввести requests.get (< URL >; <дополнительные параметры>). При существовании URL и при наличии прав на доступ к ресурсу, в ответ придут данные HTML-страницы, которые уже можно обработать различными инструментами языка Python. Натболее распространенным инструментом для данной задачи является библиотека BeautifulSoup.

Библиотека BeautifulSoup используется для анализа документов HTML и XML. Она создает дерево синтаксического анализа для полученных страниц (DOM-дерево), которое можно использовать для извлечения данных из HTML в удобные для обработки на языке Python конструкции (словари, списки, строки), что полезно для очистки веб-страниц от ненужной информации.

Алгоритм работы нашей программы будет заключаться в том, что при запуске скрипта Python из командной строки и с указанием URL требуемой нам статьи в качестве параметра, мы будем получать HTML-страницу при помощи метода get библиотеки request. Затем создаем объект BeautifulSoup, который непосредственно и помогает нам очистить статью от лишней информации.

Но для того, чтобы обозначить, что именно считать лишней информацией, а что полезной, нам необходимо проанализировать источник, из которого мы будем брать статьи. Сейчас распространенной практикой является разработка web-ресурсов в блочном формате. Все данные, которые необходимо разместить на страницах разбиваются по логическим блокам и помещаются в теги < div > < /div >

Далее, уже внутри этих блоков информация может принимать различные вариации в зависимости от назначения. В блоках, предназначенных для навигации преобладают ссылочные теги, в блоках, где имеется много изображений, соответственно, много тегов. Нас же интересуют блоки web-страниц, в которых хранятся тексты статей.

Если провести небольшое исследование размещения информации на новостных сайтах, то почти на каждом мы увидим, что блоки с непосредственно самой статьей изобилуют тегами < p > < /p >

Поэтому, первым логичным шагом для создания нашего простого граббера будет взять за основу именно тег < p > < /p >

В дальнейшем, Вы можете самостоятельно проанализировать необходимые источники и уточнить в настройках скрипта, какие теги будут браться для обработки.

Чтобы наш код можно было удобно переиспользовать в других проектах и подключать файл скрипта в другие скрипты Python — первым делом напишем класс, в котором будем хранить все нужные нам методы и объекты.

class GrabberArticle: url = "" filename = "" path = "" content_tags = ['p'] wrap = 80

Описание объектов:

url – URL статьи, которую хотим обработать.

filename – имя файла для сохранения. Соответствует последнему элементу в URL. Например, для host.net/path1/path2 — это path2

path – Путь для сохранения обработанного текста. Соответствует ([Каталог с файлом скрипта]/host.net/path1/path2/…)

content_tags – HTML-теги для обработки. По умолчанию установлен тег

, так как мы приняли его за основной тег, в котором наиболее часто размещён основной полезный контент статьи.

wrap – количество символов в строке очищенного текста. По умолчанию установлено значение в 80 символов — негласное правило читаемости текста на экране.

Давайте теперь напишем главный метод для нашего класса GrabberArticle, который будет получать ответ от web-ресурса и при помощи BeautifulSoup отфильтровывать только нужные нам данные:

def get_text(self): r = requests.get(self.url).text soup = BeautifulSoup(r, 'html.parser') # найдем все теги по списку self.content_tags content = soup.find_all(self.content_tags) wrapped_text = "" for p in content: # пропускаем теги без значений if p.text != '': # форматирование ссылок в вид [ссылка] links = p.find_all('a') if links != '': for link in links: p.a.replace_with(link.text + str("[" + link['href'] + "]")) # устанавливаем ширину строки равной self.wrap (по умолчанию, 80 символов) wrapped_text += ''.join(textwrap.fill(p.text, self.wrap)) + "\n\n" self.write_in_file(wrapped_text)

В качестве результата будем выводить текстовый файл, который будет называться по имени последнего элемента URL- адреса. Также создадим иерархию для размещения этого файла в файловой системе, исходя из оставшихся элементов URL-адреса. Например, для URL: https://lenta.ru/news/2020/04/09/centenarian: файл будет сохранен под именем centenarian.txt в каталоге [Директория со скриптом]/lenta.ru/news/2020/04/09/. Такая иерархия на первый взгляд может выглядеть избыточной. Но такой подход может быть полезен, если с одного и того же источника (и тем более нескольких) будет выгружаться большое количество статей. В такой структуре данные будет легко сгруппировать по определенным признакам. Это позволит гораздо проще обращаться к массиву данных из статей, если, например, они будут использованы для проведения тематических исследований с помощью моделей машинного обучения.

def __init__(self, url_address): self.url = url_address # Get path and filename for saving article by splitting URL. # If the URL ends with some.html, then the previous (-2) element # of the path is taken to form the path and the filename = some.html.txt respectively. path_arr = self.url.split('/') if path_arr[-1] != '': self.filename = path_arr[-1] + ".txt" self.path = os.getcwd() + "/".join(path_arr[1:-1]) else: self.filename = path_arr[-2] + ".txt" self.path = os.getcwd() + "/".join(path_arr[1:-2]) if not os.path.exists(self.path): os.makedirs(self.path)

Допишем метод, который будет записывать в файл полученный «чистый» текст:

def write_in_file(self, text): # записывает text в каталог self.path:"[CUR_DIR]/host.ru/path_item1/path_item2/..." file = open(str(self.path) + '/' + str(self.filename), mode="a") file.write(text) file.close()

Готово! Теперь наш скрипт можно запускать из командной строки, просто передавая ему URL статьи:

Пишем простой граббер статей на Python

Наш скрипт формирует текстовый файл с иерархией, соответствующей URL. Текст в таком формате полностью готов для дальнейшей обработки для задач NLP в машинном обучении. Ну а сама статья стала намного читабельнее без перегрузки лишней информацией.

В дальнейшем данный скрипт можно усовершенствовать так, чтобы он в качестве входных данных использовал файл со списком URL и выгружал уже готовый массив данных целиком. А для написания более детального скрипта выгрузки для Ваших источников необходимо просто дописать нужные теги в объект GrabberArticle.content_tags, либо передавать их через отдельный файл настроек.

Примечание:

Несмотря на то, что грабберы являются очень полезным инструментом по созданию выборок для проведения исследований, машинная выгрузка данных с web-ресурсов приводит к значительному повышению сетевой нагрузки на сайты и доставляет проблемы владельцам ресурсов. Некоторые даже блокируют ip-адреса, с которых замечена подобная активность. Поэтому призываю пользоваться грабберами в пределах разумного и не перегружать удаленные web-ресурсы, чтобы не вызывать негативных последствий на них.

Полный код из статьи размещен по адресу: https://github.com/ZveRuss/GrabberArticle

44
реклама
разместить
5 комментариев

У многих новостных сайтов и у блогов бывает RSS-лента. RSS - структурированный, там и html-мусора не будет, и специализированные библиотеки под любой язык программирования есть, и многие программы для чтения новостей или книг умеют RSS поддерживать. Список доступных RSS-каналов lenta.ru есть здесь: https://lenta.ru/info/posts/export/
 

1

Использую xpath для парсинга на python и php, все лучше чем BeautifulSoup)

вы наверное имели ввиду lxml или какую-то еще библиотеку для работы с xml/html? xpath это ж язык запросов к элементам XML.

мне кажется сейчас уже больше половины трафика в интернете - это роботы

Рейд с тракторами и бульдозерами: что известно о «зачистке» на Апраксином дворе в Санкт-Петербурге

Что случилось и что говорят об этом предприниматели.

Источник: «Фонтанка»
99
55
22
реклама
разместить
День 1124: Госдума рассмотрит законопроект о запрете рекламы на запрещённых сайтах

Собираем новости, события и мнения о рынках, банках и реакциях компаний.

Источник: «Коммерсантъ»
88
44
11
11
Запретдума рассмотрит запретопроект о запрете рекламы на запрещённых сайтах
Промокоды Яндекс Маркет на первый и повторный заказы на Март 2025! ТОП 28+49 акций, купонов на скидку до 53.6% и от market.yandex.ru!

Хотите делать покупки на Яндекс.Маркете с ещё более внушительными скидками, доходящими до 53.5%? В этой расширенной инструкции вы найдёте советы и лайфхаки по тому, как грамотно применять промокоды Яндекс Маркет, чтобы значительно сократить расходы практически во всех товарных категориях. Ниже вы увидите подробный разбор каждой важной темы и абзаца…

Как мой сломанный копирайтинг принес клиенту 300% ROI за месяц, когда стандартные тексты не работали

Ненавижу копирайтинг. Тот самый "правильный" копирайтинг, которому учат на курсах за 50 тысяч. С его формулами AIDA, болевыми точками и призывами к действию.

Как мой сломанный копирайтинг принес клиенту 300% ROI за месяц, когда стандартные тексты не работали
4141
11
Немного попорчу ваше жонглирование цифрами. На примере средней продолжительности жизни в древней греции к примеру и современной же греции. Мог бы и на примере россии, но информации о средней продолжительности жизни россиян 2000 лет назад как-то маловато. Тогда средняя продолжительность жизни была около 30 лет. Сейчас перевалила за 70. Значит ли это что основная масса населения помирала в 30 лет? Совсем нет. Люди в нашем понимании этого термина в основном помирали как и сейчас в возрасте за 60. Тогда откуда взялось 30? Из-за того, что была высока смертность в младенчестве. Ну то есть люди до года или чуть старше имели куда больше шансов умереть. Так и в вашем тексте. 8 секунд в среднем, это к примеру 19 человек, которые провели одну секунду на вашем сайте просто потому, что открыли сразу несколько вкладок, ваша была не третья, а они нашли что хотели уже на второй. И один человек который потратил на чтение 2.5 минуты. И это не значит, что если бы у вас был другой текст, то количество читающих резко бы выросло. На это в нашей истории больше влияет каким по счету будет ваш сайт для вашего будущего клиента и не перехватит ли его ваш конкурент, который полностью закроет его потребности, оказавшись всего лишь строчкой выше. Тексты становятся важными для удержания, когда человек, который уже пьет ваше пиво, вдруг решает познакомиться с вами поближе. Он читает прекрасную, часто выдуманную и шаблонную историю о том, как я работал в офисе и решил сбросить кабалу и что мне надо больше пива, куда больше, и если вкус напитка ему нравится, то почему бы и не дочитать этот шаблон до конца? Делать-то все равно нечего. Что же до увеличения конверсии, то изменение текстов на сайте часто приводит после индексации к повышению в позиции. Потому что тот же яндекс, стремится выдать максимально свежую из примерно одинаковой информации. Я очень надеялся прочитать нестандартный текст о том как писать нестандартные тексты, но прочитал шаблонный текст о том как, как ваш гений помог зацвести бизнесу. Готов поспорить, что в конце статьи есть ваши контакты, потому, что при таком тексте надежды на то, что читатель полезет к вам в профиль у вас нет. И это правильно.
ДКП и рубль остаются жёсткими, инвесторы идут в недвижку, которая растёт, а акции, крипта и облигации на чиле. Воскресный инвестдайджест

ЦБ оставил ключевую ставку 21%, сигнал дал умеренно жёсткий, так что и вся неделя получилась жёсткой. Рубль тоже жёсткий, никак не обмякнет. В акциях, облигациях и крипте всё спокойно, а вот недвижка продолжает пробивать обратное дно. Новые максимумы рисует, ещё и льготные ипотеки расширяют. Из позитивного можно выделить новые дивиденды, ну и наш с…

ДКП и рубль остаются жёсткими, инвесторы идут в недвижку, которая растёт, а акции, крипта и облигации на чиле. Воскресный инвестдайджест
1212
11
11
Корпоративное ЕГЭ или как обучение сотрудников НЕ влияет на рост и эффективность
Корпоративное ЕГЭ или как обучение сотрудников НЕ влияет на рост и эффективность

Короче, в какой-то момент каждому из наc кажется что Солнце как-то не так заходит за горизонт и нужно «заменеджерить» закат вручную. На уроне государства это называется - реформа, а в корпорации - управляемые изменения.

33
22
11
[Давай общаться] - Тони Старк и Инсен в фильме "Железный человек"

Введение

Как попасть в «Колдунщик» Яндекса и обойти конурентов: немагическая инструкция

Колдунщик — это главный блок поисковой выдачи и мощный источник целевых клиентов для тех, кто продвигает компанию на Яндекс Картах. Как оказаться в Колдунщике и занять место на первых позициях — рассказал в статье.

Как попасть в «Колдунщик» Яндекса и обойти конурентов: немагическая инструкция
1010
77
11
Автоматический заработок на Youtube - создаем пассивный доход

На этой неделе благодаря замечательному человеку Александру Шевцову я выступал с докладом "Автоматическое создание видеороликов в Youtube".

55
реклама
разместить
Жители домов от застройщика ПИК остались без интернета из-за DDoS-атаки на единственного провайдера

Кроме того, не работает связь, а жильцы не могут открыть двери подъездов и попасть к себе домой.

100
5353
88
66
22
11
Цифровое рабство 21 века. Куда смотрит фас. Это позор конечно. Карманные УК гоняют других провайдеров. )
VC — это не платформа. Это дом.

Всем читателям моего скромного блога воскресный привет. Хочу рассказать, почему для меня VC — не просто «ещё одна соцсеть» или площадка для статей. Нет. Это что-то большее.

VC — это не платформа. Это дом.
100
44
Точка красоты на Ленинском просп., д. 109 изуродовали меня и других

Посетила салон «Точка красоты» на Ленинском просп., д 109 (ТРЦ «РИО», 3 этаж) и получила обрубки на голове, хамство администраторов и игнорирование закона РФ от владельцев данного заведения. В статье расскажу, как я пыталась вернуть деньги за некачественную услугу и чем это закончилось.

Что же могло пойти не так?
77
33
11
[]