<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Заметки — Игорь К.: заметки с тегом питон</title>
<link>https://blog.fossko.ru/tags/piton/</link>
<description>Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171)</generator>

<itunes:subtitle>Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>API от платформы vc.ru</title>
<guid isPermaLink="false">569</guid>
<link>https://blog.fossko.ru/all/api-ot-platformy-vc-ru/</link>
<pubDate>Mon, 18 Nov 2024 23:27:05 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/api-ot-platformy-vc-ru/</comments>
<description>
&lt;p&gt;На ВиСи можно получить список статей определенного пользователя используя скрытый апи.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/Jc7Hp953xg8?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Что такое скрытый апи и как его найти, рассказывает Алексей Куличевский&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;На виси есть скрытый апи, находящийся по адресу&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;https://api.vc.ru/v2.8/&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="879" data-ratio="3.0102739726027"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru.png" width="879" height="292" alt="" /&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-1.png" width="540" height="191" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Ищется скрытый апи через консоль разработчика, в гугл хроме нажимаем ctrl+shift+С — переходим в вкладку Network&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Для получения последний опубликованных статей пользователя&lt;br /&gt;
нужны следующие параметры отправляемые в гет запросе:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;markdown: false&lt;/b&gt; — как отдаются статьи, на практике у меня всегда отдаются в html, не важно что стоит true или false&lt;/li&gt;
&lt;li&gt;&lt;b&gt;sorting: new&lt;/b&gt; — сортировка, можно использовать несколько видов: ’new’, ’hotness’, ’day’, ’week’, ’month’, ’year’, ’all’&lt;br /&gt;
&lt;b&gt;lastId: 1628356&lt;/b&gt; — с какого последнего айдишника статьи продолжать показ, в получаемом джайсоне выводятся 12 элементов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;lastSortingValue: 1730444607&lt;/b&gt; — я не разобрался что это за параметр, без него работает корректно&lt;/li&gt;
&lt;li&gt;&lt;b&gt;subsitesIds: 287399&lt;/b&gt; — ай-ди пользователя статьи которого нам нужны&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Гет запрос отправляем на адрес&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;https://api.vc.ru/v2.8/timeline&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-3.png" width="909" height="516" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Результат выполнения гет запроса — нам нужны поля id — айди статьи, title — название статьи, дата и дата модификации — дата время в виде временной метки UNIX (число секунд, прошедших с 1 января 1970 года)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Код на питоне, для получения последних 12 статей опубликованных пользователем&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import requests
import json
import datetime

url=&amp;quot;https://api.vc.ru&amp;quot;
v_api=&amp;quot;/v2.8/&amp;quot;
metod=&amp;quot;timeline&amp;quot;
all_url=url+v_api+metod

markdown=&amp;quot;true&amp;quot;
subsitesIds=&amp;quot;287399&amp;quot;
sorting= &amp;quot;new&amp;quot;

params = {&amp;quot;markdown&amp;quot;: markdown,
          &amp;quot;sorting&amp;quot;: sorting, 
          &amp;quot;subsitesIds&amp;quot;: subsitesIds}

response=requests.get(all_url, params=params)

data = response.json()
items = data[&amp;#039;result&amp;#039;][&amp;#039;items&amp;#039;]
for index, item in enumerate(items):
        item_data = item[&amp;#039;data&amp;#039;]        
        print(f&amp;quot;Элемент {index + 1}:&amp;quot;)
        print(f&amp;quot;ID: {item_data[&amp;#039;id&amp;#039;]}&amp;quot;)
        print(f&amp;quot;url: https://vc.ru/{item_data[&amp;#039;id&amp;#039;]}&amp;quot;)
        print(f&amp;quot;Title: {item_data[&amp;#039;title&amp;#039;]}&amp;quot;)
        print(f&amp;quot;дата публикации: {datetime.datetime.fromtimestamp(item_data[&amp;#039;date&amp;#039;])}&amp;quot;)
        print(f&amp;quot;дата модификации: {datetime.datetime.fromtimestamp(item_data[&amp;#039;dateModified&amp;#039;])}&amp;quot;)  
        print()&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-2.png" width="526" height="439" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Результат выполнения, если нам нужно собрать все страницы, то необходимо в параметрах передавать lastId — последний в списке айди статьи, тогда следующие будут начиная с этого ай-ди.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/alexpervushin/vcru-api/blob/main/vcru_api/sync_wrapper.py"&gt;У Александра Первушина на гитхабе проект vcru-api&lt;/a&gt;, где опубликовано описание других методов, с помощью которых можно получить другие сведения, например комментарии к статье — метод comments, текст статьи — метод content&lt;/p&gt;
&lt;p&gt;Нашлась документация по API vc.ru, dtf.ru&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://komitet.notion.site/API-TJ-vc-ru-DTF-3f5162d2cb184f6381ff82c085bbb3c0"&gt;API основы ВиСи&lt;/a&gt; — докумет в ноушене, может быть полезен&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmtt-ru.github.io/osnova-api/v1/swagger.html#/"&gt;Описание версии апи 1.9&lt;/a&gt; —  Основа api api.yaml, общая страница на гитхабе&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmtt-ru.github.io/osnova-api/swaggerui/index.html?urls.primaryName=v2.31"&gt;Описание версии апи 2.31&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-4.png" width="666" height="263" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Не забывайте выбрать какой апи вы будете смотреть, в списке есть версия 2.31, на ноябрь 2024 года, используется версия 2.8&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-5.png" width="797" height="931" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Дополнительные параметры которые можно посмотреть в методе timeline, оказывается можно передать несколько пользователей через запятую&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Анализ пользователей vc.ru&lt;/h2&gt;
&lt;p&gt;На основании полученных данных можно провести анализ публикаций пользователей.&lt;br /&gt;
Например, &lt;a href="https://vc.ru/u/283507-tanya-bobrova"&gt;пользователь Татьяна Боброва&lt;/a&gt; — с 15 апреля 2019 года по 22 ноября 2024 года опубликовала 5682 записи.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-6.png" width="993" height="710" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Тепловая карта количества постов по дням недели и часам публикации &lt;a href="https://vc.ru/u/283507-tanya-bobrova"&gt;пользователь Татьяна Боброва&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-7.png" width="1001" height="710" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Тепловая карта общего количества реакций по дням недели и часам публикации &lt;a href="https://vc.ru/u/283507-tanya-bobrova"&gt;пользователь Татьяна Боброва&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/api-ot-platformy-vc-ru-8.png" width="1010" height="710" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Тепловая карта общего количества комментариев по дням недели и часам публикации &lt;a href="https://vc.ru/u/283507-tanya-bobrova"&gt;пользователь Татьяна Боброва&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Маркдаун в формат Эгеи</title>
<guid isPermaLink="false">568</guid>
<link>https://blog.fossko.ru/all/markdown-v-format-egei/</link>
<pubDate>Thu, 14 Nov 2024 16:00:00 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/markdown-v-format-egei/</comments>
<description>
&lt;p&gt;&lt;a href="https://docs.google.com/document/d/1uLYj2bE2KltgDV8EoeYVbL0Zn1EWuDcFBuoqWPuRack/edit?tab=t.0#heading=h.bjhhm3n452q1"&gt;Эгея использует свой синтаксис&lt;/a&gt;, очень похожий на Markdown.&lt;/p&gt;
&lt;p&gt;Иногда требуется опубликовать заметку которая сохранена в маркдаун разметке, например гугл документ можно экспортировать в маркдаун.&lt;/p&gt;
&lt;p&gt;Для этого можно использовать скрипт на питоне&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import re

def convert_to_egea(markdown_text):
    # Convert headers
    egea_text = re.sub(r&amp;#039;^### (.*)$&amp;#039;, r&amp;#039;### \1&amp;#039;, markdown_text, flags=re.MULTILINE)
    egea_text = re.sub(r&amp;#039;^## (.*)$&amp;#039;, r&amp;#039;## \1&amp;#039;, egea_text, flags=re.MULTILINE)
    egea_text = re.sub(r&amp;#039;^# (.*)$&amp;#039;, r&amp;#039;# \1&amp;#039;, egea_text, flags=re.MULTILINE)
    
    # Convert bold (leave as is)
    # Make sure to selectively replace *italic* with //italic// by considering ___not both_bold and italic___
    egea_text = re.sub(r&amp;#039;\*\*(.*?)\*\*&amp;#039;, r&amp;#039;**\1**&amp;#039;, egea_text)
    
    # Convert italic
    egea_text = re.sub(r&amp;#039;(?&amp;lt;!\*)\*(?!\*)(.*?)\*(?!\*)(?&amp;lt;!\*)&amp;#039;, r&amp;#039;//\1//&amp;#039;, egea_text)
    
    # Convert strikethrough (leave as is)
    egea_text = re.sub(r&amp;#039;~~(.*?)~~&amp;#039;, r&amp;#039;--\1--&amp;#039;, egea_text)
    
    # Convert links
    egea_text = re.sub(r&amp;#039;\[(.*?)\]\((.*?)\)&amp;#039;, r&amp;#039;((\2 \1))&amp;#039;, egea_text)
    
    # Convert blockquotes
    egea_text = re.sub(r&amp;#039;^&amp;gt; (.*)$&amp;#039;, r&amp;#039;&amp;gt; \1&amp;#039;, egea_text, flags=re.MULTILINE)
    
    # Convert unordered lists
    egea_text = re.sub(r&amp;#039;^\* (.*)$&amp;#039;, r&amp;#039;- \1&amp;#039;, egea_text, flags=re.MULTILINE)
    
    # Convert ordered lists
    egea_text = re.sub(r&amp;#039;^\d+\. (.*)$&amp;#039;, r&amp;#039;1. \1&amp;#039;, egea_text, flags=re.MULTILINE)
    
    # Convert images
    egea_text = re.sub(r&amp;#039;!\[(.*?)\]\((.*?)\)&amp;#039;, r&amp;#039;\2 \1&amp;#039;, egea_text)

    # Convert tables
    egea_text = re.sub(
        r&amp;#039;((?:\|.*\|\n)+)&amp;#039;, 
        lambda match: f&amp;quot;-----\n{match.group(1)}-----\n&amp;quot;, 
        egea_text
    )
  
    return egea_text

# Usage example:
markdown_text = &amp;quot;&amp;quot;&amp;quot;
# Заголовок первого уровня

## Заголовок второго уровня

### Заголовок третьего уровня

**Жирный текст**

*Курсивный текст*

~~Зачеркнутый текст~~

[Ссылка](http://example.com)

&amp;gt; Цитата

- Элемент ненумерованного списка

1. Элемент нумерованного списка

![Изображение](http://example.com/image.jpg)

**Основные выводы и тезисы мастер-класса Максима Ильяхова о соцсетях**

| Покупка | Ссылка в шапке Кнопка продажи Директ |
| one | two | three |
| 1 | 2 | 3 |
| raz | dva | tri |
| un | deux | trois |
&amp;quot;&amp;quot;&amp;quot;

egea_text = convert_to_egea(markdown_text)
print(egea_text)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В переменную markdown_text — вставляем наш текст, на выходе получаем сконвертированный текс в переменной&lt;br /&gt;
egea_text&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/markdown-v-format-egei.png" width="601" height="575" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Результат выполнения, в разметке Эгея&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/fossko/markdown_to_egea"&gt;Скрипт на гитхабе&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Транскрибируем видео из телеграма</title>
<guid isPermaLink="false">510</guid>
<link>https://blog.fossko.ru/all/transkribiruem-video-iz-telegrama/</link>
<pubDate>Fri, 12 May 2023 12:51:24 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/transkribiruem-video-iz-telegrama/</comments>
<description>
&lt;p&gt;Когда требуется распознать видео с вебинара в телеграме, делаем следующее:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Скачиваем видео к себе на компьютер&lt;/li&gt;
&lt;li&gt;Вытаскиваем аудиодорожку через ffmpeg&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ffmpeg -i video1014957119.mp4 video1014957119.mp3&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Транскрибируем через &lt;a href="/all/rasshifrovka-audio-i-video/"&gt;whisper-ctranslate2 в Гугл колаб&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Фрагмент вебинара SEO c Ильей Карбышевом: &lt;a href="https://t.me/irinausichenko/865" class="nu"&gt;«&lt;u&gt;SEO для редакторов&lt;/u&gt;»&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Расшифровка аудио и видео</title>
<guid isPermaLink="false">508</guid>
<link>https://blog.fossko.ru/all/rasshifrovka-audio-i-video/</link>
<pubDate>Fri, 21 Apr 2023 15:13:37 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/rasshifrovka-audio-i-video/</comments>
<description>
&lt;p&gt;Когда требуется расшифровать аудиофайл, или ролик с ютуба, я пользуюсь whisper или whisper-ctranslate2 в среде &lt;a href="https://colab.research.google.com/"&gt;Гугл колаб&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="761" data-ratio="1.4834307992203"&gt;
&lt;img src="https://blog.fossko.ru/pictures/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg" width="761" height="513" alt="" /&gt;
&lt;img src="https://blog.fossko.ru/pictures/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.36.18.jpg" width="711" height="309" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;При использовании библиотеки whisper-ctranslate2 лучше использовать графическую карту — GPU. Меню → Среда выполнения → Сменить среду выполнения → GPU&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# установка оригинального whisper
!pip install git+https://github.com/openai/whisper.git

# установка ffmpeg
!sudo apt update &amp;amp;&amp;amp; sudo apt install ffmpeg

# установка whisper-ctranslate2
!pip install -U whisper-ctranslate2

# установка yt-dlp для сохранения видео с ютуба
!pip install yt-dlp&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Двойной символ &amp;&amp; используется для запуска двух команд одновременно, если первая команда завершена успешно. Это означает, что если первая команда возвращает ошибку, то вторая команда не будет выполнена.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Softcatala/whisper-ctranslate2"&gt;Гитхаб whisper-ctranslate2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;С декабря 2023 года выдается ошибка: «RuntimeError: Library libcublas.so.11 is not found or cannot be loaded»&lt;br /&gt;
Для исправления ошибки установите Cuda 11 командой:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;!apt install libcublas11&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Скачивать будем ролик Ильи Бирмана из лекции &lt;a href="https://ilyabirman.ru/meanwhile/all/understanding-the-task/"&gt;о понимании задачи&lt;/a&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# качаем ролик id в mp3 в корень
!yt-dlp -x --audio-format mp3 -o ./birman_ponimanie_zadachi.mp3 -- PbnbwkoCQOE&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Распознавать можно whisper-ctranslate2 — по моим наблюдением расшифровывает в 2—3 раза быстрее чем оригинальный whisper.  На данный момент модель large-v2 самая полная.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#распознаем через whisper-ctranslate2
!whisper-ctranslate2 &amp;quot;birman_ponimanie_zadachi.mp3&amp;quot; --language Russian  -o ./result --model large-v2 --model_dir ./model&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/rasshifrovka-audio-i-video.png" width="749" height="558" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Результат в консоле будет появляться по мере распознавания. Результирующие файлы будут в папке result в форматах .json, .srt, .tsv, .txt и .vtt. Например, в txt — только текст, в tsv — таймкоды, в vtt и srt — субтитры.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Через оригинальный whisper имеет смысл распознавать на компьютерах без видеокарт, это долго, но работает. Whisper требует версию питона 3.8—3.10, на других версиях не заработает.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#распознаем через оригинальный whisper
!whisper &amp;quot;iliahov2.mp3&amp;quot; -o ./result --model large-v2 --model_dir ./model&lt;/code&gt;&lt;/pre&gt;&lt;p class="loud"&gt;Если вам нужно что-то распознать или транскрибацию провести. Пишите в телеграм, договоримся :—)&lt;/p&gt;
</description>
</item>

<item>
<title>Выполняем SQL запрос в питоне</title>
<guid isPermaLink="false">507</guid>
<link>https://blog.fossko.ru/all/vypolnyaem-sql-zapros-v-pitone/</link>
<pubDate>Thu, 20 Apr 2023 17:16:02 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/vypolnyaem-sql-zapros-v-pitone/</comments>
<description>
&lt;p&gt;В питоне можно выполнить запрос к базе данных на SQL сервере, а ответ получить как датасет пандос.&lt;/p&gt;
&lt;p&gt;Импортируем библиотеки, в примере мы будем подключаться к MS SQL серверу, но можно подключаться к другим базам данных, используя нужную библиотеку.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import pyodbc
import pandas as pd&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В переменную con запишем подключение к SQL серверу&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# создание подключения к базе данных
con = pyodbc.connect(&amp;quot;Driver={SQL Server Native Client 11.0};&amp;quot;
                      &amp;quot;Server=NAME_SQL_SERVER;&amp;quot;
                      &amp;quot;Database=NAME_BASE;&amp;quot;
                      &amp;quot;Trusted_Connection=yes;&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Функция select — для быстрой отправки sql запроса, на входе sql запрос, на выходе результат выполнения&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# функция отправки запроса к базе sql
def select(sql):
    return pd.read_sql(sql,con)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Используем тройные кавычки, для переноса построчно, иначе нужно писать в одну строку&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Переменной sql присваиваем запрос
sql=&amp;#039;&amp;#039;&amp;#039;

DECLARE
@today DATE,
@yesterday DATE

SELECT
@yesterday = DATEADD(day, -1, CAST(GETDATE() AS date))  --вчера в виде даты без времени
,@today = CAST(GETDATE() AS date)  --сегодня в виде даты без времени

SELECT 
  *  
FROM table.data

WHERE
 DataZvonka &amp;lt;= @yesterday 
 and
 DataPrihoda &amp;gt;= @today

&amp;#039;&amp;#039;&amp;#039;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Присваиваем датасету df, результат выполнения запроса sql&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# создание датасета с данными запроса
df=select(sql)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Дальше можно производить вычисления в пандос, и делать что нужно с данными, например, записать в гугл таблицу, отправить в телеграм группу.&lt;/p&gt;
</description>
</item>

<item>
<title>Отправляем новые статьи из РСС в телеграм</title>
<guid isPermaLink="false">465</guid>
<link>https://blog.fossko.ru/all/otpravlyaem-novye-statyi-iz-rss-v-telegram/</link>
<pubDate>Mon, 10 Oct 2022 10:10:19 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/otpravlyaem-novye-statyi-iz-rss-v-telegram/</comments>
<description>
&lt;p&gt;Удобно присылать новые ссылки на статьи моих подписок РСС в телеграм, так как вся коммуникация уже в нем, фидли почти не использую.&lt;/p&gt;
&lt;p&gt;Евгений Гончаров, в статье &lt;a href="https://sys-adm.in/programming/805-rss-fider-na-python-s-opravkoj-uvedomlenij-v-telegram.html" class="nu"&gt;«&lt;u&gt;RSS фидер на Python с оправкой уведомлений в Телеграм&lt;/u&gt;»&lt;/a&gt; описал весь принцип отправки и использование базы данных для контроля что отправили. &lt;a href="https://github.com/m0zgen/rss2bot/blob/master/rss.py"&gt;Готовый код на гитхабе Евгения&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Я внес небольшие изменения в код:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Сообщения в телеграм отправляются с задержкой 1 секунда. Если не использовать таймаут, сервер телеграма, может отправить не все сообщения.&lt;/li&gt;
&lt;li&gt;Изменил вид отправки сообщений: добавил переносы строк и автора, если он есть.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/image-5.png" width="518" height="904" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;В канал телеграма приходят новые сообщения. Проверка РСС проходит с 7 утра до 11 вечера, с интервалом 30 минут.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Канал открытый, можно подписаться на &lt;a href="https://t.me/pochitaet" class="nu"&gt;«&lt;u&gt;Почитаем&lt;/u&gt;»&lt;/a&gt;, там 95 источников РСС: например, избранное блогов на Эгее, Илья Бирман, Максим Ильяхов, Николай Товеровский, и другие.&lt;/p&gt;
&lt;p&gt;В примере скрипта: блоги на Эгее и мой блог.&lt;/p&gt;
&lt;p&gt;Скрипт:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#!/usr/bin/python3
# Created by Yevgeniy Goncharov, https://sys-adm.in
# Script for reading and forwarding to Telegram, rss feeds


# Imports
import sqlite3
import requests
import feedparser
import os
import urllib
import random
import time

# Bot creds
bot_token = &amp;#039;bot_token&amp;#039;
bot_chatID = &amp;#039;bot_chatID&amp;#039;

# Feeds
myfeeds = [
    &amp;#039;https://blogengine.ru/blogs/rss/&amp;#039;,
    &amp;#039;http://blog.fossko.ru/rss/&amp;#039;,

]

# User agents
uags = [
  &amp;#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&amp;#039;,
  &amp;#039;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0&amp;#039;,
  &amp;#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&amp;#039;,
  &amp;#039;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0&amp;#039;,
  &amp;#039;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36&amp;#039;,
]

# Random User Agent (from uags list)
ua = random.choice(uags)

# Header
headers = {
  &amp;quot;Connection&amp;quot; : &amp;quot;close&amp;quot;,  # another way to cover tracks
  &amp;quot;User-Agent&amp;quot; : ua
}

# Proxies
proxies = {
}

# DB
scriptDir = os.path.dirname(os.path.realpath(__file__))
db_connection = sqlite3.connect(scriptDir + &amp;#039;/rss.sqlite&amp;#039;)
db = db_connection.cursor()
db.execute(&amp;#039;CREATE TABLE IF NOT EXISTS myrss (title TEXT, date TEXT)&amp;#039;)

# Get posts from DB and print
def get_posts():
    with db_connection:
        db.execute(&amp;quot;SELECT * FROM myrss&amp;quot;)
       # print(db.fetchall())

# Check post in DB
def article_is_not_db(article_title, article_date):
    db.execute(&amp;quot;SELECT * from myrss WHERE title=? AND date=?&amp;quot;, (article_title, article_date))
    if not db.fetchall():
        return True
    else:
        return False

# Add post to DB
def add_article_to_db(article_title, article_date):
    db.execute(&amp;quot;INSERT INTO myrss VALUES (?,?)&amp;quot;, (article_title, article_date))
    db_connection.commit()

# Send notify to Telegram bot
def bot_sendtext(bot_message):
    #bot_message = urllib.parse.quote(bot_message)
    bot_message = bot_message
    send_text = &amp;#039;https://api.telegram.org/bot&amp;#039; + bot_token + &amp;#039;/sendMessage?chat_id=&amp;#039; + bot_chatID + &amp;#039;&amp;amp;parse_mode=Markdown&amp;amp;text=&amp;#039; + bot_message
    requests.get(send_text, proxies=proxies, headers=headers)
    print(send_text)

# Check, read articles
def read_article_feed(feed):
    &amp;quot;&amp;quot;&amp;quot; Get articles from RSS feed &amp;quot;&amp;quot;&amp;quot;
    feedparser.USER_AGENT = ua
    feed = feedparser.parse(feed)
    print(feed)
    for article in feed[&amp;#039;entries&amp;#039;]:
        if article_is_not_db(article[&amp;#039;title&amp;#039;], article[&amp;#039;published&amp;#039;]):
            add_article_to_db(article[&amp;#039;title&amp;#039;], article[&amp;#039;published&amp;#039;])
           # bot_sendtext(&amp;#039;New feed found &amp;#039; + article[&amp;#039;title&amp;#039;] +&amp;#039;, &amp;#039; + article[&amp;#039;link&amp;#039;] + &amp;#039;, &amp;#039; + article[&amp;#039;description&amp;#039;])
            try:
                rss_autor = article[&amp;#039;author&amp;#039;] +&amp;#039;%0A%0A&amp;#039;
            except:
                rss_autor = &amp;quot;&amp;quot;
            MSGsend=&amp;#039;*&amp;#039;+ article[&amp;#039;title&amp;#039;] + &amp;#039;*%0A%0A&amp;#039; + rss_autor + article[&amp;#039;link&amp;#039;]
            MSGsend=MSGsend.replace(&amp;quot;_&amp;quot;, &amp;quot;\_&amp;quot;)  # замена подчеркивания для отправки в ТГ
            bot_sendtext(MSGsend)            
            time.sleep(1)
           # print(article)

# Rotate feeds array
def spin_feds():
    for x in myfeeds:
       # print(x)
        read_article_feed(x)

# Runner :)
if __name__ == &amp;#039;__main__&amp;#039;:
    spin_feds()
    # get_posts()
    db_connection.close()&lt;/code&gt;&lt;/pre&gt;</description>
</item>

<item>
<title>Курс «Настройка Python для работы с данными»</title>
<guid isPermaLink="false">456</guid>
<link>https://blog.fossko.ru/all/kurs-nastroyka-python-dlya-raboty-s-dannymi/</link>
<pubDate>Thu, 26 Aug 2021 12:11:21 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/kurs-nastroyka-python-dlya-raboty-s-dannymi/</comments>
<description>
&lt;p&gt;&lt;a href="https://mailchi.mp/d823cd1db54d/python"&gt;Настройка Python для работы с данными&lt;/a&gt;  — бесплатный видео мини-курс от Алексея Куличевского, начал выходить в августе 2021 года. Курс в виде рассылки, письма приходят на почту.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Алексей Куличевский рассказывает как пользоваться командной строкой, все на примере терминала мака. Если работаете в винде есть аналог, это cmd и PowerShell.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Совет от Алексея: На Windows команды могут отличаться, но их легко нагуглить запросом &lt;название команды&gt; windows. Например, «ls windows».&lt;/p&gt;
&lt;p&gt;В курсе будут темы: установка Python и настройка виртуальных окружений, выбор и настройка редактора кода, основы работы c git и github, типовая структура проекта&lt;/p&gt;
&lt;p&gt;Всего 6 писем, можно пройти за пару вечеров.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/QgWtf1cz7MM?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Основы работы с командной строкой&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/oqOT-a2iikw?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Устанавливаем Python, настраиваем виртуальные окружения&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/6mxnH0JFMVQ?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Редакторы кода&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/HL1QmInke7M?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Системы контроля версий, Git и Github&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/upG7Tint1_0?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Типовая структура проекта&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PL2PN33KbuWfz6o9TgDaVvAs7w9JaRD6x0"&gt;Весь плейлист&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Алексей анонсировал курс — &lt;a href="https://mailchi.mp/cca4513bb958/ddlvgo33yv"&gt;Python для маркетологов и продактов&lt;/a&gt;, сейчас можно подписаться на рассылку и получать демо-уроки.&lt;/p&gt;
</description>
</item>

<item>
<title>Авторизация на сайте через питон</title>
<guid isPermaLink="false">446</guid>
<link>https://blog.fossko.ru/all/avtorizaciya-na-sayte-cherez-piton/</link>
<pubDate>Fri, 05 Feb 2021 15:11:29 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/avtorizaciya-na-sayte-cherez-piton/</comments>
<description>
&lt;p&gt;По материалам статьи: &lt;a href="https://gadjimuradov.ru/post/python-requests-avtorizaciya-na-sajte/"&gt;Python requests. Авторизация на сайте&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Я описал &lt;a href="/all/parsing-saytov-cherez-piton/"&gt;как парсить сайты через модуль requests&lt;/a&gt;. Бывают случаи когда для части сайта нужна авторизация, то есть логин и пароль.&lt;/p&gt;
&lt;p&gt;Для авторизации нужно поддерживать активную сессию в модуле requests, через session.get()&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg" width="377" height="120" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;session.get(url) вместо requests.get(url)&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import requests
import re
from bs4 import BeautifulSoup
import pandas as pd

url = &amp;#039;https://freelance.ru/login/&amp;#039;

# Важно. По умолчанию requests отправляет вот такой 
# заголовок &amp;#039;User-Agent&amp;#039;: &amp;#039;python-requests/2.22.0 ,  а это приводит к тому , что Nginx
# отправляет 404 ответ. Поэтому нам нужно сообщить серверу, что запрос идет от браузера  

user_agent_val = &amp;#039;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36&amp;#039;

# Создаем сессию и указываем ему наш user-agent
session = requests.Session()
r = session.get(url, headers = {
    &amp;#039;User-Agent&amp;#039;: user_agent_val
})

# Указываем referer. Иногда , если не указать , то приводит к ошибкам. 
session.headers.update({&amp;#039;Referer&amp;#039;:url})&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В оригинальной статье было снимание куков, я не совсем понимаю когда использовать. В данном скрипе, я это не использую.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;_xsrf = session.cookies.get(&amp;#039;_xsrf&amp;#039;, domain=&amp;quot;.freelance.ru&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Дальше посылаем post-запрос&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;login = &amp;quot;xxxx&amp;quot;
passwd = &amp;quot;xxxx&amp;quot;

post_request = session.post(url, {
    &amp;#039;login&amp;#039;: login ,
    &amp;#039;passwd&amp;#039;: passwd,
    &amp;quot;check_ip&amp;quot;: &amp;quot;on&amp;quot;,
    &amp;quot;submit&amp;quot;: &amp;quot;%C2%F5%EE%E4&amp;quot;,
    &amp;quot;auth&amp;quot;: &amp;quot;auth&amp;quot;,
    &amp;quot;return_url&amp;quot;: &amp;quot;/login/&amp;quot;
})&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Для того чтобы узнать пост запрос, нужно зайти в инспектор кода, вкладка сеть, и найти запрос который посылается&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="638" data-ratio="0.70419426048565"&gt;
&lt;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="" /&gt;
&lt;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="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;В submit я подставил значение из не декодированного вида.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Теперь переходим в закрытый раздел, обновляем сессию и снимаем данные&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;url = &amp;quot;https://freelance.ru/setup/&amp;quot;
r = session.get(url)
soup = BeautifulSoup(r.text, &amp;quot;lxml&amp;quot;)
soup&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="744" data-ratio="3.7766497461929"&gt;
&lt;img src="https://blog.fossko.ru/pictures/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.07.28.jpg" width="744" height="197" alt="" /&gt;
&lt;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="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Мой рейтинг на этом сервисе.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Дальше можно снимать нужную информацию, &lt;a href="/all/parsing-saytov-cherez-piton/"&gt;используя BeautifulSoup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Для библиотеки Requests, есть хорошие статьи от Александра, pythonru&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pythonru.com/biblioteki/kratkoe-rukovodstvo-po-biblioteke-python-requests"&gt;Краткое руководство по библиотеке Python Requests&lt;/a&gt; — рассказывает кратко, как пользоваться библиотекой.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pythonru.com/biblioteki/prodvinutoe-rukovodstvo-po-biblioteke-python-requests"&gt;Продвинутое руководство по библиотеке Python Requests&lt;/a&gt; — дополнительная информация, по объектам session, сертификатам SSL, прокси.&lt;/p&gt;
</description>
</item>

<item>
<title>Парсинг сайтов через питон модулем selenium</title>
<guid isPermaLink="false">443</guid>
<link>https://blog.fossko.ru/all/parsing-saytov-cherez-piton-modulem-selenium/</link>
<pubDate>Fri, 22 Jan 2021 17:03:17 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/parsing-saytov-cherez-piton-modulem-selenium/</comments>
<description>
&lt;p&gt;Работа идет через модуль selenium, для него нужно скачать &lt;a href="https://chromedriver.chromium.org/downloads"&gt; Chrome driver&lt;/a&gt; и браузер Chrome.&lt;br /&gt;
Важно чтобы версия  браузера и Chrome driver была одна и та же&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="779" data-ratio="2.2449567723343"&gt;
&lt;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="" /&gt;
&lt;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="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Версию браузера смотрим Справка → О браузере, и сверяемся с версией хром драйвер.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Чтобы точно быть уверенным, что все работает установите библиотеку selenium, импортируйте ее и запустите браузер через хром драйвер.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;pip install selenium
from selenium.webdriver import Chrome
browser = Chrome (&amp;quot;d:\del\chromedriver_win32\chromedriver.exe&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.34.08.jpg" width="755" height="246" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/data_,---Google-Chrome-2021-01-22-16.35.27.jpg" width="822" height="669" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Если все корректно, запускается хром в режиме: «Браузером управляет тестовое ПО»&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;В тестовом браузере будут выполнятся все команды.&lt;/p&gt;
&lt;p&gt;Импортируем необходимые библиотеки&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from bs4 import BeautifulSoup
from time import sleep&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Переход на сайт&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;url = &amp;quot;https://bus.gov.ru/registry&amp;quot;
browser.get(url)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/Reestr-organizaciy---Google-Chrome-2021-01-22-16.38.35.jpg" width="1131" height="605" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;В тестовом браузере открылся сайт &lt;a href="https://bus.gov.ru/registry"&gt;https://bus.gov.ru/registry&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Нужно ввести в строке поиска «онкологический диспансер»&lt;/p&gt;
&lt;p&gt;Способ 1&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;input_el = browser.find_element_by_tag_name(&amp;quot;input&amp;quot;)
input_el.send_keys(&amp;quot;онкологический диспансер&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.08.jpg" width="951" height="488" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Вводится наименование в поле &lt;i&gt;input&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Нажать энтер или кнопку найти.&lt;/p&gt;
&lt;p&gt;Нажатие кнопки энтер:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;input_el.send_keys(Keys.ENTER)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Нажатие кнопки найти:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;browser.find_element_by_xpath(&amp;quot;/html/body/div[2]/ui-view/form/div[2]/div/div[2]/div/button&amp;quot;).click()&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.33.jpg" width="1110" height="448" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;После выполнения кода браузер ищет диспансеры&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Дальше работаем как &lt;a href="/all/parsing-saytov-cherez-piton/"&gt;при простом парсинге сайта&lt;/a&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;soup = BeautifulSoup(browser.page_source, &amp;quot;lxml&amp;quot;)
soup&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.51.45.jpg" width="1102" height="324" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;В переменной &lt;i&gt;soup&lt;/i&gt; вся текущая страница&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Смотрим где содержится название учреждения и ссылка на него&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;soup.find (&amp;quot;a&amp;quot;, class_=&amp;quot;result__button&amp;quot;).get(&amp;quot;href&amp;quot;)
soup.find(&amp;quot;a&amp;quot;,class_=&amp;quot;result__title&amp;quot;).text&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.53.27.jpg" width="1137" height="220" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Для получения части ссылки используем запрос &lt;i&gt;get&lt;/i&gt;, для названия &lt;i&gt;text&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Чтобы не искать по всей странице, можно оставить информацию которая нам нужна, она содержится к контейнере c классом &lt;i&gt;results&lt;/i&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;orgs=soup.findAll(&amp;quot;div&amp;quot;,class_=&amp;quot;result&amp;quot;)
orgs&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.55.56.jpg" width="1019" height="390" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Содержимое всех контейнеров &lt;i&gt;result&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Обработка текущей страницы&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;data = []
for el in orgs:
    name = el.find(&amp;quot;a&amp;quot;, class_=&amp;quot;result__title&amp;quot;).text
    link = &amp;quot;https://bus.gov.ru/registry&amp;quot; + el.find(&amp;quot;a&amp;quot;, class_=&amp;quot;result__button&amp;quot;).get(&amp;quot;href&amp;quot;)
    #print (name, link)
    data.append([name,link])
data&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.57.40.jpg" width="1112" height="373" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Названия учреждений и ссылка на страницу с описанием&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Нужно нажимать на страницу «следующая»&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;next_button = browser.find_element_by_class_name(&amp;quot;pagination__next&amp;quot;)
next_button.click()&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Код нажимает на элемент с классом &lt;i&gt;pagination__next&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Готовый код для сбора всей информации&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;url = &amp;#039;https://bus.gov.ru/registry&amp;#039;
browser.get(url)
sleep(5)
input_el = browser.find_element_by_tag_name(&amp;#039;input&amp;#039;)
input_el.send_keys(&amp;#039;онкологический диспансер&amp;#039;)
input_el.send_keys(Keys.ENTER)
sleep(5)

data = []


for i in range(10):
    
    soup = BeautifulSoup(browser.page_source, &amp;quot;lxml&amp;quot;)
    orgs = soup.findAll(&amp;#039;div&amp;#039;, class_=&amp;#039;result&amp;#039;)
    
    for el in orgs:
        name = el.find(&amp;#039;a&amp;#039;, class_=&amp;#039;result__title&amp;#039;).text
        link = &amp;quot;https://bus.gov.ru&amp;quot;+el.find(&amp;#039;a&amp;#039;, class_=&amp;#039;result__button&amp;#039;).get(&amp;#039;href&amp;#039;)
        print(name, link)
        

        data.append([name, link])
        
    print(len(data))
    try:
        next_button = browser.find_element_by_class_name(&amp;#039;pagination__next&amp;#039;)
        next_button.click()
    except NoSuchElementException:
        continue
    sleep(6)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-17.01.04.jpg" width="1138" height="457" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Все данные попадают в таблицу &lt;i&gt;data&lt;/i&gt;, в ней столбец с наименованием и ссылка&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/xhEhlyFn1vM?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Подробный вебинар про модуль selenium, используется &lt;a href="https://www.anaconda.com/products/individual"&gt;среда разработки Анаконда&lt;/a&gt; с модулем Юпитер. Во второй части парсится сайт с судебными решениями.&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Парсинг сайтов через питон</title>
<guid isPermaLink="false">442</guid>
<link>https://blog.fossko.ru/all/parsing-saytov-cherez-piton/</link>
<pubDate>Thu, 21 Jan 2021 13:25:45 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/parsing-saytov-cherez-piton/</comments>
<description>
&lt;p&gt;Устанавливаем и импортируем библиотеки в питон&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;pip install requests
pip install pandas
import requests
from bs4 import BeautifulSoup
import pandas as pd
from time import sleep&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Переменной &lt;i&gt;url&lt;/i&gt; присваиваем  ссылку на страницу кинопоиска, в переменную &lt;i&gt;r&lt;/i&gt; результат гет запроса к этой странице&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;url = &amp;quot;https://www.kinopoisk.ru/s/type/film/list/1/find/%F1%E5%EA%F1/&amp;quot;
r = requests.get(url)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Текстовое содержимое страницы сайта — &lt;i&gt;r.text&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Переведем содержимое страницы в формат кода&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;soup = BeautifulSoup(r.text, &amp;quot;lxml&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Содержимое переменной — &lt;i&gt;soup&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/Rezultaty-poiska-(922)---Google-Chrome-2021-01-21-13.01.03.jpg" width="1629" height="461" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;При помощи инспектора кода находим контейнеры с названием фильма, годом, названием на языке оригинала и баллом кинопоиска&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;russian_name = soup.find(&amp;#039;div&amp;#039;,class_ = &amp;quot;element&amp;quot;).find(&amp;#039;div&amp;#039;, class_ = &amp;quot;info&amp;quot;).find(&amp;#039;a&amp;#039;, class_ = &amp;quot;js-serp-metrika&amp;quot;).text
russian_name
original_name = soup.find(&amp;#039;div&amp;#039;,class_ = &amp;quot;element&amp;quot;).find(&amp;#039;span&amp;#039;, class_ = &amp;quot;gray&amp;quot;).text
original_name
year = soup.find(&amp;#039;div&amp;#039;,class_ = &amp;quot;element&amp;quot;).find(&amp;#039;span&amp;#039;, class_ = &amp;quot;year&amp;quot;).text
year
kinopoisk = soup.find(&amp;#039;div&amp;#039;,class_ = &amp;quot;element&amp;quot;).find(&amp;#039;div&amp;#039;, class_ = &amp;quot;rating&amp;quot;).text
kinopoisk&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Все данные по первому фильму встречающемуся на странице&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Находим контейнер с кусочком кода и генерируем ссылку на фильм&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;link = &amp;quot;https://www.kinopoisk.ru&amp;quot; +soup.find(&amp;#039;div&amp;#039;,class_ = &amp;quot;element&amp;quot;).find(&amp;#039;div&amp;#039;, class_ = &amp;quot;info&amp;quot;).find(&amp;#039;a&amp;#039;).get(&amp;quot;data-url&amp;quot;)
link&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="1253" data-ratio="9.7890625"&gt;
&lt;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="" /&gt;
&lt;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="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Готовая ссылка на фильм и контейнер содержащий ссылку&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Можно составить код, который сделает таблицу, содержащую все фильмы с данной таблицы&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;data = []
films =soup.findAll(&amp;quot;div&amp;quot;,class_ = &amp;quot;element&amp;quot;)
for film in films:
    russian_name = film.find(&amp;#039;div&amp;#039;, class_ = &amp;quot;info&amp;quot;).find(&amp;#039;a&amp;#039;, class_ = &amp;quot;js-serp-metrika&amp;quot;).text
    original_name = film.find(&amp;#039;span&amp;#039;, class_ = &amp;quot;gray&amp;quot;).text
    
    try:
        year = film.find(&amp;#039;span&amp;#039;, class_ = &amp;quot;year&amp;quot;).text
    except:
        year = &amp;quot;&amp;quot;
    
    try:
        kinopoisk = film.find(&amp;#039;div&amp;#039;, class_ = &amp;quot;rating&amp;quot;).text
    except:
        kinopoisk = &amp;quot;&amp;quot;
    
    link = &amp;quot;https://www.kinopoisk.ru&amp;quot; +film.find(&amp;#039;div&amp;#039;, class_ = &amp;quot;info&amp;quot;).find(&amp;#039;a&amp;#039;).get(&amp;quot;data-url&amp;quot;)
  
    #print (russian_name)
    #print (original_name)
    #print (year)
    #print (kinopoisk)
    #print (link)
    data.append([russian_name, original_name,year,kinopoisk,link  ])&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Содержимое таблицы &lt;i&gt;data&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Мы можем собрать все фильмы с одной страницы. Теперь нужно сделать цикл для сбора со всех страниц данного раздела. В этом разделе 11 страниц, значит нужен цикл для формирования списка страниц&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;for page in range(1,12):
    url = f&amp;quot;https://www.kinopoisk.ru/s/type/film/list/1/find/%F1%E5%EA%F1/order/relevant/page/{str(page)}/&amp;quot;
    print(url)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;Результат выполнения цикла &lt;i&gt;for&lt;/i&gt; с полученными страницами&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Теперь можно дополнить весь код. Не забываем про слип, так как на многих сайтах стоит защита от парсинга&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;data = []

for page in range(1,12):
    url = f&amp;quot;https://www.kinopoisk.ru/s/type/film/list/1/find/%F1%E5%EA%F1/order/relevant/page/{str(page)}/&amp;quot;
    print(url)
    
    r = requests.get(url)
    sleep(40)
    soup = BeautifulSoup(r.text, &amp;quot;lxml&amp;quot;)
    
    films = soup.findAll(&amp;quot;div&amp;quot;, class_ =&amp;quot;element&amp;quot;)

    for film in films:
        
        russian_name = film.find(&amp;quot;div&amp;quot;, class_=&amp;quot;info&amp;quot;).find(&amp;quot;a&amp;quot;).text
       # print(russian_name)
    
        original_name = film.find(&amp;quot;div&amp;quot;, class_=&amp;quot;info&amp;quot;).find(&amp;quot;span&amp;quot;, class_=&amp;quot;gray&amp;quot;).text
    
        year = film.find(&amp;quot;span&amp;quot;, class_=&amp;quot;year&amp;quot;).text

        try:
            year = film.find(&amp;quot;div&amp;quot;, class_= &amp;quot;span&amp;quot;).text
        except:
            year = &amp;quot;&amp;quot;
        
        try:
            rate = film.find(&amp;quot;div&amp;quot;, class_= &amp;quot;rating&amp;quot;).text
        except:
            rate = &amp;quot;&amp;quot;
    
        link = &amp;quot;https://www.kinopoisk.ru&amp;quot;+film.find(&amp;quot;div&amp;quot;, class_=&amp;quot;info&amp;quot;).find(&amp;quot;a&amp;quot;).get(&amp;quot;data-url&amp;quot;)
    
        data.append([russian_name, original_name, year, link])&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;По мере прохождения страниц, будут печатаются страницы на которых находится сейчас робот&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Делаем заголовки таблицы и выгружаем в файл csv&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;header = [&amp;#039;russian_name&amp;#039;, &amp;#039;original_name&amp;#039;, &amp;#039;year&amp;#039;, &amp;#039;link&amp;#039;]
df = pd.DataFrame(data, columns = header)
df.head()

df.to_csv(&amp;quot;d:\data_kino.csv&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;div class="e2-text-caption"&gt;получившаяся таблица с выгрузкой&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Можно и в питоне получить список всех ссылок на фильмы, работая с таблицей&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;for i in data:
    #print (i)
    link = i[3]
    print (link)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;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="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/ZhTf6NIVLEU?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Вебинар курса «Веб-скрейпинг для журналистов. С программированием и без». Используется среда разработки &lt;a href="https://www.anaconda.com/products/individual"&gt;Анаконда&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
</description>
</item>


</channel>
</rss>