{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы программирования в Python\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Семинар 9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем библиотеку `requests`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сохраним ссылку на главную страницу сайта и загрузим ее. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "url = 'https://nplus1.ru/' # сохраняем\n", "page = requests.get(url) # загружаем страницу по ссылке" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем функцию `BeautifulSoup` из библиотеки `bs4` (от *beautifulsoup4*) и заберем со страницы `page` код html в виде текста. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from bs4 import BeautifulSoup" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "soup = BeautifulSoup(page.text, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы сгрузить все новости с главной страницы сайта, нужно собрать все ссылки на страницы с этими новостями. Ссылки в html-файле всегда заключены в тэг `` и имеют атрибут `href`. Посмотрим на кусочки кода, соответствующие всем ссылкам на главной странице сайта:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for link in soup.find_all('a'):\n", " print(link.get('href'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ссылок много. Но нам нужны только новости ‒ ссылки, которые начинаются со слова `/news`. Добавим условие: будем выбирать только те ссылки, в которых есть `/news`. Создадим пустой список `urls` и будем добавлять в него только ссылки, которые удовлетворяют этому условию." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/news/2018/06/04/wwdc',\n", " '/news/2018/06/04/proterozoic-milanlovitch-cycles',\n", " '/news/2018/06/04/sleeping-toddler',\n", " '/news/2018/06/04/lhc',\n", " '/news/2018/06/04/hayabusa-2-complete-ion-cruise',\n", " '/news/2018/06/04/eclipsing-quadriple',\n", " '/news/2018/06/04/asus-rog',\n", " '/news/2018/06/04/small-asteroid-impact',\n", " '/news/2018/06/04/scaffolds',\n", " '/news/2018/06/04/ms-github',\n", " '/news/2018/06/04/spiritual-experince-mri',\n", " '/news/2018/06/04/voxel-printing',\n", " '/news/2018/06/04/Space-Acinetobacter',\n", " '/news/2018/06/04/stem-cells-therapy',\n", " '/news/2018/06/04/artificial-iris',\n", " '/news/2018/06/04/reusable-angara',\n", " '/news/2018/06/04/spacex-delay',\n", " '/news/2018/06/04/lipolysis-weight-gain',\n", " '/news/2018/06/04/triclosan',\n", " '/news/2018/05/29/bloch-oscillations',\n", " '/news/2018/05/28/anti-cytokine-release-syndrome',\n", " '/news/2018/05/29/smart-density',\n", " '/news/2018/05/28/flying-doughnat',\n", " '/news/2018/05/28/rods-gas',\n", " '/news/2018/06/04/lhc',\n", " '/news/2018/05/30/chem',\n", " '/news/2018/06/04/lipolysis-weight-gain',\n", " '/news/2018/05/31/benard-cells',\n", " '/news/2018/05/30/topological-origami-metamaterials']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "urls = []\n", "\n", "for link in soup.find_all('a'):\n", " if '/news' in link.get('href'):\n", " urls.append(link.get('href'))\n", "urls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ссылки, которые у нас есть в списке `urls`, относительные: они неполные, начало ссылки (название сайта) отсутствует. Давайте превратим их в абсолютные ‒ склеим с ссылкой https://nplus1.ru." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['https://nplus1.ru/news/2018/06/04/wwdc',\n", " 'https://nplus1.ru/news/2018/06/04/proterozoic-milanlovitch-cycles',\n", " 'https://nplus1.ru/news/2018/06/04/sleeping-toddler',\n", " 'https://nplus1.ru/news/2018/06/04/lhc',\n", " 'https://nplus1.ru/news/2018/06/04/hayabusa-2-complete-ion-cruise',\n", " 'https://nplus1.ru/news/2018/06/04/eclipsing-quadriple',\n", " 'https://nplus1.ru/news/2018/06/04/asus-rog',\n", " 'https://nplus1.ru/news/2018/06/04/small-asteroid-impact',\n", " 'https://nplus1.ru/news/2018/06/04/scaffolds',\n", " 'https://nplus1.ru/news/2018/06/04/ms-github',\n", " 'https://nplus1.ru/news/2018/06/04/spiritual-experince-mri',\n", " 'https://nplus1.ru/news/2018/06/04/voxel-printing',\n", " 'https://nplus1.ru/news/2018/06/04/Space-Acinetobacter',\n", " 'https://nplus1.ru/news/2018/06/04/stem-cells-therapy',\n", " 'https://nplus1.ru/news/2018/06/04/artificial-iris',\n", " 'https://nplus1.ru/news/2018/06/04/reusable-angara',\n", " 'https://nplus1.ru/news/2018/06/04/spacex-delay',\n", " 'https://nplus1.ru/news/2018/06/04/lipolysis-weight-gain',\n", " 'https://nplus1.ru/news/2018/06/04/triclosan',\n", " 'https://nplus1.ru/news/2018/05/29/bloch-oscillations',\n", " 'https://nplus1.ru/news/2018/05/28/anti-cytokine-release-syndrome',\n", " 'https://nplus1.ru/news/2018/05/29/smart-density',\n", " 'https://nplus1.ru/news/2018/05/28/flying-doughnat',\n", " 'https://nplus1.ru/news/2018/05/28/rods-gas',\n", " 'https://nplus1.ru/news/2018/06/04/lhc',\n", " 'https://nplus1.ru/news/2018/05/30/chem',\n", " 'https://nplus1.ru/news/2018/06/04/lipolysis-weight-gain',\n", " 'https://nplus1.ru/news/2018/05/31/benard-cells',\n", " 'https://nplus1.ru/news/2018/05/30/topological-origami-metamaterials']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_urls = []\n", "\n", "for u in urls:\n", " res = 'https://nplus1.ru' + u # если вылезет лишний слэш перед news - уберем его - u[1:] вместо u\n", " full_urls.append(res) \n", "\n", "full_urls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь наша задача сводится к следующему: изучить одну страницу с новостью, научиться из нее вытаскивать текст и всю необходимую информацию, а потом применить весь набор действий к каждой ссылке из `full_urls` в цикле. Посмотрим на новость про бактерии (Space-Acinetobacter), у меня она здесь десятая, с индексом 9, у вас может быть другая, новости обновляются." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "url0 = full_urls[9]\n", "\n", "page0 = requests.get(url0)\n", "soup0 = BeautifulSoup(page0.text, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В коде каждой страницы с новостью есть часть с мета-информацией: датой, именем автора и проч. Такая информация окружена тэгом ``. Посмотрим:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Из этого списка нам нужны части с именем автора, датой, заголовком и кратким описанием. Воспользуемся поиском по атрибуту `name`. Вспомним прошлую лекцию и передадим функции `find_all()` в качестве аргумента словарь с названием и значением атрибута: " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'}) # например, автор" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь выберем единственный элемент полученного списка (с индексом 0):" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'})[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нам нужно вытащить из этого объекта `content` ‒ имя автора. Посмотрим на атрибуты:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'content': 'Елизавета Ивтушок', 'name': 'author'}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'})[0].attrs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как получить отсюда `content`? Очень просто, ведь это словарь! А доставать из словаря значение по ключу мы умеем." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Елизавета Ивтушок'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "author = soup0.find_all('meta', {'name' : 'author'})[0].attrs['content']\n", "author" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Аналогичным образом извлечем дату, заголовок и описание." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "date = soup0.find_all('meta', {'itemprop' : 'datePublished'})[0].attrs['content']\n", "title = soup0.find_all('meta', {'property' : 'og:title'})[0].attrs['content']\n", "description = soup0.find_all('meta', {'name' : 'description'})[0].attrs['content']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось вытащить рубрики и сложность текста. Если мы посмотрим на [исходный код страницы](view-source:https://nplus1.ru/news/2018/06/04/Space-Acinetobacter), мы увидим, что нужная нам информация находится в тэгах `

`:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[

\n", " IT\n", "

,

\n", " \n", " \n", " \n", "

,

\n", " \n", " Сложность\n", " 1.6\n", " \n", "

,

Компания Microsoft купила веб-сервис для разработчиков GitHub. Сумма сделки составила 7,5 миллиарда долларов США. Об этом сообщается в пресс-релизе Microsoft.

,

GitHub — открытый веб-сервис для хостинга и совместной разработки IT-проектов, которым пользуется примерно 27 миллионов разработчиков по всему миру, в том числе и крупные компании. Часть репозиториев Google, например, находится в открытом доступе: компания часто выкладывает в открытый доступ свои новые проекты.

,

Впервые о начале переговоров о покупке со ссылкой на собственные источники в пятницу сообщило агенство Business Insider; подробности, также со ссылкой на собственные источники, далее представили в Bloomberg: в частности, издание сообщило о том, что Microsoft ведет переговоры о покупке компании уже несколько лет, а одной из причин успешной сделки стал генеральный директор Microsoft Сатья Наделла (Satya Nadella): совет директоров GitHub впечатлен его решениями в области стратегического развития компании.

,

В 2015 году стоимость GitHub оценивали в 2 миллиарда долларов. Несмотря на крупные потери (более 60 миллионов долларов) в 2016 году, а также то, что с августа 2017 года компания находится в поисках нового генерального директора, на момент появления информации о возможной сделке стоимость GitHub оценивали в 5 миллиардов долларов. Как сообщается в пресс-релизе, стоимость сделки составит 7,5 миллиарда долларов 

,

В марте этого года сервера GitHub подверглись крупнейшей в истории DDoS-атаке в истории интернета: на пике трафик достигал 1,35 терабит в секунду. 

,

Елизавета Ивтушок

,

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.

,

Оставьте ваш e-mail, чтобы получать
наш научный дайджест

,

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

,

Как выглядят стадионы Чемпионата мира — 2018 с высоты полета спутника

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

© 2018 N+1 Интернет-издание   Свидетельство о регистрации СМИ Эл № ФС77-67614

,

Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. \n", " Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются \n", " только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения \n", " и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru

,

Сайт может содержать контент, не предназначенный для лиц младше 18 лет.

,

\n", " Политика обработки персональных данных пользователей сайта\n", "

,

\n", " \n", " Change privacy settings\n", "

,

\n", "

]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('p')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выберем из полученного списка первый элемент и найдем в нем все тэги ``:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[IT]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('p')[0].find_all('a')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Получился список из двух элементов. Применим списковые включения ‒ вытащим из каждого элемента текст и поместим его в новый список `rubrics`." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['IT']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rubrics = [r.text for r in soup0.find_all('p')[0].find_all('a')]\n", "rubrics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталась только сложность. Возьмем соответствующий кусок кода:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1.6]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('span', {'class' : 'difficult-value'})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И выберем оттуда текст." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.6'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff = soup0.find_all('span', {'class' : 'difficult-value'})[0].text\n", "diff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь перейдем к тексту самой новости. Как можно заметить, текст сохранен в абзацах `

`, причем безо всяких атрибутов. Сообщим Python, что нас интересуют куски с пустым атрибутом `class`:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "text_list = soup0.find_all('p', {'class' : None})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Выцепим\" все тексты (без тэгов) из полученного списка:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "text = [t.text for t in text_list]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Склеим все элементы списка `text` через пробел:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Компания Microsoft купила веб-сервис для разработчиков GitHub. Сумма сделки составила 7,5 миллиарда долларов США. Об этом сообщается в пресс-релизе Microsoft. GitHub — открытый веб-сервис для хостинга и совместной разработки IT-проектов, которым пользуется примерно 27 миллионов разработчиков по всему миру, в том числе и крупные компании. Часть репозиториев Google, например,\\xa0находится в открытом доступе: компания часто выкладывает в открытый доступ свои новые проекты. Впервые о начале переговоров о покупке со ссылкой на собственные источники в пятницу сообщило агенство Business Insider; подробности, также со ссылкой на собственные источники, далее представили в Bloomberg: в частности, издание сообщило о том, что Microsoft ведет переговоры о покупке компании уже несколько лет, а одной из причин успешной сделки стал генеральный директор Microsoft Сатья Наделла (Satya Nadella): совет директоров GitHub впечатлен его решениями в области стратегического развития компании. В 2015 году стоимость GitHub оценивали в 2 миллиарда долларов. Несмотря на крупные потери (более 60 миллионов долларов) в 2016 году, а также то, что с августа 2017 года компания находится в поисках нового генерального директора, на момент появления информации о возможной сделке стоимость GitHub оценивали в 5 миллиардов долларов. Как сообщается в пресс-релизе, стоимость сделки составит 7,5 миллиарда долларов\\xa0 В марте этого года сервера GitHub подверглись крупнейшей в истории DDoS-атаке в истории интернета: на пике трафик достигал 1,35 терабит в секунду.\\xa0 Елизавета Ивтушок Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Оставьте ваш e-mail, чтобы получатьнаш научный дайджест Предоставляя адрес электронной почты, вы принимаете условия соглашения о персональных данных. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2018 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. \\n Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются \\n только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения \\n и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Сайт может содержать контент, не предназначенный для лиц младше 18 лет. \\nПолитика обработки персональных данных пользователей сайта\\n \\n\\nChange privacy settings\\n \\n'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_text = ' '.join(text)\n", "final_text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Все здорово, только мешают отступы-переходы на новую строку `\\n`. Заменим их на пробелы с помощью метода `.replace`:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "final_text = final_text.replace('\\n', ' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Не прошло и двух пар, как мы разобрались со всем :) Теперь осталось совсем чуть-чуть. Написать готовую функцию для всех проделанных нами действий и применить ее в цикле для всех ссылок в списке `full_urls`. Напишем! Аргументом функции будет ссылка на новость, а возвращать она будет текст новости и всю необходимую информацию (дата, автор, сложность и проч.). Скопируем все строки кода выше." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def GetNews(url0):\n", " \"\"\"\n", " Returns a tuple with url0, date, author, description, title, final_text, rubrics, diff.\n", " Parameters:\n", " \n", " url0 is a link to the news (string)\n", " \"\"\"\n", " page0 = requests.get(url0)\n", " soup0 = BeautifulSoup(page0.text, 'lxml')\n", " author = soup0.find_all('meta', {'name' : 'author'})[0].attrs['content']\n", " date = soup0.find_all('meta', {'itemprop' : 'datePublished'})[0].attrs['content']\n", " title = soup0.find_all('meta', {'property' : 'og:title'})[0].attrs['content']\n", " description = soup0.find_all('meta', {'name' : 'description'})[0].attrs['content']\n", " rubrics = [r.text for r in soup0.find_all('p')[0].find_all('a')]\n", " diff = soup0.find_all('span', {'class' : 'difficult-value'})[0].text\n", " text_list = soup0.find_all('p', {'class' : None})\n", " text = [t.text for t in text_list]\n", " final_text = ' '.join(text)\n", " final_text = final_text.replace('\\n', ' ')\n", " \n", " return url0, date, author, description, title, final_text, rubrics, diff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Уфф. Осталось применить ее в цикле. Но давайте не будем спешить: импортируем функцию `sleep` для задержки, чтобы на каждой итерации цикла, прежде чем перейти к следующей новости, Python ждал несколько секунд. Во-первых, это нужно, чтобы сайт \"не понял\", чтобы мы его грабим, да еще автоматически. Во-вторых, с небольшой задержкой всегда есть гарантия, что страница прогрузится (сейчас это пока не очень важно, но особенно актуально будет, когда будем обсуждать встраивание в браузер с Selenium). Приступим." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "from time import sleep" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "news = [] # это будет список из кортежей, в которых будут храниться данные по каждой новости\n", "\n", "for link in full_urls:\n", " res = GetNews(link)\n", " news.append(res)\n", " sleep(3) # задержка в 3 секунды" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Так теперь выглядит первый элемент списка:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('https://nplus1.ru/news/2018/06/04/wwdc',\n", " '2018-06-04',\n", " 'Григорий Копиев',\n", " 'Apple представила новые версии iOS и macOS',\n", " 'Apple представила новые версии iOS и macOS',\n", " 'Компания Apple представила на\\xa0конференции WWDC 2018 новые версии операционных систем своих устройств\\xa0— iOS, macOS, watchOS и\\xa0tvOS. Трансляция первого дня конференции велась на\\xa0сайте компании. Компания представила операционную систему iOS 12. В\\xa0ней разработчики значительно улучшили быстродействие\\xa0— по\\xa0их\\xa0заявлениям, на\\xa0запуск приложений будет уходить до\\xa040\\xa0процентов меньше времени. Голосовой помощник Siri получил поддержку действий из\\xa0приложений, причем он\\xa0сможет отслеживать популярные действия в\\xa0приложениях и\\xa0предлагать их\\xa0пользователю в\\xa0нужный момент. Кроме того, пользователи смогут самостоятельно создавать наборы действий. К\\xa0примеру, после рабочего дня человек может сказать Siri, что он\\xa0направляется домой, а\\xa0ассистент самостоятельно включит музыку для дороги, повысит температуру термостата в\\xa0доме и\\xa0отправит сообщение супругу. Компания создала отдельное приложение, в\\xa0котором пользователи смогут собирать простые наборы действий из\\xa0стандартных блоков. iOS 12\\xa0будет отслеживать использование устройства пользователем и\\xa0показывать ему статистику для конкретных приложений и\\xa0системы в\\xa0целом. Пользователь сможет устанавливать ограничения на\\xa0время использования приложений для себя, а\\xa0также для устройств своих детей. Кроме того, система научилась группировать уведомления от\\xa0одного приложения и\\xa0получила новую версию фреймворка дополненной реальности ARKit с\\xa0поддержкой одновременного использования дополненной реальности. Помимо мобильной операционной системы Apple представила обновленную систему для компьютеров\\xa0— macOS 10.14\\xa0Mojave. Часть изменений коснулись оформления системы. В\\xa0ней появилась темная тема оформления приложений, а\\xa0также динамические обои рабочего стола, в\\xa0которых освещение объектов меняется в\\xa0течение дня. Несколько новых функций получил файловый менеджер Finder. Например, теперь файлы на\\xa0рабочем столе можно будет автоматически группировать по\\xa0их\\xa0типам. Также Finder получил поддержку пользовательских скриптов, создаваемых через программу Automator. Одно из\\xa0самых важных изменений вряд\\xa0ли будет заметно обычному пользователю. Apple портировала в\\xa0macOS фреймворк графического интерфейса UIKit, используемый при создании приложений для iOS. Это значительно упростит разработчикам портирование iOS-приложений на\\xa0macOS. Сторонним разработчикам эта возможность пока недоступна, но\\xa0с\\xa0ее\\xa0помощью Apple сама перенесла некоторые приложения из\\xa0iOS\\xa0— Apple News, «Диктофон», «Акции» и\\xa0приложение «Дом» для управления умным домом. Как и\\xa0в\\xa0случае с\\xa0iOS, публичная бета-версия системы станет доступна в\\xa0июне, а\\xa0финальная версия выйдет осенью Недавно компания Google провела ежегодную конференцию I/O и\\xa0представила на\\xa0свои последние разработки. Например, компания рассказала о\\xa0новой версии операционной системы Android с\\xa0обновленным интерфейсом, а\\xa0также функциями для учета времени, проведенного за\\xa0устройством. Кроме того, Google представила обновления голосового помощника Google Assistant, который скоро заработает в\\xa0России, а\\xa0в\\xa0будущем сможет самостоятельно записывать пользователя в\\xa0парикмахерскую или другое заведение. Григорий Копиев Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Оставьте ваш e-mail, чтобы получатьнаш научный дайджест Предоставляя адрес электронной почты, вы принимаете условия соглашения о персональных данных. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2018 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Сайт может содержать контент, не предназначенный для лиц младше 18 лет. Политика обработки персональных данных пользователей сайта Change privacy settings ',\n", " ['IT', 'Гаджеты'],\n", " '3.2')" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "news[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем `pandas` и создадим датафрейм из списка кортежей: " ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(news)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567
0https://nplus1.ru/news/2018/06/04/wwdc2018-06-04Григорий КопиевApple представила новые версии iOS и macOSApple представила новые версии iOS и macOSКомпания Apple представила на конференции WWDC...[IT, Гаджеты]3.2
1https://nplus1.ru/news/2018/06/04/proterozoic-...2018-06-04Александр ДубовГеологи уточнили длительность суток полтора ми...Геологи уточнили длительность суток полтора ми...Американские геологи обнаружили, что что в про...[Геология, Астрономия]3.6
\n", "
" ], "text/plain": [ " 0 1 \\\n", "0 https://nplus1.ru/news/2018/06/04/wwdc 2018-06-04 \n", "1 https://nplus1.ru/news/2018/06/04/proterozoic-... 2018-06-04 \n", "\n", " 2 3 \\\n", "0 Григорий Копиев Apple представила новые версии iOS и macOS \n", "1 Александр Дубов Геологи уточнили длительность суток полтора ми... \n", "\n", " 4 \\\n", "0 Apple представила новые версии iOS и macOS \n", "1 Геологи уточнили длительность суток полтора ми... \n", "\n", " 5 6 \\\n", "0 Компания Apple представила на конференции WWDC... [IT, Гаджеты] \n", "1 Американские геологи обнаружили, что что в про... [Геология, Астрономия] \n", "\n", " 7 \n", "0 3.2 \n", "1 3.6 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Переименуем столбцы в базе." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df.columns = ['link', 'date', 'author', 'desc', 'title', 'text', 'rubric', 'diffc']" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
linkdateauthordesctitletextrubricdiffc
0https://nplus1.ru/news/2018/06/04/wwdc2018-06-04Григорий КопиевApple представила новые версии iOS и macOSApple представила новые версии iOS и macOSКомпания Apple представила на конференции WWDC...[IT, Гаджеты]3.2
1https://nplus1.ru/news/2018/06/04/proterozoic-...2018-06-04Александр ДубовГеологи уточнили длительность суток полтора ми...Геологи уточнили длительность суток полтора ми...Американские геологи обнаружили, что что в про...[Геология, Астрономия]3.6
\n", "
" ], "text/plain": [ " link date \\\n", "0 https://nplus1.ru/news/2018/06/04/wwdc 2018-06-04 \n", "1 https://nplus1.ru/news/2018/06/04/proterozoic-... 2018-06-04 \n", "\n", " author desc \\\n", "0 Григорий Копиев Apple представила новые версии iOS и macOS \n", "1 Александр Дубов Геологи уточнили длительность суток полтора ми... \n", "\n", " title \\\n", "0 Apple представила новые версии iOS и macOS \n", "1 Геологи уточнили длительность суток полтора ми... \n", "\n", " text rubric \\\n", "0 Компания Apple представила на конференции WWDC... [IT, Гаджеты] \n", "1 Американские геологи обнаружили, что что в про... [Геология, Астрономия] \n", "\n", " diffc \n", "0 3.2 \n", "1 3.6 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь внесем изменения: сделаем столбец `diffc` числовым ‒ типа *float*." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "df['diffc'] = [float(i) for i in df.diffc]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь сложность представлена в базе как количественный показатель, и описывать ее можно соответствующим образом:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 29.000000\n", "mean 4.293103\n", "std 1.688391\n", "min 1.100000\n", "25% 3.300000\n", "50% 4.200000\n", "75% 5.700000\n", "max 7.200000\n", "Name: diffc, dtype: float64" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.diffc.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объединим рубрики в *text* в одну строку через запятую:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "df['rubric'] = [','.join(r) for r in df.rubric]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте почистим текст новостей ‒ уберем оттуда текст, не относящийся к новостям. Найдем лишнее:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Компания Apple представила на\\xa0конференции WWDC 2018 новые версии операционных систем своих устройств\\xa0— iOS, macOS, watchOS и\\xa0tvOS. Трансляция первого дня конференции велась на\\xa0сайте компании. Компания представила операционную систему iOS 12. В\\xa0ней разработчики значительно улучшили быстродействие\\xa0— по\\xa0их\\xa0заявлениям, на\\xa0запуск приложений будет уходить до\\xa040\\xa0процентов меньше времени. Голосовой помощник Siri получил поддержку действий из\\xa0приложений, причем он\\xa0сможет отслеживать популярные действия в\\xa0приложениях и\\xa0предлагать их\\xa0пользователю в\\xa0нужный момент. Кроме того, пользователи смогут самостоятельно создавать наборы действий. К\\xa0примеру, после рабочего дня человек может сказать Siri, что он\\xa0направляется домой, а\\xa0ассистент самостоятельно включит музыку для дороги, повысит температуру термостата в\\xa0доме и\\xa0отправит сообщение супругу. Компания создала отдельное приложение, в\\xa0котором пользователи смогут собирать простые наборы действий из\\xa0стандартных блоков. iOS 12\\xa0будет отслеживать использование устройства пользователем и\\xa0показывать ему статистику для конкретных приложений и\\xa0системы в\\xa0целом. Пользователь сможет устанавливать ограничения на\\xa0время использования приложений для себя, а\\xa0также для устройств своих детей. Кроме того, система научилась группировать уведомления от\\xa0одного приложения и\\xa0получила новую версию фреймворка дополненной реальности ARKit с\\xa0поддержкой одновременного использования дополненной реальности. Помимо мобильной операционной системы Apple представила обновленную систему для компьютеров\\xa0— macOS 10.14\\xa0Mojave. Часть изменений коснулись оформления системы. В\\xa0ней появилась темная тема оформления приложений, а\\xa0также динамические обои рабочего стола, в\\xa0которых освещение объектов меняется в\\xa0течение дня. Несколько новых функций получил файловый менеджер Finder. Например, теперь файлы на\\xa0рабочем столе можно будет автоматически группировать по\\xa0их\\xa0типам. Также Finder получил поддержку пользовательских скриптов, создаваемых через программу Automator. Одно из\\xa0самых важных изменений вряд\\xa0ли будет заметно обычному пользователю. Apple портировала в\\xa0macOS фреймворк графического интерфейса UIKit, используемый при создании приложений для iOS. Это значительно упростит разработчикам портирование iOS-приложений на\\xa0macOS. Сторонним разработчикам эта возможность пока недоступна, но\\xa0с\\xa0ее\\xa0помощью Apple сама перенесла некоторые приложения из\\xa0iOS\\xa0— Apple News, «Диктофон», «Акции» и\\xa0приложение «Дом» для управления умным домом. Как и\\xa0в\\xa0случае с\\xa0iOS, публичная бета-версия системы станет доступна в\\xa0июне, а\\xa0финальная версия выйдет осенью Недавно компания Google провела ежегодную конференцию I/O и\\xa0представила на\\xa0свои последние разработки. Например, компания рассказала о\\xa0новой версии операционной системы Android с\\xa0обновленным интерфейсом, а\\xa0также функциями для учета времени, проведенного за\\xa0устройством. Кроме того, Google представила обновления голосового помощника Google Assistant, который скоро заработает в\\xa0России, а\\xa0в\\xa0будущем сможет самостоятельно записывать пользователя в\\xa0парикмахерскую или другое заведение. Григорий Копиев Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Оставьте ваш e-mail, чтобы получатьнаш научный дайджест Предоставляя адрес электронной почты, вы принимаете условия соглашения о персональных данных. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2018 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Сайт может содержать контент, не предназначенный для лиц младше 18 лет. Политика обработки персональных данных пользователей сайта Change privacy settings '" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.text[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Лишний текст находится после фразы 'Нашли опечатку?'. Так давайте будем разбивать строки по этой фразе с помощью метода `.split()` и брать все, что до нее (элемент с индексом 0)." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "df['clean_text'] = [t.split('Нашли опечатку?')[0] for t in df.text]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Всё! Сохраняем датафрейм в файл." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df.to_csv('nplus-news.csv')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }