{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Заметки — Игорь К.: заметки с тегом питон",
    "_rss_description": "Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/blog.fossko.ru\/tags\/piton\/",
    "feed_url": "https:\/\/blog.fossko.ru\/tags\/piton\/json\/",
    "icon": "https:\/\/blog.fossko.ru\/pictures\/userpic\/userpic@2x.jpg?1610628098",
    "authors": [
        {
            "name": "Игорь К.",
            "url": "https:\/\/blog.fossko.ru\/",
            "avatar": "https:\/\/blog.fossko.ru\/pictures\/userpic\/userpic@2x.jpg?1610628098"
        }
    ],
    "items": [
        {
            "id": "569",
            "url": "https:\/\/blog.fossko.ru\/all\/api-ot-platformy-vc-ru\/",
            "title": "API от платформы vc.ru",
            "content_html": "<p>На ВиСи можно получить список статей определенного пользователя используя скрытый апи.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/Jc7Hp953xg8?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Что такое скрытый апи и как его найти, рассказывает Алексей Куличевский<\/div>\n<\/div>\n<p>На виси есть скрытый апи, находящийся по адресу<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">https:\/\/api.vc.ru\/v2.8\/<\/code><\/pre><div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"879\" data-ratio=\"3.0102739726027\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru.png\" width=\"879\" height=\"292\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-1.png\" width=\"540\" height=\"191\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Ищется скрытый апи через консоль разработчика, в гугл хроме нажимаем ctrl+shift+С — переходим в вкладку Network<\/div>\n<\/div>\n<p>Для получения последний опубликованных статей пользователя<br \/>\nнужны следующие параметры отправляемые в гет запросе:<\/p>\n<ul>\n<li><b>markdown: false<\/b> — как отдаются статьи, на практике у меня всегда отдаются в html, не важно что стоит true или false<\/li>\n<li><b>sorting: new<\/b> — сортировка, можно использовать несколько видов: ’new’, ’hotness’, ’day’, ’week’, ’month’, ’year’, ’all’<br \/>\n<b>lastId: 1628356<\/b> — с какого последнего айдишника статьи продолжать показ, в получаемом джайсоне выводятся 12 элементов.<\/li>\n<li><b>lastSortingValue: 1730444607<\/b> — я не разобрался что это за параметр, без него работает корректно<\/li>\n<li><b>subsitesIds: 287399<\/b> — ай-ди пользователя статьи которого нам нужны<\/li>\n<\/ul>\n<p>Гет запрос отправляем на адрес<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">https:\/\/api.vc.ru\/v2.8\/timeline<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-3.png\" width=\"909\" height=\"516\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат выполнения гет запроса — нам нужны поля id — айди статьи, title — название статьи, дата и дата модификации — дата время в виде временной метки UNIX (число секунд, прошедших с 1 января 1970 года)<\/div>\n<\/div>\n<p>Код на питоне, для получения последних 12 статей опубликованных пользователем<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">import requests\nimport json\nimport datetime\n\nurl=&quot;https:\/\/api.vc.ru&quot;\nv_api=&quot;\/v2.8\/&quot;\nmetod=&quot;timeline&quot;\nall_url=url+v_api+metod\n\nmarkdown=&quot;true&quot;\nsubsitesIds=&quot;287399&quot;\nsorting= &quot;new&quot;\n\nparams = {&quot;markdown&quot;: markdown,\n          &quot;sorting&quot;: sorting, \n          &quot;subsitesIds&quot;: subsitesIds}\n\nresponse=requests.get(all_url, params=params)\n\ndata = response.json()\nitems = data[&#039;result&#039;][&#039;items&#039;]\nfor index, item in enumerate(items):\n        item_data = item[&#039;data&#039;]        \n        print(f&quot;Элемент {index + 1}:&quot;)\n        print(f&quot;ID: {item_data[&#039;id&#039;]}&quot;)\n        print(f&quot;url: https:\/\/vc.ru\/{item_data[&#039;id&#039;]}&quot;)\n        print(f&quot;Title: {item_data[&#039;title&#039;]}&quot;)\n        print(f&quot;дата публикации: {datetime.datetime.fromtimestamp(item_data[&#039;date&#039;])}&quot;)\n        print(f&quot;дата модификации: {datetime.datetime.fromtimestamp(item_data[&#039;dateModified&#039;])}&quot;)  \n        print()<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-2.png\" width=\"526\" height=\"439\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат выполнения, если нам нужно собрать все страницы, то необходимо в параметрах передавать lastId — последний в списке айди статьи, тогда следующие будут начиная с этого ай-ди.<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/alexpervushin\/vcru-api\/blob\/main\/vcru_api\/sync_wrapper.py\">У Александра Первушина на гитхабе проект vcru-api<\/a>, где опубликовано описание других методов, с помощью которых можно получить другие сведения, например комментарии к статье — метод comments, текст статьи — метод content<\/p>\n<p>Нашлась документация по API vc.ru, dtf.ru<\/p>\n<ul>\n<li><a href=\"https:\/\/komitet.notion.site\/API-TJ-vc-ru-DTF-3f5162d2cb184f6381ff82c085bbb3c0\">API основы ВиСи<\/a> — докумет в ноушене, может быть полезен<\/li>\n<li><a href=\"https:\/\/cmtt-ru.github.io\/osnova-api\/v1\/swagger.html#\/\">Описание версии апи 1.9<\/a> —  Основа api api.yaml, общая страница на гитхабе<\/li>\n<li><a href=\"https:\/\/cmtt-ru.github.io\/osnova-api\/swaggerui\/index.html?urls.primaryName=v2.31\">Описание версии апи 2.31<\/a><\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-4.png\" width=\"666\" height=\"263\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Не забывайте выбрать какой апи вы будете смотреть, в списке есть версия 2.31, на ноябрь 2024 года, используется версия 2.8<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-5.png\" width=\"797\" height=\"931\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Дополнительные параметры которые можно посмотреть в методе timeline, оказывается можно передать несколько пользователей через запятую<\/div>\n<\/div>\n<h2>Анализ пользователей vc.ru<\/h2>\n<p>На основании полученных данных можно провести анализ публикаций пользователей.<br \/>\nНапример, <a href=\"https:\/\/vc.ru\/u\/283507-tanya-bobrova\">пользователь Татьяна Боброва<\/a> — с 15 апреля 2019 года по 22 ноября 2024 года опубликовала 5682 записи.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-6.png\" width=\"993\" height=\"710\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Тепловая карта количества постов по дням недели и часам публикации <a href=\"https:\/\/vc.ru\/u\/283507-tanya-bobrova\">пользователь Татьяна Боброва<\/a><\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-7.png\" width=\"1001\" height=\"710\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Тепловая карта общего количества реакций по дням недели и часам публикации <a href=\"https:\/\/vc.ru\/u\/283507-tanya-bobrova\">пользователь Татьяна Боброва<\/a><\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-8.png\" width=\"1010\" height=\"710\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Тепловая карта общего количества комментариев по дням недели и часам публикации <a href=\"https:\/\/vc.ru\/u\/283507-tanya-bobrova\">пользователь Татьяна Боброва<\/a><\/div>\n<\/div>\n",
            "date_published": "2024-11-18T23:27:05+03:00",
            "date_modified": "2024-12-03T16:20:22+03:00",
            "tags": [
                "аналитика",
                "питон",
                "портфолио"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-Jc7Hp953xg8-cover.jpg",
            "_date_published_rfc2822": "Mon, 18 Nov 2024 23:27:05 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "569",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-Jc7Hp953xg8-cover.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-1.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-3.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-2.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-4.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-5.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-6.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-7.png",
                    "https:\/\/blog.fossko.ru\/pictures\/api-ot-platformy-vc-ru-8.png"
                ]
            }
        },
        {
            "id": "568",
            "url": "https:\/\/blog.fossko.ru\/all\/markdown-v-format-egei\/",
            "title": "Маркдаун в формат Эгеи",
            "content_html": "<p><a href=\"https:\/\/docs.google.com\/document\/d\/1uLYj2bE2KltgDV8EoeYVbL0Zn1EWuDcFBuoqWPuRack\/edit?tab=t.0#heading=h.bjhhm3n452q1\">Эгея использует свой синтаксис<\/a>, очень похожий на Markdown.<\/p>\n<p>Иногда требуется опубликовать заметку которая сохранена в маркдаун разметке, например гугл документ можно экспортировать в маркдаун.<\/p>\n<p>Для этого можно использовать скрипт на питоне<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">import re\n\ndef convert_to_egea(markdown_text):\n    # Convert headers\n    egea_text = re.sub(r&#039;^### (.*)$&#039;, r&#039;### \\1&#039;, markdown_text, flags=re.MULTILINE)\n    egea_text = re.sub(r&#039;^## (.*)$&#039;, r&#039;## \\1&#039;, egea_text, flags=re.MULTILINE)\n    egea_text = re.sub(r&#039;^# (.*)$&#039;, r&#039;# \\1&#039;, egea_text, flags=re.MULTILINE)\n    \n    # Convert bold (leave as is)\n    # Make sure to selectively replace *italic* with \/\/italic\/\/ by considering ___not both_bold and italic___\n    egea_text = re.sub(r&#039;\\*\\*(.*?)\\*\\*&#039;, r&#039;**\\1**&#039;, egea_text)\n    \n    # Convert italic\n    egea_text = re.sub(r&#039;(?&lt;!\\*)\\*(?!\\*)(.*?)\\*(?!\\*)(?&lt;!\\*)&#039;, r&#039;\/\/\\1\/\/&#039;, egea_text)\n    \n    # Convert strikethrough (leave as is)\n    egea_text = re.sub(r&#039;~~(.*?)~~&#039;, r&#039;--\\1--&#039;, egea_text)\n    \n    # Convert links\n    egea_text = re.sub(r&#039;\\[(.*?)\\]\\((.*?)\\)&#039;, r&#039;((\\2 \\1))&#039;, egea_text)\n    \n    # Convert blockquotes\n    egea_text = re.sub(r&#039;^&gt; (.*)$&#039;, r&#039;&gt; \\1&#039;, egea_text, flags=re.MULTILINE)\n    \n    # Convert unordered lists\n    egea_text = re.sub(r&#039;^\\* (.*)$&#039;, r&#039;- \\1&#039;, egea_text, flags=re.MULTILINE)\n    \n    # Convert ordered lists\n    egea_text = re.sub(r&#039;^\\d+\\. (.*)$&#039;, r&#039;1. \\1&#039;, egea_text, flags=re.MULTILINE)\n    \n    # Convert images\n    egea_text = re.sub(r&#039;!\\[(.*?)\\]\\((.*?)\\)&#039;, r&#039;\\2 \\1&#039;, egea_text)\n\n    # Convert tables\n    egea_text = re.sub(\n        r&#039;((?:\\|.*\\|\\n)+)&#039;, \n        lambda match: f&quot;-----\\n{match.group(1)}-----\\n&quot;, \n        egea_text\n    )\n  \n    return egea_text\n\n# Usage example:\nmarkdown_text = &quot;&quot;&quot;\n# Заголовок первого уровня\n\n## Заголовок второго уровня\n\n### Заголовок третьего уровня\n\n**Жирный текст**\n\n*Курсивный текст*\n\n~~Зачеркнутый текст~~\n\n[Ссылка](http:\/\/example.com)\n\n&gt; Цитата\n\n- Элемент ненумерованного списка\n\n1. Элемент нумерованного списка\n\n![Изображение](http:\/\/example.com\/image.jpg)\n\n**Основные выводы и тезисы мастер-класса Максима Ильяхова о соцсетях**\n\n| Покупка | Ссылка в шапке Кнопка продажи Директ |\n| one | two | three |\n| 1 | 2 | 3 |\n| raz | dva | tri |\n| un | deux | trois |\n&quot;&quot;&quot;\n\negea_text = convert_to_egea(markdown_text)\nprint(egea_text)<\/code><\/pre><p>В переменную markdown_text — вставляем наш текст, на выходе получаем сконвертированный текс в переменной<br \/>\negea_text<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/markdown-v-format-egei.png\" width=\"601\" height=\"575\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат выполнения, в разметке Эгея<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/fossko\/markdown_to_egea\">Скрипт на гитхабе<\/a><\/p>\n",
            "date_published": "2024-11-14T16:00:00+03:00",
            "date_modified": "2025-01-16T23:14:32+03:00",
            "tags": [
                "питон",
                "Эгея"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/markdown-v-format-egei.png",
            "_date_published_rfc2822": "Thu, 14 Nov 2024 16:00:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "568",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/markdown-v-format-egei.png"
                ]
            }
        },
        {
            "id": "510",
            "url": "https:\/\/blog.fossko.ru\/all\/transkribiruem-video-iz-telegrama\/",
            "title": "Транскрибируем видео из телеграма",
            "content_html": "<p>Когда требуется распознать видео с вебинара в телеграме, делаем следующее:<\/p>\n<ol start=\"1\">\n<li>Скачиваем видео к себе на компьютер<\/li>\n<li>Вытаскиваем аудиодорожку через ffmpeg<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">ffmpeg -i video1014957119.mp4 video1014957119.mp3<\/code><\/pre><ol start=\"3\">\n<li>Транскрибируем через <a href=\"\/all\/rasshifrovka-audio-i-video\/\">whisper-ctranslate2 в Гугл колаб<\/a><\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/whisper-ctranslate2-audio-to-text-bystry.ipynb---Colaboratory---Google-Chrome-2023-05-12-12.44.30.jpg\" width=\"920\" height=\"416\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Фрагмент вебинара SEO c Ильей Карбышевом: <a href=\"https:\/\/t.me\/irinausichenko\/865\" class=\"nu\">«<u>SEO для редакторов<\/u>»<\/a><\/div>\n<\/div>\n",
            "date_published": "2023-05-12T12:51:24+03:00",
            "date_modified": "2023-05-12T12:51:21+03:00",
            "tags": [
                "автоматизация",
                "питон",
                "транскрибация"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/whisper-ctranslate2-audio-to-text-bystry.ipynb---Colaboratory---Google-Chrome-2023-05-12-12.44.30.jpg",
            "_date_published_rfc2822": "Fri, 12 May 2023 12:51:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "510",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/whisper-ctranslate2-audio-to-text-bystry.ipynb---Colaboratory---Google-Chrome-2023-05-12-12.44.30.jpg"
                ]
            }
        },
        {
            "id": "508",
            "url": "https:\/\/blog.fossko.ru\/all\/rasshifrovka-audio-i-video\/",
            "title": "Расшифровка аудио и видео",
            "content_html": "<p>Когда требуется расшифровать аудиофайл, или ролик с ютуба, я пользуюсь whisper или whisper-ctranslate2 в среде <a href=\"https:\/\/colab.research.google.com\/\">Гугл колаб<\/a><\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"761\" data-ratio=\"1.4834307992203\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg\" width=\"761\" height=\"513\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.36.18.jpg\" width=\"711\" height=\"309\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">При использовании библиотеки whisper-ctranslate2 лучше использовать графическую карту — GPU. Меню → Среда выполнения → Сменить среду выполнения → GPU<\/div>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\"># установка оригинального whisper\n!pip install git+https:\/\/github.com\/openai\/whisper.git\n\n# установка ffmpeg\n!sudo apt update &amp;&amp; sudo apt install ffmpeg\n\n# установка whisper-ctranslate2\n!pip install -U whisper-ctranslate2\n\n# установка yt-dlp для сохранения видео с ютуба\n!pip install yt-dlp<\/code><\/pre><p>Двойной символ && используется для запуска двух команд одновременно, если первая команда завершена успешно. Это означает, что если первая команда возвращает ошибку, то вторая команда не будет выполнена.<\/p>\n<p><a href=\"https:\/\/github.com\/Softcatala\/whisper-ctranslate2\">Гитхаб whisper-ctranslate2<\/a><\/p>\n<p>С декабря 2023 года выдается ошибка: «RuntimeError: Library libcublas.so.11 is not found or cannot be loaded»<br \/>\nДля исправления ошибки установите Cuda 11 командой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">!apt install libcublas11<\/code><\/pre><p>Скачивать будем ролик Ильи Бирмана из лекции <a href=\"https:\/\/ilyabirman.ru\/meanwhile\/all\/understanding-the-task\/\">о понимании задачи<\/a><\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># качаем ролик id в mp3 в корень\n!yt-dlp -x --audio-format mp3 -o .\/birman_ponimanie_zadachi.mp3 -- PbnbwkoCQOE<\/code><\/pre><p>Распознавать можно whisper-ctranslate2 — по моим наблюдением расшифровывает в 2—3 раза быстрее чем оригинальный whisper.  На данный момент модель large-v2 самая полная.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#распознаем через whisper-ctranslate2\n!whisper-ctranslate2 &quot;birman_ponimanie_zadachi.mp3&quot; --language Russian  -o .\/result --model large-v2 --model_dir .\/model<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/rasshifrovka-audio-i-video.png\" width=\"749\" height=\"558\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат в консоле будет появляться по мере распознавания. Результирующие файлы будут в папке result в форматах .json, .srt, .tsv, .txt и .vtt. Например, в txt — только текст, в tsv — таймкоды, в vtt и srt — субтитры.<\/div>\n<\/div>\n<p>Через оригинальный whisper имеет смысл распознавать на компьютерах без видеокарт, это долго, но работает. Whisper требует версию питона 3.8—3.10, на других версиях не заработает.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#распознаем через оригинальный whisper\n!whisper &quot;iliahov2.mp3&quot; -o .\/result --model large-v2 --model_dir .\/model<\/code><\/pre><p class=\"loud\">Если вам нужно что-то распознать или транскрибацию провести. Пишите в телеграм, договоримся :—)<\/p>\n",
            "date_published": "2023-04-21T15:13:37+03:00",
            "date_modified": "2024-03-12T00:01:53+03:00",
            "tags": [
                "автоматизация",
                "питон",
                "транскрибация"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg",
            "_date_published_rfc2822": "Fri, 21 Apr 2023 15:13:37 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "508",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js",
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.36.18.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/rasshifrovka-audio-i-video.png"
                ]
            }
        },
        {
            "id": "507",
            "url": "https:\/\/blog.fossko.ru\/all\/vypolnyaem-sql-zapros-v-pitone\/",
            "title": "Выполняем SQL запрос в питоне",
            "content_html": "<p>В питоне можно выполнить запрос к базе данных на SQL сервере, а ответ получить как датасет пандос.<\/p>\n<p>Импортируем библиотеки, в примере мы будем подключаться к MS SQL серверу, но можно подключаться к другим базам данных, используя нужную библиотеку.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">import pyodbc\nimport pandas as pd<\/code><\/pre><p>В переменную con запишем подключение к SQL серверу<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># создание подключения к базе данных\ncon = pyodbc.connect(&quot;Driver={SQL Server Native Client 11.0};&quot;\n                      &quot;Server=NAME_SQL_SERVER;&quot;\n                      &quot;Database=NAME_BASE;&quot;\n                      &quot;Trusted_Connection=yes;&quot;)<\/code><\/pre><p>Функция select — для быстрой отправки sql запроса, на входе sql запрос, на выходе результат выполнения<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># функция отправки запроса к базе sql\ndef select(sql):\n    return pd.read_sql(sql,con)<\/code><\/pre><p>Используем тройные кавычки, для переноса построчно, иначе нужно писать в одну строку<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># Переменной sql присваиваем запрос\nsql=&#039;&#039;&#039;\n\nDECLARE\n@today DATE,\n@yesterday DATE\n\nSELECT\n@yesterday = DATEADD(day, -1, CAST(GETDATE() AS date))  --вчера в виде даты без времени\n,@today = CAST(GETDATE() AS date)  --сегодня в виде даты без времени\n\nSELECT \n  *  \nFROM table.data\n\nWHERE\n DataZvonka &lt;= @yesterday \n and\n DataPrihoda &gt;= @today\n\n&#039;&#039;&#039;<\/code><\/pre><p>Присваиваем датасету df, результат выполнения запроса sql<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># создание датасета с данными запроса\ndf=select(sql)<\/code><\/pre><p>Дальше можно производить вычисления в пандос, и делать что нужно с данными, например, записать в гугл таблицу, отправить в телеграм группу.<\/p>\n",
            "date_published": "2023-04-20T17:16:02+03:00",
            "date_modified": "2023-04-21T23:27:01+03:00",
            "tags": [
                "SQL",
                "автоматизация",
                "питон"
            ],
            "_date_published_rfc2822": "Thu, 20 Apr 2023 17:16:02 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "507",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "465",
            "url": "https:\/\/blog.fossko.ru\/all\/otpravlyaem-novye-statyi-iz-rss-v-telegram\/",
            "title": "Отправляем новые статьи из РСС в телеграм",
            "content_html": "<p>Удобно присылать новые ссылки на статьи моих подписок РСС в телеграм, так как вся коммуникация уже в нем, фидли почти не использую.<\/p>\n<p>Евгений Гончаров, в статье <a href=\"https:\/\/sys-adm.in\/programming\/805-rss-fider-na-python-s-opravkoj-uvedomlenij-v-telegram.html\" class=\"nu\">«<u>RSS фидер на Python с оправкой уведомлений в Телеграм<\/u>»<\/a> описал весь принцип отправки и использование базы данных для контроля что отправили. <a href=\"https:\/\/github.com\/m0zgen\/rss2bot\/blob\/master\/rss.py\">Готовый код на гитхабе Евгения<\/a><\/p>\n<p>Я внес небольшие изменения в код:<\/p>\n<ul>\n<li>Сообщения в телеграм отправляются с задержкой 1 секунда. Если не использовать таймаут, сервер телеграма, может отправить не все сообщения.<\/li>\n<li>Изменил вид отправки сообщений: добавил переносы строк и автора, если он есть.<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-5.png\" width=\"518\" height=\"904\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В канал телеграма приходят новые сообщения. Проверка РСС проходит с 7 утра до 11 вечера, с интервалом 30 минут.<\/div>\n<\/div>\n<p>Канал открытый, можно подписаться на <a href=\"https:\/\/t.me\/pochitaet\" class=\"nu\">«<u>Почитаем<\/u>»<\/a>, там 95 источников РСС: например, избранное блогов на Эгее, Илья Бирман, Максим Ильяхов, Николай Товеровский, и другие.<\/p>\n<p>В примере скрипта: блоги на Эгее и мой блог.<\/p>\n<p>Скрипт:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/python3\n# Created by Yevgeniy Goncharov, https:\/\/sys-adm.in\n# Script for reading and forwarding to Telegram, rss feeds\n\n\n# Imports\nimport sqlite3\nimport requests\nimport feedparser\nimport os\nimport urllib\nimport random\nimport time\n\n# Bot creds\nbot_token = &#039;bot_token&#039;\nbot_chatID = &#039;bot_chatID&#039;\n\n# Feeds\nmyfeeds = [\n    &#039;https:\/\/blogengine.ru\/blogs\/rss\/&#039;,\n    &#039;http:\/\/blog.fossko.ru\/rss\/&#039;,\n\n]\n\n# User agents\nuags = [\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/13.1.1 Safari\/605.1.15&#039;,\n  &#039;Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko\/20100101 Firefox\/77.0&#039;,\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/83.0.4103.97 Safari\/537.36&#039;,\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko\/20100101 Firefox\/77.0&#039;,\n  &#039;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/83.0.4103.97 Safari\/537.36&#039;,\n]\n\n# Random User Agent (from uags list)\nua = random.choice(uags)\n\n# Header\nheaders = {\n  &quot;Connection&quot; : &quot;close&quot;,  # another way to cover tracks\n  &quot;User-Agent&quot; : ua\n}\n\n# Proxies\nproxies = {\n}\n\n# DB\nscriptDir = os.path.dirname(os.path.realpath(__file__))\ndb_connection = sqlite3.connect(scriptDir + &#039;\/rss.sqlite&#039;)\ndb = db_connection.cursor()\ndb.execute(&#039;CREATE TABLE IF NOT EXISTS myrss (title TEXT, date TEXT)&#039;)\n\n# Get posts from DB and print\ndef get_posts():\n    with db_connection:\n        db.execute(&quot;SELECT * FROM myrss&quot;)\n       # print(db.fetchall())\n\n# Check post in DB\ndef article_is_not_db(article_title, article_date):\n    db.execute(&quot;SELECT * from myrss WHERE title=? AND date=?&quot;, (article_title, article_date))\n    if not db.fetchall():\n        return True\n    else:\n        return False\n\n# Add post to DB\ndef add_article_to_db(article_title, article_date):\n    db.execute(&quot;INSERT INTO myrss VALUES (?,?)&quot;, (article_title, article_date))\n    db_connection.commit()\n\n# Send notify to Telegram bot\ndef bot_sendtext(bot_message):\n    #bot_message = urllib.parse.quote(bot_message)\n    bot_message = bot_message\n    send_text = &#039;https:\/\/api.telegram.org\/bot&#039; + bot_token + &#039;\/sendMessage?chat_id=&#039; + bot_chatID + &#039;&amp;parse_mode=Markdown&amp;text=&#039; + bot_message\n    requests.get(send_text, proxies=proxies, headers=headers)\n    print(send_text)\n\n# Check, read articles\ndef read_article_feed(feed):\n    &quot;&quot;&quot; Get articles from RSS feed &quot;&quot;&quot;\n    feedparser.USER_AGENT = ua\n    feed = feedparser.parse(feed)\n    print(feed)\n    for article in feed[&#039;entries&#039;]:\n        if article_is_not_db(article[&#039;title&#039;], article[&#039;published&#039;]):\n            add_article_to_db(article[&#039;title&#039;], article[&#039;published&#039;])\n           # bot_sendtext(&#039;New feed found &#039; + article[&#039;title&#039;] +&#039;, &#039; + article[&#039;link&#039;] + &#039;, &#039; + article[&#039;description&#039;])\n            try:\n                rss_autor = article[&#039;author&#039;] +&#039;%0A%0A&#039;\n            except:\n                rss_autor = &quot;&quot;\n            MSGsend=&#039;*&#039;+ article[&#039;title&#039;] + &#039;*%0A%0A&#039; + rss_autor + article[&#039;link&#039;]\n            MSGsend=MSGsend.replace(&quot;_&quot;, &quot;\\_&quot;)  # замена подчеркивания для отправки в ТГ\n            bot_sendtext(MSGsend)            \n            time.sleep(1)\n           # print(article)\n\n# Rotate feeds array\ndef spin_feds():\n    for x in myfeeds:\n       # print(x)\n        read_article_feed(x)\n\n# Runner :)\nif __name__ == &#039;__main__&#039;:\n    spin_feds()\n    # get_posts()\n    db_connection.close()<\/code><\/pre>",
            "date_published": "2022-10-10T10:10:19+03:00",
            "date_modified": "2023-11-15T18:52:55+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "питон",
                "портфолио",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/image-5.png",
            "_date_published_rfc2822": "Mon, 10 Oct 2022 10:10:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "465",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/image-5.png"
                ]
            }
        },
        {
            "id": "456",
            "url": "https:\/\/blog.fossko.ru\/all\/kurs-nastroyka-python-dlya-raboty-s-dannymi\/",
            "title": "Курс «Настройка Python для работы с данными»",
            "content_html": "<p><a href=\"https:\/\/mailchi.mp\/d823cd1db54d\/python\">Настройка Python для работы с данными<\/a>  — бесплатный видео мини-курс от Алексея Куличевского, начал выходить в августе 2021 года. Курс в виде рассылки, письма приходят на почту.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Osnovy-raboty-s-komandnoy-strokoy---YouTube---Google-Chrome-2021-08-25-14.11.25.jpg\" width=\"1523\" height=\"802\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Алексей Куличевский рассказывает как пользоваться командной строкой, все на примере терминала мака. Если работаете в винде есть аналог, это cmd и PowerShell.<\/div>\n<\/div>\n<p>Совет от Алексея: На Windows команды могут отличаться, но их легко нагуглить запросом <название команды> windows. Например, «ls windows».<\/p>\n<p>В курсе будут темы: установка Python и настройка виртуальных окружений, выбор и настройка редактора кода, основы работы c git и github, типовая структура проекта<\/p>\n<p>Всего 6 писем, можно пройти за пару вечеров.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/QgWtf1cz7MM?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Основы работы с командной строкой<\/div>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/oqOT-a2iikw?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Устанавливаем Python, настраиваем виртуальные окружения<\/div>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/6mxnH0JFMVQ?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Редакторы кода<\/div>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/HL1QmInke7M?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Системы контроля версий, Git и Github<\/div>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/upG7Tint1_0?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Типовая структура проекта<\/div>\n<\/div>\n<p><a href=\"https:\/\/www.youtube.com\/playlist?list=PL2PN33KbuWfz6o9TgDaVvAs7w9JaRD6x0\">Весь плейлист<\/a><\/p>\n<p>Алексей анонсировал курс — <a href=\"https:\/\/mailchi.mp\/cca4513bb958\/ddlvgo33yv\">Python для маркетологов и продактов<\/a>, сейчас можно подписаться на рассылку и получать демо-уроки.<\/p>\n",
            "date_published": "2021-08-26T12:11:21+03:00",
            "date_modified": "2023-03-31T22:55:33+03:00",
            "tags": [
                "курсы",
                "обучение",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Osnovy-raboty-s-komandnoy-strokoy---YouTube---Google-Chrome-2021-08-25-14.11.25.jpg",
            "_date_published_rfc2822": "Thu, 26 Aug 2021 12:11:21 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "456",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Osnovy-raboty-s-komandnoy-strokoy---YouTube---Google-Chrome-2021-08-25-14.11.25.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-QgWtf1cz7MM-cover.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-oqOT-a2iikw-cover.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-6mxnH0JFMVQ-cover.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-HL1QmInke7M-cover.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-upG7Tint1_0-cover.jpg"
                ]
            }
        },
        {
            "id": "446",
            "url": "https:\/\/blog.fossko.ru\/all\/avtorizaciya-na-sayte-cherez-piton\/",
            "title": "Авторизация на сайте через питон",
            "content_html": "<p>По материалам статьи: <a href=\"https:\/\/gadjimuradov.ru\/post\/python-requests-avtorizaciya-na-sajte\/\">Python requests. Авторизация на сайте<\/a><\/p>\n<p>Я описал <a href=\"\/all\/parsing-saytov-cherez-piton\/\">как парсить сайты через модуль requests<\/a>. Бывают случаи когда для части сайта нужна авторизация, то есть логин и пароль.<\/p>\n<p>Для авторизации нужно поддерживать активную сессию в модуле requests, через session.get()<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg\" width=\"377\" height=\"120\" alt=\"\" \/>\n<div class=\"e2-text-caption\">session.get(url) вместо requests.get(url)<\/div>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">import requests\nimport re\nfrom bs4 import BeautifulSoup\nimport pandas as pd\n\nurl = &#039;https:\/\/freelance.ru\/login\/&#039;\n\n# Важно. По умолчанию requests отправляет вот такой \n# заголовок &#039;User-Agent&#039;: &#039;python-requests\/2.22.0 ,  а это приводит к тому , что Nginx\n# отправляет 404 ответ. Поэтому нам нужно сообщить серверу, что запрос идет от браузера  \n\nuser_agent_val = &#039;Mozilla\/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/88.0.4324.104 Safari\/537.36&#039;\n\n# Создаем сессию и указываем ему наш user-agent\nsession = requests.Session()\nr = session.get(url, headers = {\n    &#039;User-Agent&#039;: user_agent_val\n})\n\n# Указываем referer. Иногда , если не указать , то приводит к ошибкам. \nsession.headers.update({&#039;Referer&#039;:url})<\/code><\/pre><p>В оригинальной статье было снимание куков, я не совсем понимаю когда использовать. В данном скрипе, я это не использую.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">_xsrf = session.cookies.get(&#039;_xsrf&#039;, domain=&quot;.freelance.ru&quot;)<\/code><\/pre><p>Дальше посылаем post-запрос<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">login = &quot;xxxx&quot;\npasswd = &quot;xxxx&quot;\n\npost_request = session.post(url, {\n    &#039;login&#039;: login ,\n    &#039;passwd&#039;: passwd,\n    &quot;check_ip&quot;: &quot;on&quot;,\n    &quot;submit&quot;: &quot;%C2%F5%EE%E4&quot;,\n    &quot;auth&quot;: &quot;auth&quot;,\n    &quot;return_url&quot;: &quot;\/login\/&quot;\n})<\/code><\/pre><p>Для того чтобы узнать пост запрос, нужно зайти в инспектор кода, вкладка сеть, и найти запрос который посылается<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"638\" data-ratio=\"0.70419426048565\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.13.34.jpg\" width=\"638\" height=\"906\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.14.23.jpg\" width=\"615\" height=\"880\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">В submit я подставил значение из не декодированного вида.<\/div>\n<\/div>\n<p>Теперь переходим в закрытый раздел, обновляем сессию и снимаем данные<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &quot;https:\/\/freelance.ru\/setup\/&quot;\nr = session.get(url)\nsoup = BeautifulSoup(r.text, &quot;lxml&quot;)\nsoup<\/code><\/pre><div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"744\" data-ratio=\"3.7766497461929\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.07.28.jpg\" width=\"744\" height=\"197\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-15.07.44.jpg\" width=\"462\" height=\"285\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Мой рейтинг на этом сервисе.<\/div>\n<\/div>\n<p>Дальше можно снимать нужную информацию, <a href=\"\/all\/parsing-saytov-cherez-piton\/\">используя BeautifulSoup<\/a><\/p>\n<p>Для библиотеки Requests, есть хорошие статьи от Александра, pythonru<\/p>\n<p><a href=\"https:\/\/pythonru.com\/biblioteki\/kratkoe-rukovodstvo-po-biblioteke-python-requests\">Краткое руководство по библиотеке Python Requests<\/a> — рассказывает кратко, как пользоваться библиотекой.<\/p>\n<p><a href=\"https:\/\/pythonru.com\/biblioteki\/prodvinutoe-rukovodstvo-po-biblioteke-python-requests\">Продвинутое руководство по библиотеке Python Requests<\/a> — дополнительная информация, по объектам session, сертификатам SSL, прокси.<\/p>\n",
            "date_published": "2021-02-05T15:11:29+03:00",
            "date_modified": "2022-11-21T11:28:46+03:00",
            "tags": [
                "аналитика",
                "парсинг",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg",
            "_date_published_rfc2822": "Fri, 05 Feb 2021 15:11:29 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "446",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.13.34.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.14.23.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.07.28.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-15.07.44.jpg"
                ]
            }
        },
        {
            "id": "443",
            "url": "https:\/\/blog.fossko.ru\/all\/parsing-saytov-cherez-piton-modulem-selenium\/",
            "title": "Парсинг сайтов через питон модулем selenium",
            "content_html": "<p>Работа идет через модуль selenium, для него нужно скачать <a href=\"https:\/\/chromedriver.chromium.org\/downloads\"> Chrome driver<\/a> и браузер Chrome.<br \/>\nВажно чтобы версия  браузера и Chrome driver была одна и та же<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"779\" data-ratio=\"2.2449567723343\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Nastroyki-O-brauzere-Chrome---Google-Chrome-2021-01-22-16.29.14.jpg\" width=\"779\" height=\"347\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Downloads---ChromeDriver---WebDriver-for-Chrome---Google-Chrome-2021-01-22-16.29.42.jpg\" width=\"745\" height=\"390\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Версию браузера смотрим Справка → О браузере, и сверяемся с версией хром драйвер.<\/div>\n<\/div>\n<p>Чтобы точно быть уверенным, что все работает установите библиотеку selenium, импортируйте ее и запустите браузер через хром драйвер.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">pip install selenium\nfrom selenium.webdriver import Chrome\nbrowser = Chrome (&quot;d:\\del\\chromedriver_win32\\chromedriver.exe&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.34.08.jpg\" width=\"755\" height=\"246\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/data_,---Google-Chrome-2021-01-22-16.35.27.jpg\" width=\"822\" height=\"669\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Если все корректно, запускается хром в режиме: «Браузером управляет тестовое ПО»<\/div>\n<\/div>\n<p>В тестовом браузере будут выполнятся все команды.<\/p>\n<p>Импортируем необходимые библиотеки<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">from selenium.webdriver import Chrome\nfrom selenium.webdriver.common.keys import Keys\nfrom selenium.webdriver.support.ui import WebDriverWait as wait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom selenium.common.exceptions import NoSuchElementException\nfrom bs4 import BeautifulSoup\nfrom time import sleep<\/code><\/pre><p>Переход на сайт<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &quot;https:\/\/bus.gov.ru\/registry&quot;\nbrowser.get(url)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.38.35.jpg\" width=\"1131\" height=\"605\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В тестовом браузере открылся сайт <a href=\"https:\/\/bus.gov.ru\/registry\">https:\/\/bus.gov.ru\/registry<\/a><\/div>\n<\/div>\n<p>Нужно ввести в строке поиска «онкологический диспансер»<\/p>\n<p>Способ 1<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">input_el = browser.find_element_by_tag_name(&quot;input&quot;)\ninput_el.send_keys(&quot;онкологический диспансер&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.08.jpg\" width=\"951\" height=\"488\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Вводится наименование в поле <i>input<\/i><\/div>\n<\/div>\n<p>Нажать энтер или кнопку найти.<\/p>\n<p>Нажатие кнопки энтер:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">input_el.send_keys(Keys.ENTER)<\/code><\/pre><p>Нажатие кнопки найти:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">browser.find_element_by_xpath(&quot;\/html\/body\/div[2]\/ui-view\/form\/div[2]\/div\/div[2]\/div\/button&quot;).click()<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.33.jpg\" width=\"1110\" height=\"448\" alt=\"\" \/>\n<div class=\"e2-text-caption\">После выполнения кода браузер ищет диспансеры<\/div>\n<\/div>\n<p>Дальше работаем как <a href=\"\/all\/parsing-saytov-cherez-piton\/\">при простом парсинге сайта<\/a><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">soup = BeautifulSoup(browser.page_source, &quot;lxml&quot;)\nsoup<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.51.45.jpg\" width=\"1102\" height=\"324\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В переменной <i>soup<\/i> вся текущая страница<\/div>\n<\/div>\n<p>Смотрим где содержится название учреждения и ссылка на него<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">soup.find (&quot;a&quot;, class_=&quot;result__button&quot;).get(&quot;href&quot;)\nsoup.find(&quot;a&quot;,class_=&quot;result__title&quot;).text<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.53.27.jpg\" width=\"1137\" height=\"220\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Для получения части ссылки используем запрос <i>get<\/i>, для названия <i>text<\/i><\/div>\n<\/div>\n<p>Чтобы не искать по всей странице, можно оставить информацию которая нам нужна, она содержится к контейнере c классом <i>results<\/i><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">orgs=soup.findAll(&quot;div&quot;,class_=&quot;result&quot;)\norgs<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.55.56.jpg\" width=\"1019\" height=\"390\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Содержимое всех контейнеров <i>result<\/i><\/div>\n<\/div>\n<p>Обработка текущей страницы<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">data = []\nfor el in orgs:\n    name = el.find(&quot;a&quot;, class_=&quot;result__title&quot;).text\n    link = &quot;https:\/\/bus.gov.ru\/registry&quot; + el.find(&quot;a&quot;, class_=&quot;result__button&quot;).get(&quot;href&quot;)\n    #print (name, link)\n    data.append([name,link])\ndata<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.57.40.jpg\" width=\"1112\" height=\"373\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Названия учреждений и ссылка на страницу с описанием<\/div>\n<\/div>\n<p>Нужно нажимать на страницу «следующая»<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">next_button = browser.find_element_by_class_name(&quot;pagination__next&quot;)\nnext_button.click()<\/code><\/pre><p>Код нажимает на элемент с классом <i>pagination__next<\/i><\/p>\n<p>Готовый код для сбора всей информации<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &#039;https:\/\/bus.gov.ru\/registry&#039;\nbrowser.get(url)\nsleep(5)\ninput_el = browser.find_element_by_tag_name(&#039;input&#039;)\ninput_el.send_keys(&#039;онкологический диспансер&#039;)\ninput_el.send_keys(Keys.ENTER)\nsleep(5)\n\ndata = []\n\n\nfor i in range(10):\n    \n    soup = BeautifulSoup(browser.page_source, &quot;lxml&quot;)\n    orgs = soup.findAll(&#039;div&#039;, class_=&#039;result&#039;)\n    \n    for el in orgs:\n        name = el.find(&#039;a&#039;, class_=&#039;result__title&#039;).text\n        link = &quot;https:\/\/bus.gov.ru&quot;+el.find(&#039;a&#039;, class_=&#039;result__button&#039;).get(&#039;href&#039;)\n        print(name, link)\n        \n\n        data.append([name, link])\n        \n    print(len(data))\n    try:\n        next_button = browser.find_element_by_class_name(&#039;pagination__next&#039;)\n        next_button.click()\n    except NoSuchElementException:\n        continue\n    sleep(6)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-17.01.04.jpg\" width=\"1138\" height=\"457\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Все данные попадают в таблицу <i>data<\/i>, в ней столбец с наименованием и ссылка<\/div>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/xhEhlyFn1vM?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Подробный вебинар про модуль selenium, используется <a href=\"https:\/\/www.anaconda.com\/products\/individual\">среда разработки Анаконда<\/a> с модулем Юпитер. Во второй части парсится сайт с судебными решениями.<\/div>\n<\/div>\n",
            "date_published": "2021-01-22T17:03:17+03:00",
            "date_modified": "2023-11-15T18:52:30+03:00",
            "tags": [
                "аналитика",
                "парсинг",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Nastroyki-O-brauzere-Chrome---Google-Chrome-2021-01-22-16.29.14.jpg",
            "_date_published_rfc2822": "Fri, 22 Jan 2021 17:03:17 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "443",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js",
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Nastroyki-O-brauzere-Chrome---Google-Chrome-2021-01-22-16.29.14.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Downloads---ChromeDriver---WebDriver-for-Chrome---Google-Chrome-2021-01-22-16.29.42.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.34.08.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/data_,---Google-Chrome-2021-01-22-16.35.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.38.35.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.08.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.33.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.51.45.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.53.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.55.56.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.57.40.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-17.01.04.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-xhEhlyFn1vM-cover.jpg"
                ]
            }
        },
        {
            "id": "442",
            "url": "https:\/\/blog.fossko.ru\/all\/parsing-saytov-cherez-piton\/",
            "title": "Парсинг сайтов через питон",
            "content_html": "<p>Устанавливаем и импортируем библиотеки в питон<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">pip install requests\npip install pandas\nimport requests\nfrom bs4 import BeautifulSoup\nimport pandas as pd\nfrom time import sleep<\/code><\/pre><p>Переменной <i>url<\/i> присваиваем  ссылку на страницу кинопоиска, в переменную <i>r<\/i> результат гет запроса к этой странице<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &quot;https:\/\/www.kinopoisk.ru\/s\/type\/film\/list\/1\/find\/%F1%E5%EA%F1\/&quot;\nr = requests.get(url)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.53.48.jpg\" width=\"1162\" height=\"429\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Текстовое содержимое страницы сайта — <i>r.text<\/i><\/div>\n<\/div>\n<p>Переведем содержимое страницы в формат кода<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">soup = BeautifulSoup(r.text, &quot;lxml&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.56.04.jpg\" width=\"1147\" height=\"412\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Содержимое переменной — <i>soup<\/i><\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Rezultaty-poiska-(922)---Google-Chrome-2021-01-21-13.01.03.jpg\" width=\"1629\" height=\"461\" alt=\"\" \/>\n<div class=\"e2-text-caption\">При помощи инспектора кода находим контейнеры с названием фильма, годом, названием на языке оригинала и баллом кинопоиска<\/div>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">russian_name = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;, class_ = &quot;js-serp-metrika&quot;).text\nrussian_name\noriginal_name = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;span&#039;, class_ = &quot;gray&quot;).text\noriginal_name\nyear = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;span&#039;, class_ = &quot;year&quot;).text\nyear\nkinopoisk = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;div&#039;, class_ = &quot;rating&quot;).text\nkinopoisk<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.04.12.jpg\" width=\"1150\" height=\"475\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Все данные по первому фильму встречающемуся на странице<\/div>\n<\/div>\n<p>Находим контейнер с кусочком кода и генерируем ссылку на фильм<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">link = &quot;https:\/\/www.kinopoisk.ru&quot; +soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;).get(&quot;data-url&quot;)\nlink<\/code><\/pre><div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1253\" data-ratio=\"9.7890625\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.06.27.jpg\" width=\"1253\" height=\"128\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.08.59.jpg\" width=\"1121\" height=\"164\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Готовая ссылка на фильм и контейнер содержащий ссылку<\/div>\n<\/div>\n<p>Можно составить код, который сделает таблицу, содержащую все фильмы с данной таблицы<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">data = []\nfilms =soup.findAll(&quot;div&quot;,class_ = &quot;element&quot;)\nfor film in films:\n    russian_name = film.find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;, class_ = &quot;js-serp-metrika&quot;).text\n    original_name = film.find(&#039;span&#039;, class_ = &quot;gray&quot;).text\n    \n    try:\n        year = film.find(&#039;span&#039;, class_ = &quot;year&quot;).text\n    except:\n        year = &quot;&quot;\n    \n    try:\n        kinopoisk = film.find(&#039;div&#039;, class_ = &quot;rating&quot;).text\n    except:\n        kinopoisk = &quot;&quot;\n    \n    link = &quot;https:\/\/www.kinopoisk.ru&quot; +film.find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;).get(&quot;data-url&quot;)\n  \n    #print (russian_name)\n    #print (original_name)\n    #print (year)\n    #print (kinopoisk)\n    #print (link)\n    data.append([russian_name, original_name,year,kinopoisk,link  ])<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.12.30.jpg\" width=\"1015\" height=\"439\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Содержимое таблицы <i>data<\/i><\/div>\n<\/div>\n<p>Мы можем собрать все фильмы с одной страницы. Теперь нужно сделать цикл для сбора со всех страниц данного раздела. В этом разделе 11 страниц, значит нужен цикл для формирования списка страниц<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">for page in range(1,12):\n    url = f&quot;https:\/\/www.kinopoisk.ru\/s\/type\/film\/list\/1\/find\/%F1%E5%EA%F1\/order\/relevant\/page\/{str(page)}\/&quot;\n    print(url)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.15.33.jpg\" width=\"1030\" height=\"328\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат выполнения цикла <i>for<\/i> с полученными страницами<\/div>\n<\/div>\n<p>Теперь можно дополнить весь код. Не забываем про слип, так как на многих сайтах стоит защита от парсинга<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">data = []\n\nfor page in range(1,12):\n    url = f&quot;https:\/\/www.kinopoisk.ru\/s\/type\/film\/list\/1\/find\/%F1%E5%EA%F1\/order\/relevant\/page\/{str(page)}\/&quot;\n    print(url)\n    \n    r = requests.get(url)\n    sleep(40)\n    soup = BeautifulSoup(r.text, &quot;lxml&quot;)\n    \n    films = soup.findAll(&quot;div&quot;, class_ =&quot;element&quot;)\n\n    for film in films:\n        \n        russian_name = film.find(&quot;div&quot;, class_=&quot;info&quot;).find(&quot;a&quot;).text\n       # print(russian_name)\n    \n        original_name = film.find(&quot;div&quot;, class_=&quot;info&quot;).find(&quot;span&quot;, class_=&quot;gray&quot;).text\n    \n        year = film.find(&quot;span&quot;, class_=&quot;year&quot;).text\n\n        try:\n            year = film.find(&quot;div&quot;, class_= &quot;span&quot;).text\n        except:\n            year = &quot;&quot;\n        \n        try:\n            rate = film.find(&quot;div&quot;, class_= &quot;rating&quot;).text\n        except:\n            rate = &quot;&quot;\n    \n        link = &quot;https:\/\/www.kinopoisk.ru&quot;+film.find(&quot;div&quot;, class_=&quot;info&quot;).find(&quot;a&quot;).get(&quot;data-url&quot;)\n    \n        data.append([russian_name, original_name, year, link])<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.18.07.jpg\" width=\"1000\" height=\"304\" alt=\"\" \/>\n<div class=\"e2-text-caption\">По мере прохождения страниц, будут печатаются страницы на которых находится сейчас робот<\/div>\n<\/div>\n<p>Делаем заголовки таблицы и выгружаем в файл csv<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">header = [&#039;russian_name&#039;, &#039;original_name&#039;, &#039;year&#039;, &#039;link&#039;]\ndf = pd.DataFrame(data, columns = header)\ndf.head()\n\ndf.to_csv(&quot;d:\\data_kino.csv&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.21.39.jpg\" width=\"1100\" height=\"372\" alt=\"\" \/>\n<div class=\"e2-text-caption\">получившаяся таблица с выгрузкой<\/div>\n<\/div>\n<p>Можно и в питоне получить список всех ссылок на фильмы, работая с таблицей<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">for i in data:\n    #print (i)\n    link = i[3]\n    print (link)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.23.49.jpg\" width=\"625\" height=\"357\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/ZhTf6NIVLEU?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Вебинар курса «Веб-скрейпинг для журналистов. С программированием и без». Используется среда разработки <a href=\"https:\/\/www.anaconda.com\/products\/individual\">Анаконда<\/a>.<\/div>\n<\/div>\n",
            "date_published": "2021-01-21T13:25:45+03:00",
            "date_modified": "2023-11-15T18:53:07+03:00",
            "tags": [
                "аналитика",
                "парсинг",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.53.48.jpg",
            "_date_published_rfc2822": "Thu, 21 Jan 2021 13:25:45 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "442",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.53.48.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.56.04.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Rezultaty-poiska-(922)---Google-Chrome-2021-01-21-13.01.03.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.04.12.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.06.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.08.59.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.12.30.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.15.33.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.18.07.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.21.39.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.23.49.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-ZhTf6NIVLEU-cover.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}