<?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/parsing/</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>Парсим телеграм каналы агентств интернет-маркетинга</title>
<guid isPermaLink="false">540</guid>
<link>https://blog.fossko.ru/all/parsim-telegram-kanaly-agentstv-internet-marketinga/</link>
<pubDate>Tue, 28 Nov 2023 20:21:53 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/parsim-telegram-kanaly-agentstv-internet-marketinga/</comments>
<description>
&lt;p&gt;В гугл таблицах автоматически получим ссылки на телеграм каналы интернет-агентств.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Предыстория&lt;/b&gt; .У Павела Злобина вышла статья «&lt;a href="https://pavezlo.ru/testirovanie-gipotez/top-telegramm-kanalov-pro-marketing/"&gt;Топ телеграм каналов про маркетинг&lt;/a&gt;»  в которой описывает как можно получить телеграм каналы агентств.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/Reyting-agentstv-Performance-marketinga,-TOP-luchshih-perfomans-kompaniy---Opera-2023-11-28-20.16.58.jpg" width="639" height="503" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://ratingruneta.ru/performance/"&gt;В рейтинге рунета есть список топ-100 агентств&lt;/a&gt;, из списка мы можем получить название и ссылку на страницу о агентстве&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Наименование агенства&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;=IMPORTXML(A1;&amp;quot;//table[@id=&amp;#039;rating_table_id&amp;#039;]/tbody/tr/td/div/a&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ссылка на страницу&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;=IMPORTXML(A1;&amp;quot;//table[@id=&amp;#039;rating_table_id&amp;#039;]/tbody/tr/td/div/a/@href&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/IT-Agency--otzyvy-klientov,-portfolio,-klienty,-stoimost-uslug---Opera-2023-11-28-20.19.32.jpg" width="848" height="214" 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;=IFNA(IMPORTXML(&amp;quot;https://ratingruneta.ru&amp;quot;&amp;amp;B4;&amp;quot;//a[@class=&amp;#039;_1OOlgax2iF telegram&amp;#039;]//@href&amp;quot;);&amp;quot;&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ссылка на ВК&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;=IFNA(IMPORTXML(&amp;quot;https://ratingruneta.ru&amp;quot;&amp;amp;B4;&amp;quot;//a[@class=&amp;#039;_1OOlgax2iF vkontakte&amp;#039;]//@href&amp;quot;);&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/TG-kanaly-ratingruneta---Google-Tablicy---Opera-2023-11-28-20.13.26.jpg" width="763" height="650" 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;a href="https://docs.google.com/spreadsheets/d/1OnaWe5nGN7f7FH4CZm9ec3E6LkSapPqGDDphsvZUGvU/edit#gid=0"&gt;Ссылка на таблицу&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Отправляем поток из РСС в телеграм через Google Apps Script</title>
<guid isPermaLink="false">471</guid>
<link>https://blog.fossko.ru/all/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script/</link>
<pubDate>Thu, 22 Dec 2022 11:50:33 +0300</pubDate>
<author></author>
<comments>https://blog.fossko.ru/all/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script/</comments>
<description>
&lt;p&gt;Обновляем канал «&lt;a href="https://t.me/pochitaet"&gt;Почитаем…&lt;/a&gt;»&lt;br /&gt;
Теперь новые статьи будут приходить в канал автономно, через гугл таблицы и без участия локального сервера с питоном.&lt;br /&gt;
&lt;a href="/all/otpravlyaem-novye-statyi-iz-rss-v-telegram/"&gt;Раньше работало через питон и базу данных на sqlite3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В гугл таблице нам нужны три листа: rss, rss_data, error&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rss — будем хранить рсс потоки сайтов,&lt;/li&gt;
&lt;li&gt;rss_data — будем хранить базу данных что отпарсилось и что отправлено,&lt;/li&gt;
&lt;li&gt;error — будем хранить ошибки при отладке, если это потребуется&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/image-12.png" width="1124" height="610" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;На листе rss, в первой колонке перечислены все рсс-потоки, при необходимости добавить или удалить, делаем это здесь.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/image-11.png" width="1124" height="610" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;На листе rss_data, первая строчка с наименованием колонок&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;У меня сейчас 110 источников, когда идет запись в таблицу, скрипт не успевает обработать все данные, и отваливается по тайм-ауту гугла. После нескольких запусков он все ссылки обработает и начинает укладываться в тайминг.&lt;br /&gt;
Возможно, в будущем, нужно скрипт делить на несколько&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.fossko.ru/pictures/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script.png" width="510" height="834" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;сообщения приходят в том же виде, что и раньше.&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Парсинг потоков рсс через гугл таблицы&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Считываем базу данных РСС
function data_base_rss() {
  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&amp;quot;rss_data&amp;quot;)
  data_base= app.getRange(1,1, app.getLastRow(), app.getLastColumn()).getValues(); //только заполненный диапазон
  return(data_base)
}

// поиск по базе данных
function find_rss(url) {
  rezult = rss_data.findIndex(item =&amp;gt; item[3] === url) //ищем в 4 столбце
  //console.log(rezult) //-1 если не найдено, и индекс положительный если нашлось это что нашлось лог
  return(rezult)
}


// Запись нового поста в таблицу
function data_write_rss(data) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&amp;quot;rss_data&amp;quot;);
  var value = data
  sheet.getRange(sheet.getLastRow() + 1,1,1,4).setValues([value]);
  console.log(data)
}

// Запись error в таблицу
function error_log(data) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&amp;quot;error&amp;quot;);
  //var sheet = spreadsheet.getActiveSheet();
  //var value = new Date(); // value you want to insert
  //var value = data
  sheet.getRange(sheet.getLastRow() + 1,1,1,3).setValues([data]);
  console.log(data)
}


//функция проверки новых постов текущего потока
function get_rss(rss_url) {
  var url =rss_url
  var date_rss =[]
  var xml = UrlFetchApp.fetch(url).getContentText()
  document = XmlService.parse(xml);
  root = document.getRootElement();
  channel = root.getChild(&amp;#039;channel&amp;#039;);
  items = channel.getChildren(&amp;#039;item&amp;#039;);
  items.forEach(item =&amp;gt; {
    parsing_date=new Date(); // дата текущая
    title = item.getChild(&amp;#039;title&amp;#039;).getText();
    link = item.getChild(&amp;#039;link&amp;#039;).getText()
    try{
    author = item.getChild(&amp;#039;author&amp;#039;).getText();} //автор не у всех бывает
    catch(e){author =&amp;quot;&amp;quot;}
    if (find_rss(link) == -1) {
      data_write_rss([parsing_date,title,author,link])  
    }
   });
  console.log(date_rss)
}

// Основная функция парсинга всех РСС потоков, ее нужно установить в запуск раз в 15 минут
function parse_rss() {
  var rss_data=data_base_rss()
  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&amp;quot;rss&amp;quot;)
  url_array = app.getRange(1,1, app.getLastRow(), 1).getValues(); //только заполненный первый столбец
  console.log(url_array);
  url_array.forEach(url =&amp;gt; {
    console.log(url)
    try{ 
      get_rss(url)}
    catch(e){console.log(&amp;quot;! недействительный URL&amp;quot;, console.log(url),&amp;#039;Ошибка &amp;#039; + e.name + &amp;quot;:&amp;quot; + e.message + &amp;quot;\n&amp;quot; + e.stack)
    //error_log([new Date(),url,&amp;#039;Ошибка &amp;#039; + e.name + &amp;quot;:&amp;quot; + e.message + &amp;quot;\n&amp;quot; + e.stack]) //При необходимости записи ошибок снять комментарий     
    } //Обработка ошибки 
  })
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Код отправки сообщений в телеграм:&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;const tokendr = &amp;quot;BOT_token&amp;quot;; 
const IDChattelegramdr = &amp;quot;ID_CHAT&amp;quot; 

function timerSENDtgDR() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let ws = ss.getSheetByName(&amp;quot;rss_data&amp;quot;); //таблица с которой берем данные
  let data = ws.getRange(2, 1, ws.getLastRow()-1, 5).getValues(); //диапазон с которого берем данные
  Logger.log ( data ); 
  for (i = 0; i &amp;lt; data.length; i++) {
    let dataInfo = data[i]; //строчка таблицы
    //Logger.log ( dataInfo );
    let telegram_send = dataInfo[4]; //пятая ячейка telegram_send
    Logger.log(telegram_send)
    if (telegram_send ===&amp;quot;&amp;quot;){
      title = dataInfo[1];
      author = dataInfo[2];
      if (author !=&amp;#039;&amp;#039;){
      author=author+&amp;quot;\n\n&amp;quot;    //если имя автора есть, добавить переносы строк
      }
      link = dataInfo[3];
      sendTextDR(IDChattelegramdr, &amp;quot;&amp;lt;b&amp;gt;&amp;quot;+title+&amp;quot;&amp;lt;/b&amp;gt;\n\n&amp;quot; + author + link);
      ws.getRange(i+2 , 5, 1, 1).setValues([[new Date()]]);
      Utilities.sleep(500);// pause in the loop for 500 milliseconds
      Logger.log (&amp;quot;сообщение отправлено&amp;quot;);
    }
  }
}
 
function sendTextDR(chatId, text, keyBoard) {
  let data = {
    method: &amp;#039;post&amp;#039;,
    payload: {
      method: &amp;#039;sendMessage&amp;#039;,
      chat_id: String(chatId),
      text: text,
      //parse_mode:&amp;#039;Markdown&amp;#039;,
      parse_mode: &amp;#039;html&amp;#039;,
      reply_markup: JSON.stringify(keyBoard)
    }
  }
  UrlFetchApp.fetch(&amp;#039;https://api.telegram.org/bot&amp;#039; + tokendr + &amp;#039;/&amp;#039;, data);
}&lt;/code&gt;&lt;/pre&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>Авторизация на сайте через питон</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>