{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы программирования в Python\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Web-scraping\n", "\n", "Мы уже немного познакомились со структурой html-файлов, теперь попробуем выгрузить информацию из реальной страницы, а точнее, с реального сайта [nplus1.ru](https://nplus1.ru/).\n", "\n", "**Наша задача:** выгрузить недавние новости в датафрейм `pandas`, чтобы потом сохранить все в csv-файл.\n", "\n", "Сначала сгрузим весь html-код страницы и сохраним его в отдельную переменную. Для этого нам понадобится библиотека `requests`. Импортируем её:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import requests" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сохраним ссылку на главную страницу сайта в переменную `url` для удобства и выгрузим страницу. (Разумеется, это будет работать при подключении к интернету. Если соединение будет отключено, Python выдаст `NewConnectionError`)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "url = 'https://nplus1.ru/' # сохраняем\n", "page = requests.get(url) # загружаем страницу по ссылке" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если мы просто посмотрим на объект, мы ничего особенного не увидим:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "page # response 200 - страница загружена" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем функцию `BeautifulSoup` из библиотеки `bs4` (от *beautifulsoup4*) и заберём со страницы `page` код html в виде текста. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from bs4 import BeautifulSoup # не спрашивайте, почему BeautifulSoup" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "soup = BeautifulSoup(page.text, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если выведем `soup` на экран, мы увидим то же самое, что в режиме разработчика или в режиме происмотра исходного кода (`view-source` через *Ctrl+U* в Google Chrome)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "soup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для просмотра выглядит не очень удобно.  «Причешем» наш `soup` – воспользуемся методом `.prettify()` в сочетании с функцией `print()`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(soup.prettify())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В такой выдаче ориентироваться гораздо удобнее (но при желании, то же можно увидеть в браузере, на большом экране)." ] }, { "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": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/news/2018/12/06/paper',\n", " '/news/2018/12/06/fluoxetine-on-functional-performance',\n", " '/news/2018/12/06/uv-sensor',\n", " '/news/2018/12/06/schizo-vitamin-d',\n", " '/news/2018/12/06/missile',\n", " '/news/2018/12/06/biodegradation',\n", " '/news/2018/12/06/microplastics-gut',\n", " '/news/2018/12/06/simulator',\n", " '/news/2018/12/06/still-got-it',\n", " '/news/2018/12/06/noncodingcancer',\n", " '/news/2018/12/06/raider',\n", " '/news/2018/12/05/failure',\n", " '/news/2018/12/05/negative-creation',\n", " '/news/2018/12/05/crs-16',\n", " '/news/2018/12/05/ichthyosaur',\n", " '/news/2018/12/05/3d-debut',\n", " '/news/2018/12/05/benny-at-19-km',\n", " '/news/2018/12/05/self-driving-plant',\n", " '/news/2018/12/05/wheelie-7',\n", " '/news/2018/12/03/trash-of-early-solar-system',\n", " '/news/2018/12/05/potts',\n", " '/news/2018/11/27/wafer-perfo-graphen',\n", " '/news/2018/12/03/wi-fi-analog',\n", " '/news/2018/12/05/negative-creation',\n", " '/news/2018/11/28/sound-cooling',\n", " '/news/2018/11/26/bose-fermi-condensate',\n", " '/news/2018/11/26/kinesin-efficiency',\n", " '/news/2018/11/26/coffee-rim']" ] }, "execution_count": 10, "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": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['https://nplus1.ru/news/2018/12/06/paper',\n", " 'https://nplus1.ru/news/2018/12/06/fluoxetine-on-functional-performance',\n", " 'https://nplus1.ru/news/2018/12/06/uv-sensor',\n", " 'https://nplus1.ru/news/2018/12/06/schizo-vitamin-d',\n", " 'https://nplus1.ru/news/2018/12/06/missile',\n", " 'https://nplus1.ru/news/2018/12/06/biodegradation',\n", " 'https://nplus1.ru/news/2018/12/06/microplastics-gut',\n", " 'https://nplus1.ru/news/2018/12/06/simulator',\n", " 'https://nplus1.ru/news/2018/12/06/still-got-it',\n", " 'https://nplus1.ru/news/2018/12/06/noncodingcancer',\n", " 'https://nplus1.ru/news/2018/12/06/raider',\n", " 'https://nplus1.ru/news/2018/12/05/failure',\n", " 'https://nplus1.ru/news/2018/12/05/negative-creation',\n", " 'https://nplus1.ru/news/2018/12/05/crs-16',\n", " 'https://nplus1.ru/news/2018/12/05/ichthyosaur',\n", " 'https://nplus1.ru/news/2018/12/05/3d-debut',\n", " 'https://nplus1.ru/news/2018/12/05/benny-at-19-km',\n", " 'https://nplus1.ru/news/2018/12/05/self-driving-plant',\n", " 'https://nplus1.ru/news/2018/12/05/wheelie-7',\n", " 'https://nplus1.ru/news/2018/12/03/trash-of-early-solar-system',\n", " 'https://nplus1.ru/news/2018/12/05/potts',\n", " 'https://nplus1.ru/news/2018/11/27/wafer-perfo-graphen',\n", " 'https://nplus1.ru/news/2018/12/03/wi-fi-analog',\n", " 'https://nplus1.ru/news/2018/12/05/negative-creation',\n", " 'https://nplus1.ru/news/2018/11/28/sound-cooling',\n", " 'https://nplus1.ru/news/2018/11/26/bose-fermi-condensate',\n", " 'https://nplus1.ru/news/2018/11/26/kinesin-efficiency',\n", " 'https://nplus1.ru/news/2018/11/26/coffee-rim']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_urls = []\n", "\n", "for u in urls:\n", " res = 'https://nplus1.ru' + u\n", " full_urls.append(res) \n", "\n", "full_urls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь наша задача сводится к следующему: изучить одну страницу с новостью, научиться из нее вытаскивать текст и всю необходимую информацию, а потом применить весь набор действий к каждой ссылке из `full_urls` в цикле. Посмотрим на новость с индексом 1, у вас может быть другая, новости обновляются." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "url0 = full_urls[1]\n", "\n", "page0 = requests.get(url0)\n", "soup0 = BeautifulSoup(page0.text, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В коде каждой страницы с новостью есть часть с мета-информацией: датой, именем автора и проч. Такая информация окружена тэгом ``. Посмотрим:" ] }, { "cell_type": "code", "execution_count": 30, "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": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Из этого списка нам нужны части с именем автора, датой, заголовком и кратким описанием. Воспользуемся поиском по атрибуту `name`. Передадим функции `find_all()` в качестве аргумента словарь с названием и значением атрибута: " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'}) # например, автор" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь выберем единственный элемент полученного списка (с индексом 0):" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'})[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нам нужно вытащить из этого объекта `content` – имя автора. Посмотрим на атрибуты:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'name': 'author', 'content': 'Елизавета Ивтушок'}" ] }, "execution_count": 33, "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": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Елизавета Ивтушок'" ] }, "execution_count": 34, "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": 35, "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": [ "Осталось вытащить рубрики и сложность текста. Если мы посмотрим на исходный код страницы, мы увидим, что нужная нам информация находится в тэгах `

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

\n", " Медицина\n", "

,

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

,

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

,

Структура флуоксетина

,

,

Британские ученые в ходе масштабного исследования опровергли пользу популярного антидепрессанта флуоксетина для восстановления функциональности пациентов после инсульта. В ходе их исследования у участников, принимавших препарат в течение полугода, не наблюдалось улучшений физической формы по сравнению с плацебо-группой. Статья опубликована в The Lancet.

,

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

,

Заняться этим решили ученые под руководством Мартина Денниса (Martin Dennis) из Эдинбургского университета. В рамках проекта FOCUS (Fluoxetine or Control Under Supervision) они в течение полугода следили за 3127 пациентами, которые проходили реабилитацию после инсульта в британских клиниках: все участники были старше 18 лет, попали в исследование в течение 2-15 дней после инсульта и имели неврологические нарушения. Половина из участников ежедневно принимала 20 миллиграммов флуоксетина, а половина принимала плацебо.

,

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

,

Ученые не нашли значимых (p = 0,439) различий по шкале Ранкина между участниками из контрольной и экспериментальной группы. Это значит, что флуоксетин не помог улучшить функции конечностей пациентов. Тем не менее, исследователи отметили, что в активной группе реже наблюдались симптомы депрессии, но также в активной группе было зарегистрировано на 1,41 процента больше случаев переломов.

,

Авторы работы пришли к выводу о бесполезности применения флуоксетина для улучшения функциональности пациентов после инсульта. Несмотря на то, что препарат смог улучшить их психическое состояние, медицинскому персоналу также необходимо учесть негативные последствия применения препарата (в данном случае — переломы конечностей).

,

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

,

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

,

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

,

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

,

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

,

О чем рассказала найденная табличка с фрагментом древнего аккадского эпоса

,

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

,

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

,

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

,

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

,

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

,

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

,

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

,

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

,

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

,

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

,

© 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": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('p')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выберем из полученного списка первый элемент и найдем в нем все тэги ``:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Медицина]" ] }, "execution_count": 37, "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": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Медицина']" ] }, "execution_count": 38, "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": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[2.1]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('span', {'class' : 'difficult-value'})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И выберем оттуда текст." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.1'" ] }, "execution_count": 40, "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": 41, "metadata": {}, "outputs": [], "source": [ "text_list = soup0.find_all('p', {'class' : None})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "«Выцепим» все тексты (без тэгов) из полученного списка:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "text = [t.text for t in text_list]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Склеим все элементы списка `text` через пробел:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Британские ученые в ходе масштабного исследования опровергли пользу популярного антидепрессанта флуоксетина для восстановления функциональности пациентов после инсульта. В ходе их исследования у участников, принимавших препарат в течение полугода, не наблюдалось улучшений физической формы по сравнению с плацебо-группой. Статья опубликована в The Lancet. Флукосетин — антидепрессант из группы селективных ингибиторов обратного захвата серотонина — зачастую прописывают пациентам, которые проходят длительный курс реабилитации с целью снизить риск развития депрессии и тревожного расстройства. Также считалось, что при реабилитации пациентов после инсульта флуоксетин может помочь восстановить физическую форму за счет усиления процесса нейрогенеза и улучшения нейропластичности (вследствие улучшения синтеза и работы серотонина), а также благодаря стимулирующему воздействию препарата. Клиническая эффективность флуоксетина в качестве средства для восстановления функциональности до сих пор не была доказана. Заняться этим решили ученые под руководством Мартина Денниса (Martin Dennis) из Эдинбургского университета. В рамках проекта FOCUS (Fluoxetine or Control Under Supervision) они в течение полугода следили за 3127 пациентами, которые проходили реабилитацию после инсульта в британских клиниках: все участники были старше 18 лет, попали в исследование в течение 2-15 дней после инсульта и имели неврологические нарушения. Половина из участников ежедневно принимала 20 миллиграммов флуоксетина, а половина принимала плацебо. Для самих пациентов, а также сотрудников клиник, исследование было полностью слепым: о том, в какую группу попал тот или иной участник, знали только исследователи. Функциональность участников в начале и конце исследования оценили по шкале Ранкина: обычно ее применяют для того, чтобы оценить эффективность реабилитации. Ученые не нашли значимых (p = 0,439) различий по шкале Ранкина между участниками из контрольной и экспериментальной группы. Это значит, что флуоксетин не помог улучшить функции конечностей пациентов. Тем не менее, исследователи отметили, что в активной группе реже наблюдались симптомы депрессии, но также в активной группе было зарегистрировано на 1,41 процента больше случаев переломов. Авторы работы пришли к выводу о бесполезности применения флуоксетина для улучшения функциональности пациентов после инсульта. Несмотря на то, что препарат смог улучшить их психическое состояние, медицинскому персоналу также необходимо учесть негативные последствия применения препарата (в данном случае — переломы конечностей). В восстановлении функций конечностей после инсульта помогают нейрокомпьютерные интерфейсы. Кроме того, недавний метаанализ также показал эффективность в терапии и транскраниальной стимуляции. Елизавета Ивтушок Нашли опечатку? Выделите фрагмент и нажмите 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": 43, "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": 44, "metadata": {}, "outputs": [], "source": [ "final_text = final_text.replace('\\n', ' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Не прошло и двух пар, как мы разобрались со всем :) Теперь осталось совсем чуть-чуть. Написать готовую функцию для всех проделанных нами действий и применить ее в цикле для всех ссылок в списке `full_urls`. Напишем! Аргументом функции будет ссылка на новость, а возвращать она будет текст новости и всю необходимую информацию (дата, автор, сложность и проч.). Скопируем все строки кода выше." ] }, { "cell_type": "code", "execution_count": 47, "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": 45, "metadata": {}, "outputs": [], "source": [ "from time import sleep" ] }, { "cell_type": "code", "execution_count": 48, "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": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('https://nplus1.ru/news/2018/12/06/paper',\n", " '2018-12-06',\n", " 'Григорий Копиев',\n", " 'Изображения на такой бумаге можно стереть, поместив ее в морозильную камеру',\n", " 'Китайцы создали долговременную перезаписываемую бумагу',\n", " 'Китайские исследователи разработали перезаписываемую бумагу, менять цвет которой можно с\\xa0помощью температуры или инфракрасного излучения. Бумага выдерживает более сотни циклов перезаписи с\\xa0небольшим изменением насыщенности цвета, а\\xa0записанные на\\xa0нее изображения сохраняются на\\xa0протяжении как минимум полугода, рассказывают авторы статьи в\\xa0ACS Applied Materials &\\xa0Interfaces. Существует немало технологий, призванных заменить собой обычную бумагу, которая до\\xa0сих пор применяется повсеместно. К\\xa0примеру, уже есть экспериментальные и\\xa0серийные экраны, которые можно складывать и\\xa0даже растягивать, не\\xa0разрушая\\xa0их. Кроме того, существует электронная бумага, не\\xa0использующая собственную подсветку, и\\xa0поэтому визуально напоминающая обычную бумагу. Тем не\\xa0менее, пока эти технологии не\\xa0достигли такой\\xa0же стоимости, тонкости и\\xa0других важных параметров, как у\\xa0бумаги. Часть ученых и\\xa0инженеров работают в\\xa0другом направлении и\\xa0пытаются создать не\\xa0замену бумаги, а\\xa0ее\\xa0более совершенную версию, в\\xa0том числе перезаписываемую. В\\xa0этой области уже существует достаточно много разработок, работающих на\\xa0разных принципах. Некоторые работают за\\xa0счет нагревания или облучения, другие требуют обработки раствором солей. Но\\xa0пока у\\xa0таких разработок есть серьезные недостатки, которые чаще всего касаются самого важного свойства бумаги\\xa0— сохранения информации на\\xa0протяжении долгого времени. Как правило, перезаписываемая бумага сохраняет изображение в\\xa0течение нескольких дней, а\\xa0также теряет свои свойства уже через несколько десятков циклов записи. Группа исследователей под руководством Вэя Чжана (Wei Zhang) из\\xa0Фуцзяньского педагогического университета создала новый вид перезаписываемой бумаги, обладающий высоким ресурсом, а\\xa0также простой в\\xa0производстве. Созданная учеными бумага состоит из\\xa0трех слоев. В\\xa0центре располагается обычная бумага, а\\xa0на\\xa0нее с\\xa0одной стороны наносится термохромный слой, а\\xa0с\\xa0другой черный фототермический тонер. Именно термохромный слой придает бумаге перезаписываемые свойства. Он\\xa0состоит из\\xa0трех соединений: цветообразователя, проявителя и\\xa0растворителя. В\\xa0прошлом году китайские ученые предложили использовать материалы с\\xa0перовскитной структурой в\\xa0качестве основного элемента симпатических чернил, которые можно перевести в\\xa0состояние, в\\xa0котором они становятся видны при облучении ультрафиолетом, с\\xa0помощью химической активации. А\\xa0при необходимости их\\xa0можно перевести обратно в\\xa0неактивное состояние. Григорий Копиев Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Оставьте ваш e-mail, чтобы получатьнаш научный дайджест Предоставляя адрес электронной почты, вы принимаете условия соглашения о персональных данных. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2018 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Сайт может содержать контент, не предназначенный для лиц младше 18 лет. Политика обработки персональных данных пользователей сайта Change privacy settings ',\n", " ['Материалы'],\n", " '3.2')" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "news[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем `pandas` и создадим датафрейм из списка кортежей: " ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(news)" ] }, { "cell_type": "code", "execution_count": 52, "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/12/06/paper2018-12-06Григорий КопиевИзображения на такой бумаге можно стереть, пом...Китайцы создали долговременную перезаписываему...Китайские исследователи разработали перезаписы...[Материалы]3.2
1https://nplus1.ru/news/2018/12/06/fluoxetine-o...2018-12-06Елизавета ИвтушокПри этом препарат уменьшил симптомы депрессии ...Популярный антидепрессант оказался бесполезным...Британские ученые в ходе масштабного исследова...[Медицина]2.1
\n", "
" ], "text/plain": [ " 0 1 \\\n", "0 https://nplus1.ru/news/2018/12/06/paper 2018-12-06 \n", "1 https://nplus1.ru/news/2018/12/06/fluoxetine-o... 2018-12-06 \n", "\n", " 2 3 \\\n", "0 Григорий Копиев Изображения на такой бумаге можно стереть, пом... \n", "1 Елизавета Ивтушок При этом препарат уменьшил симптомы депрессии ... \n", "\n", " 4 \\\n", "0 Китайцы создали долговременную перезаписываему... \n", "1 Популярный антидепрессант оказался бесполезным... \n", "\n", " 5 6 7 \n", "0 Китайские исследователи разработали перезаписы... [Материалы] 3.2 \n", "1 Британские ученые в ходе масштабного исследова... [Медицина] 2.1 " ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Переименуем столбцы в базе." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "df.columns = ['link', 'date', 'author', 'desc', 'title', 'text', 'rubric', 'diffc']" ] }, { "cell_type": "code", "execution_count": 54, "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/12/06/paper2018-12-06Григорий КопиевИзображения на такой бумаге можно стереть, пом...Китайцы создали долговременную перезаписываему...Китайские исследователи разработали перезаписы...[Материалы]3.2
1https://nplus1.ru/news/2018/12/06/fluoxetine-o...2018-12-06Елизавета ИвтушокПри этом препарат уменьшил симптомы депрессии ...Популярный антидепрессант оказался бесполезным...Британские ученые в ходе масштабного исследова...[Медицина]2.1
\n", "
" ], "text/plain": [ " link date \\\n", "0 https://nplus1.ru/news/2018/12/06/paper 2018-12-06 \n", "1 https://nplus1.ru/news/2018/12/06/fluoxetine-o... 2018-12-06 \n", "\n", " author desc \\\n", "0 Григорий Копиев Изображения на такой бумаге можно стереть, пом... \n", "1 Елизавета Ивтушок При этом препарат уменьшил симптомы депрессии ... \n", "\n", " title \\\n", "0 Китайцы создали долговременную перезаписываему... \n", "1 Популярный антидепрессант оказался бесполезным... \n", "\n", " text rubric diffc \n", "0 Китайские исследователи разработали перезаписы... [Материалы] 3.2 \n", "1 Британские ученые в ходе масштабного исследова... [Медицина] 2.1 " ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь внесем изменения: сделаем столбец `diffc` числовым – типа *float*." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "df['diffc'] = [float(i) for i in df.diffc]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь сложность представлена в базе как количественный показатель, и описывать ее можно соответствующим образом:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 28.000000\n", "mean 4.117857\n", "std 2.251428\n", "min 1.100000\n", "25% 2.375000\n", "50% 3.100000\n", "75% 6.750000\n", "max 8.900000\n", "Name: diffc, dtype: float64" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.diffc.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь столбец со сложностью точно числовой. Можем даже построить для него гистограмму." ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "df.diffc.plot.hist()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объединим рубрики в *text* в одну строку через запятую:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "df['rubric'] = [','.join(r) for r in df.rubric]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте почистим текст новостей – уберем оттуда текст, не относящийся к новостям. Найдем лишнее:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Китайские исследователи разработали перезаписываемую бумагу, менять цвет которой можно с\\xa0помощью температуры или инфракрасного излучения. Бумага выдерживает более сотни циклов перезаписи с\\xa0небольшим изменением насыщенности цвета, а\\xa0записанные на\\xa0нее изображения сохраняются на\\xa0протяжении как минимум полугода, рассказывают авторы статьи в\\xa0ACS Applied Materials &\\xa0Interfaces. Существует немало технологий, призванных заменить собой обычную бумагу, которая до\\xa0сих пор применяется повсеместно. К\\xa0примеру, уже есть экспериментальные и\\xa0серийные экраны, которые можно складывать и\\xa0даже растягивать, не\\xa0разрушая\\xa0их. Кроме того, существует электронная бумага, не\\xa0использующая собственную подсветку, и\\xa0поэтому визуально напоминающая обычную бумагу. Тем не\\xa0менее, пока эти технологии не\\xa0достигли такой\\xa0же стоимости, тонкости и\\xa0других важных параметров, как у\\xa0бумаги. Часть ученых и\\xa0инженеров работают в\\xa0другом направлении и\\xa0пытаются создать не\\xa0замену бумаги, а\\xa0ее\\xa0более совершенную версию, в\\xa0том числе перезаписываемую. В\\xa0этой области уже существует достаточно много разработок, работающих на\\xa0разных принципах. Некоторые работают за\\xa0счет нагревания или облучения, другие требуют обработки раствором солей. Но\\xa0пока у\\xa0таких разработок есть серьезные недостатки, которые чаще всего касаются самого важного свойства бумаги\\xa0— сохранения информации на\\xa0протяжении долгого времени. Как правило, перезаписываемая бумага сохраняет изображение в\\xa0течение нескольких дней, а\\xa0также теряет свои свойства уже через несколько десятков циклов записи. Группа исследователей под руководством Вэя Чжана (Wei Zhang) из\\xa0Фуцзяньского педагогического университета создала новый вид перезаписываемой бумаги, обладающий высоким ресурсом, а\\xa0также простой в\\xa0производстве. Созданная учеными бумага состоит из\\xa0трех слоев. В\\xa0центре располагается обычная бумага, а\\xa0на\\xa0нее с\\xa0одной стороны наносится термохромный слой, а\\xa0с\\xa0другой черный фототермический тонер. Именно термохромный слой придает бумаге перезаписываемые свойства. Он\\xa0состоит из\\xa0трех соединений: цветообразователя, проявителя и\\xa0растворителя. В\\xa0прошлом году китайские ученые предложили использовать материалы с\\xa0перовскитной структурой в\\xa0качестве основного элемента симпатических чернил, которые можно перевести в\\xa0состояние, в\\xa0котором они становятся видны при облучении ультрафиолетом, с\\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": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.text[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Лишний текст находится после фразы 'Нашли опечатку?'. Так давайте будем разбивать строки по этой фразе с помощью метода `.split()` и брать все, что до нее (элемент с индексом 0)." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "df['clean_text'] = [t.split('Нашли опечатку?')[0] for t in df.text]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось только заменить непонятные символы `\\xa0` на пробелы:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "df['clean_text'] = [t.replace(\"\\xa0\", \" \") for t in df.clean_text]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Китайские исследователи разработали перезаписываемую бумагу, менять цвет которой можно с помощью температуры или инфракрасного излучения. Бумага выдерживает более сотни циклов перезаписи с небольшим изменением насыщенности цвета, а записанные на нее изображения сохраняются на протяжении как минимум полугода, рассказывают авторы статьи в ACS Applied Materials & Interfaces. Существует немало технологий, призванных заменить собой обычную бумагу, которая до сих пор применяется повсеместно. К примеру, уже есть экспериментальные и серийные экраны, которые можно складывать и даже растягивать, не разрушая их. Кроме того, существует электронная бумага, не использующая собственную подсветку, и поэтому визуально напоминающая обычную бумагу. Тем не менее, пока эти технологии не достигли такой же стоимости, тонкости и других важных параметров, как у бумаги. Часть ученых и инженеров работают в другом направлении и пытаются создать не замену бумаги, а ее более совершенную версию, в том числе перезаписываемую. В этой области уже существует достаточно много разработок, работающих на разных принципах. Некоторые работают за счет нагревания или облучения, другие требуют обработки раствором солей. Но пока у таких разработок есть серьезные недостатки, которые чаще всего касаются самого важного свойства бумаги — сохранения информации на протяжении долгого времени. Как правило, перезаписываемая бумага сохраняет изображение в течение нескольких дней, а также теряет свои свойства уже через несколько десятков циклов записи. Группа исследователей под руководством Вэя Чжана (Wei Zhang) из Фуцзяньского педагогического университета создала новый вид перезаписываемой бумаги, обладающий высоким ресурсом, а также простой в производстве. Созданная учеными бумага состоит из трех слоев. В центре располагается обычная бумага, а на нее с одной стороны наносится термохромный слой, а с другой черный фототермический тонер. Именно термохромный слой придает бумаге перезаписываемые свойства. Он состоит из трех соединений: цветообразователя, проявителя и растворителя. В прошлом году китайские ученые предложили использовать материалы с перовскитной структурой в качестве основного элемента симпатических чернил, которые можно перевести в состояние, в котором они становятся видны при облучении ультрафиолетом, с помощью химической активации. А при необходимости их можно перевести обратно в неактивное состояние. Григорий Копиев '" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.clean_text[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Всё! Сохраняем датафрейм в файл. Для разнообразия сохраним в Excel:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "df.to_excel('nplus-news.xlsx')" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }