{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Web-scraping: сбор данных из баз данных и интернет-источников\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "## Работа с API ВКонтакте: собираем посты со стены" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Загружаем модули и библиотеки, необходимые для работы:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests\n", "import time\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для начала давайте посмотрим на документацию API и посмотрим, как к нему формировать запросы: https://dev.vk.com/api/api-requests." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В прошлый раз по инструкции мы получили доступ к API, вспомним шаги." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter your client id: 7435771\n", "https://oauth.vk.com/authorize?client_id=7435771&display=page&redirect_uri=http://oauth.vk.com/blank.html&scope=all&response_type=token\n" ] } ], "source": [ "# вводим id своего приложения\n", "# и проходим по ссылке с этим id\n", "\n", "app_id = input(\"Enter your client id: \")\n", "url = f\"https://oauth.vk.com/authorize?client_id={app_id}&display=page&redirect_uri=http://oauth.vk.com/blank.html&scope=all&response_type=token\"\n", "print(url)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter your token here: 613f507e544b28900b1da6ed753eb62dc1cd2a4c43a24b84ea3c4e094f9b7693b7d9bc78affb46d147e21\n" ] } ], "source": [ "# копируем токен доступа\n", "\n", "token = input(\"Enter your token here: \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На этом практическом занятии мы будем выгружать посты из сообщества [Цитатник ВШЭ](https://vk.com/hseteachers). Сохраним в переменные версию API, ссылку для метода работы со стеной сообщества и название сообщества:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "v = \"5.131\"\n", "main_wall = \"https://api.vk.com/method/wall.get\"\n", "domain = \"hseteachers\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Функция `get()` из библиотеки `requests` умеет подставлять в запрос необходимые параметры и объединять их с помощью `?` и `&`. Сохраним необходимые параметры в виде словаря:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "params_wall = {\"access_token\" : token, \n", " \"domain\" : domain, \n", " \"count\" : 100,\n", " \"v\" : v}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А теперь сформируем запрос и выгрузим результаты в формате JSON – в Python данные в таком формате будут представлены в виде словаря:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "req_wall = requests.get(main_wall, params = params_wall)\n", "json_wall = req_wall.json()\n", "# json_wall" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Извлечём из этого большого словаря элемент, который хранит непосредственно результаты – список из маленьких словарей с информацией о постах (1 словарь = 1 пост):" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "items_wall = json_wall['response']['items']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на один элемент такого списка:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'id': 36498,\n", " 'from_id': -63442801,\n", " 'owner_id': -63442801,\n", " 'date': 1648034700,\n", " 'marked_as_ads': 0,\n", " 'post_type': 'post',\n", " 'text': 'Прошу прощения за эту пытку, я старался как мог...\\n\\n#Автономов_ВШЭ #Микроэкономика',\n", " 'post_source': {'type': 'vk'},\n", " 'comments': {'can_post': 1, 'count': 0},\n", " 'likes': {'can_like': 1, 'count': 145, 'user_likes': 0, 'can_publish': 1},\n", " 'reposts': {'count': 23, 'user_reposted': 0},\n", " 'views': {'count': 4573},\n", " 'is_favorite': False,\n", " 'donut': {'is_donut': False},\n", " 'short_text_rate': 0.8,\n", " 'hash': 'mb7PYe6VctNOeZPXbX0luMPOiLY'}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "i = items_wall[0]\n", "i" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Поработаем с ним!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1\n", "\n", "Извлечь из элемента `i` следующие компоненты:\n", "\n", "* id поста;\n", "* дата поста;\n", "* текст поста;\n", "* число лайков;\n", "* число репостов;\n", "* число просмотров;\n", "* число комментариев." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "36498 1648034700 Прошу прощения за эту пытку, я старался как мог...\n", "\n", "#Автономов_ВШЭ #Микроэкономика\n", "145 23 4573 0\n" ] } ], "source": [ "print(i[\"id\"], i[\"date\"], i[\"text\"])\n", "print(i[\"likes\"][\"count\"], i[\"reposts\"][\"count\"], i[\"views\"][\"count\"],\n", " i[\"comments\"][\"count\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2\n", "\n", "Напишите функцию `get_posts()`, которая принимает на вход словарь, аналогичный сохранённому в `i`, и возвращает список из следующих характеристик:\n", "\n", "* id поста;\n", "* дата поста;\n", "* текст поста;\n", "* число лайков;\n", "* число репостов;\n", "* число просмотров;\n", "* число комментариев." ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "# добавляем ловлю исключений\n", "# на случай, если какие-то характеристики будут отсутствовать\n", "\n", "def get_posts(i):\n", " try:\n", " id_ = i[\"id\"]\n", " date = i[\"date\"]\n", " text = i[\"text\"]\n", " likes = i[\"likes\"][\"count\"]\n", " repos = i[\"reposts\"][\"count\"]\n", " views = i[\"views\"][\"count\"]\n", " comments = i[\"comments\"][\"count\"]\n", " except:\n", " id_ = i[\"id\"]\n", " date = i[\"date\"]\n", " text = \"\"\n", " likes = 0\n", " repos = 0\n", " views = 0\n", " comments = 0\n", " L = [id_, date, text, likes, repos, views, comments] \n", " return L" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3\n", "\n", "Примените функцию `get_posts()` ко всем элементам списка `items_wall` и сохраните полученные результаты в список `posts`. " ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "posts = []\n", "\n", "for i in items_wall:\n", " p = get_posts(i)\n", " posts.append(p) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4\n", "\n", "Прочитайте в документации к API ВКонтакте про аргумент `offset` в методе `wall.get`. Используя полученную информацию и блоки кода ниже, выгрузите и сохраните в список `items_more` данные ещё по 9200 постам на стене сообщества.\n", "\n", "**Подсказка:** чтобы расширять список правильным образом, используйте метод `.extend()`, а не `.append()`, он добавляет не один элемент, а сразу несколько (см. примеры ниже)." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]\n" ] } ], "source": [ "# с append()\n", "\n", "A = []\n", "for i in range(5):\n", " B = [1, 2, 3]\n", " A.append(B)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]\n" ] } ], "source": [ "# с extend()\n", "\n", "A = []\n", "for i in range(5):\n", " B = [1, 2, 3]\n", " A.extend(B)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "params_wall_long = {\"access_token\" : token, \n", " \"domain\" : domain, \n", " \"count\" : 100,\n", " \"offset\" : 100,\n", " \"v\" : v} " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n", "10\n", "11\n", "12\n", "13\n", "14\n", "15\n", "16\n", "17\n", "18\n", "19\n", "20\n", "21\n", "22\n", "23\n", "24\n", "25\n", "26\n", "27\n", "28\n", "29\n", "30\n", "31\n", "32\n", "33\n", "34\n", "35\n", "36\n", "37\n", "38\n", "39\n", "40\n", "41\n", "42\n", "43\n", "44\n", "45\n", "46\n", "47\n", "48\n", "49\n", "50\n", "51\n", "52\n", "53\n", "54\n", "55\n", "56\n", "57\n", "58\n", "59\n", "60\n", "61\n", "62\n", "63\n", "64\n", "65\n", "66\n", "67\n", "68\n", "69\n", "70\n", "71\n", "72\n", "73\n", "74\n", "75\n", "76\n", "77\n", "78\n", "79\n", "80\n", "81\n", "82\n", "83\n", "84\n", "85\n", "86\n", "87\n", "88\n", "89\n", "90\n", "91\n" ] } ], "source": [ "items_more = [] \n", "\n", "for i in range(92):\n", " req_wall_long = requests.get(main_wall, params = params_wall_long)\n", " json_wall_long = req_wall_long.json()\n", " items_wall_long = json_wall_long['response']['items']\n", " items_more.extend(items_wall_long) \n", " params_wall_long[\"offset\"] = params_wall_long[\"offset\"] + 100\n", " time.sleep(1.5)\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь извлечём из каждого элемента `items_more` нужную информацию и расширим список `posts`, который у нас уже был до этого:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "for i in items_more:\n", " p = get_posts(i)\n", " posts.append(p)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7081" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(posts) # все идёт по плану" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[26132,\n", " 1563175800,\n", " '*идет экзамен по эконому, Касаткина встает и берет в руки микрофон\\n\\n- Московское время 11 часов 15 минут.\\n\\n#Касаткина_ВШЭ #экономика #фкмд #медиаком',\n", " 273,\n", " 2,\n", " 13871,\n", " 0]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "posts[202]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Преобразуем результат в датафрейм, добавим названия столбцов:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "dat = pd.DataFrame(posts)\n", "dat.columns = [\"id\", \"timestamp\", \"post\", \"likes\", \n", " \"reposts\", \"views\", \"comments\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Несколько строк датафрейма для примера:" ] }, { "cell_type": "code", "execution_count": 51, "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", " \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", "
idtimestamppostlikesrepostsviewscomments
0364981648034700Прошу прощения за эту пытку, я старался как мо...1452345730
1364961647948300Я как-то помогал своему другу составить резюме...1771959740
2364911647861900Задача менеджера - принуждать. Задача директор...1152056341
3364881647775500Если вы возьмёте интервью у Абрамовича, мы с р...81545151
4364861647689100Удобно когда твой любовник одной с тобой веры,...1152356890
\n", "
" ], "text/plain": [ " id timestamp post \\\n", "0 36498 1648034700 Прошу прощения за эту пытку, я старался как мо... \n", "1 36496 1647948300 Я как-то помогал своему другу составить резюме... \n", "2 36491 1647861900 Задача менеджера - принуждать. Задача директор... \n", "3 36488 1647775500 Если вы возьмёте интервью у Абрамовича, мы с р... \n", "4 36486 1647689100 Удобно когда твой любовник одной с тобой веры,... \n", "\n", " likes reposts views comments \n", "0 145 23 4573 0 \n", "1 177 19 5974 0 \n", "2 115 20 5634 1 \n", "3 81 5 4515 1 \n", "4 115 23 5689 0 " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dat.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Разобьём текст поста по `#`, чтобы извлечь тэги:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'А мне кажется, он написал просто потому что ему захотелось. \\n\\n#Виноградов_ВШЭ'" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dat[\"post\"][10] " ] }, { "cell_type": "code", "execution_count": 55, "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", " \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", " \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", "
012345
0Прошу прощения за эту пытку, я старался как мо...Автономов_ВШЭМикроэкономикаNoneNoneNone
1Я как-то помогал своему другу составить резюме...Аникин_ВШЭССиССNoneNoneNone
2Задача менеджера - принуждать. Задача директор...Аникин_ВШЭССиССNoneNoneNone
3Если вы возьмёте интервью у Абрамовича, мы с р...Слободенюк_ВШЭССиССNoneNoneNone
4Удобно когда твой любовник одной с тобой веры,...Козицкая_ВШЭNoneNoneNoneNone
.....................
7076NoneNoneNoneNoneNone
7077NoneNoneNoneNoneNone
7078NoneNoneNoneNoneNone
7079NoneNoneNoneNoneNone
7080NoneNoneNoneNoneNone
\n", "

7081 rows × 6 columns

\n", "
" ], "text/plain": [ " 0 1 \\\n", "0 Прошу прощения за эту пытку, я старался как мо... Автономов_ВШЭ \n", "1 Я как-то помогал своему другу составить резюме... Аникин_ВШЭ \n", "2 Задача менеджера - принуждать. Задача директор... Аникин_ВШЭ \n", "3 Если вы возьмёте интервью у Абрамовича, мы с р... Слободенюк_ВШЭ \n", "4 Удобно когда твой любовник одной с тобой веры,... Козицкая_ВШЭ \n", "... ... ... \n", "7076 None \n", "7077 None \n", "7078 None \n", "7079 None \n", "7080 None \n", "\n", " 2 3 4 5 \n", "0 Микроэкономика None None None \n", "1 ССиСС None None None \n", "2 ССиСС None None None \n", "3 ССиСС None None None \n", "4 None None None None \n", "... ... ... ... ... \n", "7076 None None None None \n", "7077 None None None None \n", "7078 None None None None \n", "7079 None None None None \n", "7080 None None None None \n", "\n", "[7081 rows x 6 columns]" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with_tags = dat[\"post\"].str.split(\"#\", expand = True)\n", "with_tags" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Основная информация – это первые два тэга, имя преподавателя и курс (по крайней мере, в большинстве случаев это так). Заберём для дальнейшей работы только их:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "small = with_tags.loc[:, 0:2] \n", "small.columns = [\"text\", \"teacher\", \"course\"] " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Склеим датафрейм `dat` с датафреймом `small` по столбцам:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "final = pd.concat([dat, small], axis = 1) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Заполним пропуски – добавим «пустой» текст в ячейки, где нет никаких значений:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "final = final.fillna(\"\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Избавимся от лишних пробелов и отступов в текстовых данных:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "final[\"text\"] = final[\"text\"].apply(lambda x: x.strip())\n", "final[\"teacher\"] = final[\"teacher\"].apply(lambda x: x.strip())\n", "final[\"course\"] = final[\"course\"].apply(lambda x: x.strip())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось поработать с форматом времени в столбце `timestamp`." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1648034700\n", "1 1647948300\n", "2 1647861900\n", "3 1647775500\n", "4 1647689100\n", " ... \n", "7076 1387918264\n", "7077 1387917399\n", "7078 1387917345\n", "7079 1387916061\n", "7080 1387914004\n", "Name: timestamp, Length: 7081, dtype: int64" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final[\"timestamp\"]" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1648034700" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = final[\"timestamp\"][0]\n", "t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем из модуля `datetime` функцию `datetime`, она поможет нам получить дату и время в привычном формате:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "from datetime import datetime" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2022, 3, 23, 11, 25)" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datetime.utcfromtimestamp(t)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2022-03-23 11:25:00'" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datetime.utcfromtimestamp(t).strftime('%Y-%m-%d %H:%M:%S')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Напишем функцию для преобразования временной метки:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "def time_transform(t):\n", " r = datetime.fromtimestamp(t).strftime('%Y-%m-%d %H:%M:%S')\n", " return r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Применим её ко всем элементам столбца:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "final[\"datetime\"] = final[\"timestamp\"].apply(time_transform)" ] }, { "cell_type": "code", "execution_count": 67, "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idtimestamppostlikesrepostsviewscommentstextteachercoursedatetime
0364981648034700Прошу прощения за эту пытку, я старался как мо...1452345730Прошу прощения за эту пытку, я старался как мо...Автономов_ВШЭМикроэкономика2022-03-23 14:25:00
1364961647948300Я как-то помогал своему другу составить резюме...1771959740Я как-то помогал своему другу составить резюме...Аникин_ВШЭССиСС2022-03-22 14:25:00
2364911647861900Задача менеджера - принуждать. Задача директор...1152056341Задача менеджера - принуждать. Задача директор...Аникин_ВШЭССиСС2022-03-21 14:25:00
3364881647775500Если вы возьмёте интервью у Абрамовича, мы с р...81545151Если вы возьмёте интервью у Абрамовича, мы с р...Слободенюк_ВШЭССиСС2022-03-20 14:25:00
4364861647689100Удобно когда твой любовник одной с тобой веры,...1152356890Удобно когда твой любовник одной с тобой веры,...Козицкая_ВШЭ2022-03-19 14:25:00
\n", "
" ], "text/plain": [ " id timestamp post \\\n", "0 36498 1648034700 Прошу прощения за эту пытку, я старался как мо... \n", "1 36496 1647948300 Я как-то помогал своему другу составить резюме... \n", "2 36491 1647861900 Задача менеджера - принуждать. Задача директор... \n", "3 36488 1647775500 Если вы возьмёте интервью у Абрамовича, мы с р... \n", "4 36486 1647689100 Удобно когда твой любовник одной с тобой веры,... \n", "\n", " likes reposts views comments \\\n", "0 145 23 4573 0 \n", "1 177 19 5974 0 \n", "2 115 20 5634 1 \n", "3 81 5 4515 1 \n", "4 115 23 5689 0 \n", "\n", " text teacher \\\n", "0 Прошу прощения за эту пытку, я старался как мо... Автономов_ВШЭ \n", "1 Я как-то помогал своему другу составить резюме... Аникин_ВШЭ \n", "2 Задача менеджера - принуждать. Задача директор... Аникин_ВШЭ \n", "3 Если вы возьмёте интервью у Абрамовича, мы с р... Слободенюк_ВШЭ \n", "4 Удобно когда твой любовник одной с тобой веры,... Козицкая_ВШЭ \n", "\n", " course datetime \n", "0 Микроэкономика 2022-03-23 14:25:00 \n", "1 ССиСС 2022-03-22 14:25:00 \n", "2 ССиСС 2022-03-21 14:25:00 \n", "3 ССиСС 2022-03-20 14:25:00 \n", "4 2022-03-19 14:25:00 " ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final.head() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь можем разбить дату-время по пробелу, чтобы получить отдельные столбцы с датой и временем (механизм нам уже известен, мы разбивали пост по `#` выше):" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "dt = final[\"datetime\"].str.split(\" \", expand = True)\n", "dt.columns = [\"date\", \"time\"] " ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "final2 = pd.concat([final, dt], axis = 1)" ] }, { "cell_type": "code", "execution_count": 70, "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", " \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", " \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", " \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", " \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", "
idtimestamppostlikesrepostsviewscommentstextteachercoursedatetimedatetime
0364981648034700Прошу прощения за эту пытку, я старался как мо...1452345730Прошу прощения за эту пытку, я старался как мо...Автономов_ВШЭМикроэкономика2022-03-23 14:25:002022-03-2314:25:00
1364961647948300Я как-то помогал своему другу составить резюме...1771959740Я как-то помогал своему другу составить резюме...Аникин_ВШЭССиСС2022-03-22 14:25:002022-03-2214:25:00
2364911647861900Задача менеджера - принуждать. Задача директор...1152056341Задача менеджера - принуждать. Задача директор...Аникин_ВШЭССиСС2022-03-21 14:25:002022-03-2114:25:00
3364881647775500Если вы возьмёте интервью у Абрамовича, мы с р...81545151Если вы возьмёте интервью у Абрамовича, мы с р...Слободенюк_ВШЭССиСС2022-03-20 14:25:002022-03-2014:25:00
4364861647689100Удобно когда твой любовник одной с тобой веры,...1152356890Удобно когда твой любовник одной с тобой веры,...Козицкая_ВШЭ2022-03-19 14:25:002022-03-1914:25:00
..........................................
70766138791826400002013-12-25 00:51:042013-12-2500:51:04
70775138791739900002013-12-25 00:36:392013-12-2500:36:39
70784138791734500002013-12-25 00:35:452013-12-2500:35:45
70793138791606100002013-12-25 00:14:212013-12-2500:14:21
70802138791400400002013-12-24 23:40:042013-12-2423:40:04
\n", "

7081 rows × 13 columns

\n", "
" ], "text/plain": [ " id timestamp post \\\n", "0 36498 1648034700 Прошу прощения за эту пытку, я старался как мо... \n", "1 36496 1647948300 Я как-то помогал своему другу составить резюме... \n", "2 36491 1647861900 Задача менеджера - принуждать. Задача директор... \n", "3 36488 1647775500 Если вы возьмёте интервью у Абрамовича, мы с р... \n", "4 36486 1647689100 Удобно когда твой любовник одной с тобой веры,... \n", "... ... ... ... \n", "7076 6 1387918264 \n", "7077 5 1387917399 \n", "7078 4 1387917345 \n", "7079 3 1387916061 \n", "7080 2 1387914004 \n", "\n", " likes reposts views comments \\\n", "0 145 23 4573 0 \n", "1 177 19 5974 0 \n", "2 115 20 5634 1 \n", "3 81 5 4515 1 \n", "4 115 23 5689 0 \n", "... ... ... ... ... \n", "7076 0 0 0 0 \n", "7077 0 0 0 0 \n", "7078 0 0 0 0 \n", "7079 0 0 0 0 \n", "7080 0 0 0 0 \n", "\n", " text teacher \\\n", "0 Прошу прощения за эту пытку, я старался как мо... Автономов_ВШЭ \n", "1 Я как-то помогал своему другу составить резюме... Аникин_ВШЭ \n", "2 Задача менеджера - принуждать. Задача директор... Аникин_ВШЭ \n", "3 Если вы возьмёте интервью у Абрамовича, мы с р... Слободенюк_ВШЭ \n", "4 Удобно когда твой любовник одной с тобой веры,... Козицкая_ВШЭ \n", "... ... ... \n", "7076 \n", "7077 \n", "7078 \n", "7079 \n", "7080 \n", "\n", " course datetime date time \n", "0 Микроэкономика 2022-03-23 14:25:00 2022-03-23 14:25:00 \n", "1 ССиСС 2022-03-22 14:25:00 2022-03-22 14:25:00 \n", "2 ССиСС 2022-03-21 14:25:00 2022-03-21 14:25:00 \n", "3 ССиСС 2022-03-20 14:25:00 2022-03-20 14:25:00 \n", "4 2022-03-19 14:25:00 2022-03-19 14:25:00 \n", "... ... ... ... ... \n", "7076 2013-12-25 00:51:04 2013-12-25 00:51:04 \n", "7077 2013-12-25 00:36:39 2013-12-25 00:36:39 \n", "7078 2013-12-25 00:35:45 2013-12-25 00:35:45 \n", "7079 2013-12-25 00:14:21 2013-12-25 00:14:21 \n", "7080 2013-12-24 23:40:04 2013-12-24 23:40:04 \n", "\n", "[7081 rows x 13 columns]" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final2" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "final2.to_excel(\"posts.xlsx\")" ] }, { "cell_type": "code", "execution_count": 74, "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", " \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", " \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", " \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", " \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", "
idtimestamppostlikesrepostsviewscommentstextteachercoursedatetimedatetime
210261081562830200В науке тоже могут быть разные эксцессы, мне к...61086220В науке тоже могут быть разные эксцессы, мне к...Скворцов_ВШЭПсихология2019-07-11 10:30:002019-07-1110:30:00
248259651561300200Я вам повторяю - ассоцианисты не лохи.\\n\\n#Скв...71069750Я вам повторяю - ассоцианисты не лохи.Скворцов_ВШЭПсихология2019-06-23 17:30:002019-06-2317:30:00
251259531561195801В психологии думать не надо: сказали \"ассоциац...107070900В психологии думать не надо: сказали \"ассоциац...Скворцов_ВШЭПсихология2019-06-22 12:30:012019-06-2212:30:01
337255251558940700Я вам повторяю - ассоцианисты не лохи.\\n\\n#Скв...76049120Я вам повторяю - ассоцианисты не лохи.Скворцов_ВШЭПсихология2019-05-27 10:05:002019-05-2710:05:00
393252901557215400*на паре про экзистенциальную психологию*:\\n\"Я...104057931*на паре про экзистенциальную психологию*:\\n\"Я...Скворцов_ВШЭПсихология2019-05-07 10:50:002019-05-0710:50:00
..........................................
3381140661507396200\"Здравствуйте, топор. Я - Толя Скворцов\".\\n\\n#...69248570\"Здравствуйте, топор. Я - Толя Скворцов\".Скворцов_ВШЭПсихология2017-10-07 20:10:002017-10-0720:10:00
3438138041506922740С. - Если Вышка уже такая многопрофильная, то,...157353021С. - Если Вышка уже такая многопрофильная, то,...Хачатурова_ВШЭПсихология2017-10-02 08:39:002017-10-0208:39:00
3480136901506517680\"Вселенная тоже пыхтит\"\\n\\n#Скворцов_ВШЭ #Псих...81050100\"Вселенная тоже пыхтит\"Скворцов_ВШЭПсихология2017-09-27 16:08:002017-09-2716:08:00
3534134441505928960Может он выбрасывается, потому что у него дети...69252820Может он выбрасывается, потому что у него дети.Молчанова_ВШЭПсихология2017-09-20 20:36:002017-09-2020:36:00
3544134061505821920\"Это относится и к мужчинам тоже: если вы не п...153255540\"Это относится и к мужчинам тоже: если вы не п...Россохин_ВШЭПсихология2017-09-19 14:52:002017-09-1914:52:00
\n", "

88 rows × 13 columns

\n", "
" ], "text/plain": [ " id timestamp post \\\n", "210 26108 1562830200 В науке тоже могут быть разные эксцессы, мне к... \n", "248 25965 1561300200 Я вам повторяю - ассоцианисты не лохи.\\n\\n#Скв... \n", "251 25953 1561195801 В психологии думать не надо: сказали \"ассоциац... \n", "337 25525 1558940700 Я вам повторяю - ассоцианисты не лохи.\\n\\n#Скв... \n", "393 25290 1557215400 *на паре про экзистенциальную психологию*:\\n\"Я... \n", "... ... ... ... \n", "3381 14066 1507396200 \"Здравствуйте, топор. Я - Толя Скворцов\".\\n\\n#... \n", "3438 13804 1506922740 С. - Если Вышка уже такая многопрофильная, то,... \n", "3480 13690 1506517680 \"Вселенная тоже пыхтит\"\\n\\n#Скворцов_ВШЭ #Псих... \n", "3534 13444 1505928960 Может он выбрасывается, потому что у него дети... \n", "3544 13406 1505821920 \"Это относится и к мужчинам тоже: если вы не п... \n", "\n", " likes reposts views comments \\\n", "210 61 0 8622 0 \n", "248 71 0 6975 0 \n", "251 107 0 7090 0 \n", "337 76 0 4912 0 \n", "393 104 0 5793 1 \n", "... ... ... ... ... \n", "3381 69 2 4857 0 \n", "3438 157 3 5302 1 \n", "3480 81 0 5010 0 \n", "3534 69 2 5282 0 \n", "3544 153 2 5554 0 \n", "\n", " text teacher \\\n", "210 В науке тоже могут быть разные эксцессы, мне к... Скворцов_ВШЭ \n", "248 Я вам повторяю - ассоцианисты не лохи. Скворцов_ВШЭ \n", "251 В психологии думать не надо: сказали \"ассоциац... Скворцов_ВШЭ \n", "337 Я вам повторяю - ассоцианисты не лохи. Скворцов_ВШЭ \n", "393 *на паре про экзистенциальную психологию*:\\n\"Я... Скворцов_ВШЭ \n", "... ... ... \n", "3381 \"Здравствуйте, топор. Я - Толя Скворцов\". Скворцов_ВШЭ \n", "3438 С. - Если Вышка уже такая многопрофильная, то,... Хачатурова_ВШЭ \n", "3480 \"Вселенная тоже пыхтит\" Скворцов_ВШЭ \n", "3534 Может он выбрасывается, потому что у него дети. Молчанова_ВШЭ \n", "3544 \"Это относится и к мужчинам тоже: если вы не п... Россохин_ВШЭ \n", "\n", " course datetime date time \n", "210 Психология 2019-07-11 10:30:00 2019-07-11 10:30:00 \n", "248 Психология 2019-06-23 17:30:00 2019-06-23 17:30:00 \n", "251 Психология 2019-06-22 12:30:01 2019-06-22 12:30:01 \n", "337 Психология 2019-05-27 10:05:00 2019-05-27 10:05:00 \n", "393 Психология 2019-05-07 10:50:00 2019-05-07 10:50:00 \n", "... ... ... ... ... \n", "3381 Психология 2017-10-07 20:10:00 2017-10-07 20:10:00 \n", "3438 Психология 2017-10-02 08:39:00 2017-10-02 08:39:00 \n", "3480 Психология 2017-09-27 16:08:00 2017-09-27 16:08:00 \n", "3534 Психология 2017-09-20 20:36:00 2017-09-20 20:36:00 \n", "3544 Психология 2017-09-19 14:52:00 2017-09-19 14:52:00 \n", "\n", "[88 rows x 13 columns]" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final2[final2[\"course\"] == \"Психология\"] " ] }, { "cell_type": "code", "execution_count": 77, "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", "
idtimestamppostlikesrepostsviewscommentstextteachercoursedatetimedatetime
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [id, timestamp, post, likes, reposts, views, comments, text, teacher, course, datetime, date, time]\n", "Index: []" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final2[final2[\"teacher\"].str.contains(\"тамб\")] " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }