{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Заметки — Игорь К.: заметки с тегом парсинг",
    "_rss_description": "Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/blog.fossko.ru\/tags\/parsing\/",
    "feed_url": "https:\/\/blog.fossko.ru\/tags\/parsing\/json\/",
    "icon": "https:\/\/blog.fossko.ru\/pictures\/userpic\/userpic@2x.jpg?1610628098",
    "authors": [
        {
            "name": "Игорь К.",
            "url": "https:\/\/blog.fossko.ru\/",
            "avatar": "https:\/\/blog.fossko.ru\/pictures\/userpic\/userpic@2x.jpg?1610628098"
        }
    ],
    "items": [
        {
            "id": "540",
            "url": "https:\/\/blog.fossko.ru\/all\/parsim-telegram-kanaly-agentstv-internet-marketinga\/",
            "title": "Парсим телеграм каналы агентств интернет-маркетинга",
            "content_html": "<p>В гугл таблицах автоматически получим ссылки на телеграм каналы интернет-агентств.<\/p>\n<p><b>Предыстория<\/b> .У Павела Злобина вышла статья «<a href=\"https:\/\/pavezlo.ru\/testirovanie-gipotez\/top-telegramm-kanalov-pro-marketing\/\">Топ телеграм каналов про маркетинг<\/a>»  в которой описывает как можно получить телеграм каналы агентств.<\/p>\n<div class=\"e2-text-picture\">\n<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=\"\" \/>\n<div class=\"e2-text-caption\"><a href=\"https:\/\/ratingruneta.ru\/performance\/\">В рейтинге рунета есть список топ-100 агентств<\/a>, из списка мы можем получить название и ссылку на страницу о агентстве<\/div>\n<\/div>\n<p>Наименование агенства<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IMPORTXML(A1;&quot;\/\/table[@id=&#039;rating_table_id&#039;]\/tbody\/tr\/td\/div\/a&quot;)<\/code><\/pre><p>Ссылка на страницу<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IMPORTXML(A1;&quot;\/\/table[@id=&#039;rating_table_id&#039;]\/tbody\/tr\/td\/div\/a\/@href&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<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=\"\" \/>\n<div class=\"e2-text-caption\">На подробной странице агентства может быть ссылка на телеграм и ВК, получим их<\/div>\n<\/div>\n<p>Ссылка на телеграм<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IFNA(IMPORTXML(&quot;https:\/\/ratingruneta.ru&quot;&amp;B4;&quot;\/\/a[@class=&#039;_1OOlgax2iF telegram&#039;]\/\/@href&quot;);&quot;&quot;)<\/code><\/pre><p>Ссылка на ВК<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IFNA(IMPORTXML(&quot;https:\/\/ratingruneta.ru&quot;&amp;B4;&quot;\/\/a[@class=&#039;_1OOlgax2iF vkontakte&#039;]\/\/@href&quot;);&quot;&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<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=\"\" \/>\n<div class=\"e2-text-caption\">Протягиваем формулы, и получаем готовую страницу<\/div>\n<\/div>\n<p>Таким же образом можно получить информацию о других рейтингах.<\/p>\n<p><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1OnaWe5nGN7f7FH4CZm9ec3E6LkSapPqGDDphsvZUGvU\/edit#gid=0\">Ссылка на таблицу<\/a><\/p>\n",
            "date_published": "2023-11-28T20:21:53+03:00",
            "date_modified": "2023-11-28T20:22:15+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "таблицы"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Reyting-agentstv-Performance-marketinga,-TOP-luchshih-perfomans-kompaniy---Opera-2023-11-28-20.16.58.jpg",
            "_date_published_rfc2822": "Tue, 28 Nov 2023 20:21:53 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "540",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Reyting-agentstv-Performance-marketinga,-TOP-luchshih-perfomans-kompaniy---Opera-2023-11-28-20.16.58.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/IT-Agency--otzyvy-klientov,-portfolio,-klienty,-stoimost-uslug---Opera-2023-11-28-20.19.32.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/TG-kanaly-ratingruneta---Google-Tablicy---Opera-2023-11-28-20.13.26.jpg"
                ]
            }
        },
        {
            "id": "471",
            "url": "https:\/\/blog.fossko.ru\/all\/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script\/",
            "title": "Отправляем поток из РСС в телеграм через Google Apps Script",
            "content_html": "<p>Обновляем канал «<a href=\"https:\/\/t.me\/pochitaet\">Почитаем…<\/a>»<br \/>\nТеперь новые статьи будут приходить в канал автономно, через гугл таблицы и без участия локального сервера с питоном.<br \/>\n<a href=\"\/all\/otpravlyaem-novye-statyi-iz-rss-v-telegram\/\">Раньше работало через питон и базу данных на sqlite3<\/a><\/p>\n<p>В гугл таблице нам нужны три листа: rss, rss_data, error<\/p>\n<ul>\n<li>rss — будем хранить рсс потоки сайтов,<\/li>\n<li>rss_data — будем хранить базу данных что отпарсилось и что отправлено,<\/li>\n<li>error — будем хранить ошибки при отладке, если это потребуется<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-12.png\" width=\"1124\" height=\"610\" alt=\"\" \/>\n<div class=\"e2-text-caption\">На листе rss, в первой колонке перечислены все рсс-потоки, при необходимости добавить или удалить, делаем это здесь.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-11.png\" width=\"1124\" height=\"610\" alt=\"\" \/>\n<div class=\"e2-text-caption\">На листе rss_data, первая строчка с наименованием колонок<\/div>\n<\/div>\n<p>У меня сейчас 110 источников, когда идет запись в таблицу, скрипт не успевает обработать все данные, и отваливается по тайм-ауту гугла. После нескольких запусков он все ссылки обработает и начинает укладываться в тайминг.<br \/>\nВозможно, в будущем, нужно скрипт делить на несколько<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script.png\" width=\"510\" height=\"834\" alt=\"\" \/>\n<div class=\"e2-text-caption\">сообщения приходят в том же виде, что и раньше.<\/div>\n<\/div>\n<h2>Парсинг потоков рсс через гугл таблицы<\/h2>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ Считываем базу данных РСС\nfunction data_base_rss() {\n  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;rss_data&quot;)\n  data_base= app.getRange(1,1, app.getLastRow(), app.getLastColumn()).getValues(); \/\/только заполненный диапазон\n  return(data_base)\n}\n\n\/\/ поиск по базе данных\nfunction find_rss(url) {\n  rezult = rss_data.findIndex(item =&gt; item[3] === url) \/\/ищем в 4 столбце\n  \/\/console.log(rezult) \/\/-1 если не найдено, и индекс положительный если нашлось это что нашлось лог\n  return(rezult)\n}\n\n\n\/\/ Запись нового поста в таблицу\nfunction data_write_rss(data) {\n  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;rss_data&quot;);\n  var value = data\n  sheet.getRange(sheet.getLastRow() + 1,1,1,4).setValues([value]);\n  console.log(data)\n}\n\n\/\/ Запись error в таблицу\nfunction error_log(data) {\n  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;error&quot;);\n  \/\/var sheet = spreadsheet.getActiveSheet();\n  \/\/var value = new Date(); \/\/ value you want to insert\n  \/\/var value = data\n  sheet.getRange(sheet.getLastRow() + 1,1,1,3).setValues([data]);\n  console.log(data)\n}\n\n\n\/\/функция проверки новых постов текущего потока\nfunction get_rss(rss_url) {\n  var url =rss_url\n  var date_rss =[]\n  var xml = UrlFetchApp.fetch(url).getContentText()\n  document = XmlService.parse(xml);\n  root = document.getRootElement();\n  channel = root.getChild(&#039;channel&#039;);\n  items = channel.getChildren(&#039;item&#039;);\n  items.forEach(item =&gt; {\n    parsing_date=new Date(); \/\/ дата текущая\n    title = item.getChild(&#039;title&#039;).getText();\n    link = item.getChild(&#039;link&#039;).getText()\n    try{\n    author = item.getChild(&#039;author&#039;).getText();} \/\/автор не у всех бывает\n    catch(e){author =&quot;&quot;}\n    if (find_rss(link) == -1) {\n      data_write_rss([parsing_date,title,author,link])  \n    }\n   });\n  console.log(date_rss)\n}\n\n\/\/ Основная функция парсинга всех РСС потоков, ее нужно установить в запуск раз в 15 минут\nfunction parse_rss() {\n  var rss_data=data_base_rss()\n  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;rss&quot;)\n  url_array = app.getRange(1,1, app.getLastRow(), 1).getValues(); \/\/только заполненный первый столбец\n  console.log(url_array);\n  url_array.forEach(url =&gt; {\n    console.log(url)\n    try{ \n      get_rss(url)}\n    catch(e){console.log(&quot;! недействительный URL&quot;, console.log(url),&#039;Ошибка &#039; + e.name + &quot;:&quot; + e.message + &quot;\\n&quot; + e.stack)\n    \/\/error_log([new Date(),url,&#039;Ошибка &#039; + e.name + &quot;:&quot; + e.message + &quot;\\n&quot; + e.stack]) \/\/При необходимости записи ошибок снять комментарий     \n    } \/\/Обработка ошибки \n  })\n}<\/code><\/pre><h2>Код отправки сообщений в телеграм:<\/h2>\n<pre class=\"e2-text-code\"><code class=\"\">const tokendr = &quot;BOT_token&quot;; \nconst IDChattelegramdr = &quot;ID_CHAT&quot; \n\nfunction timerSENDtgDR() {\n  let ss = SpreadsheetApp.getActiveSpreadsheet();\n  let ws = ss.getSheetByName(&quot;rss_data&quot;); \/\/таблица с которой берем данные\n  let data = ws.getRange(2, 1, ws.getLastRow()-1, 5).getValues(); \/\/диапазон с которого берем данные\n  Logger.log ( data ); \n  for (i = 0; i &lt; data.length; i++) {\n    let dataInfo = data[i]; \/\/строчка таблицы\n    \/\/Logger.log ( dataInfo );\n    let telegram_send = dataInfo[4]; \/\/пятая ячейка telegram_send\n    Logger.log(telegram_send)\n    if (telegram_send ===&quot;&quot;){\n      title = dataInfo[1];\n      author = dataInfo[2];\n      if (author !=&#039;&#039;){\n      author=author+&quot;\\n\\n&quot;    \/\/если имя автора есть, добавить переносы строк\n      }\n      link = dataInfo[3];\n      sendTextDR(IDChattelegramdr, &quot;&lt;b&gt;&quot;+title+&quot;&lt;\/b&gt;\\n\\n&quot; + author + link);\n      ws.getRange(i+2 , 5, 1, 1).setValues([[new Date()]]);\n      Utilities.sleep(500);\/\/ pause in the loop for 500 milliseconds\n      Logger.log (&quot;сообщение отправлено&quot;);\n    }\n  }\n}\n \nfunction sendTextDR(chatId, text, keyBoard) {\n  let data = {\n    method: &#039;post&#039;,\n    payload: {\n      method: &#039;sendMessage&#039;,\n      chat_id: String(chatId),\n      text: text,\n      \/\/parse_mode:&#039;Markdown&#039;,\n      parse_mode: &#039;html&#039;,\n      reply_markup: JSON.stringify(keyBoard)\n    }\n  }\n  UrlFetchApp.fetch(&#039;https:\/\/api.telegram.org\/bot&#039; + tokendr + &#039;\/&#039;, data);\n}<\/code><\/pre>",
            "date_published": "2022-12-22T11:50:33+03:00",
            "date_modified": "2023-11-15T18:52:43+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "портфолио",
                "таблицы",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/image-12.png",
            "_date_published_rfc2822": "Thu, 22 Dec 2022 11:50:33 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "471",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/image-12.png",
                    "https:\/\/blog.fossko.ru\/pictures\/image-11.png",
                    "https:\/\/blog.fossko.ru\/pictures\/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script.png"
                ]
            }
        },
        {
            "id": "465",
            "url": "https:\/\/blog.fossko.ru\/all\/otpravlyaem-novye-statyi-iz-rss-v-telegram\/",
            "title": "Отправляем новые статьи из РСС в телеграм",
            "content_html": "<p>Удобно присылать новые ссылки на статьи моих подписок РСС в телеграм, так как вся коммуникация уже в нем, фидли почти не использую.<\/p>\n<p>Евгений Гончаров, в статье <a href=\"https:\/\/sys-adm.in\/programming\/805-rss-fider-na-python-s-opravkoj-uvedomlenij-v-telegram.html\" class=\"nu\">«<u>RSS фидер на Python с оправкой уведомлений в Телеграм<\/u>»<\/a> описал весь принцип отправки и использование базы данных для контроля что отправили. <a href=\"https:\/\/github.com\/m0zgen\/rss2bot\/blob\/master\/rss.py\">Готовый код на гитхабе Евгения<\/a><\/p>\n<p>Я внес небольшие изменения в код:<\/p>\n<ul>\n<li>Сообщения в телеграм отправляются с задержкой 1 секунда. Если не использовать таймаут, сервер телеграма, может отправить не все сообщения.<\/li>\n<li>Изменил вид отправки сообщений: добавил переносы строк и автора, если он есть.<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-5.png\" width=\"518\" height=\"904\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В канал телеграма приходят новые сообщения. Проверка РСС проходит с 7 утра до 11 вечера, с интервалом 30 минут.<\/div>\n<\/div>\n<p>Канал открытый, можно подписаться на <a href=\"https:\/\/t.me\/pochitaet\" class=\"nu\">«<u>Почитаем<\/u>»<\/a>, там 95 источников РСС: например, избранное блогов на Эгее, Илья Бирман, Максим Ильяхов, Николай Товеровский, и другие.<\/p>\n<p>В примере скрипта: блоги на Эгее и мой блог.<\/p>\n<p>Скрипт:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/python3\n# Created by Yevgeniy Goncharov, https:\/\/sys-adm.in\n# Script for reading and forwarding to Telegram, rss feeds\n\n\n# Imports\nimport sqlite3\nimport requests\nimport feedparser\nimport os\nimport urllib\nimport random\nimport time\n\n# Bot creds\nbot_token = &#039;bot_token&#039;\nbot_chatID = &#039;bot_chatID&#039;\n\n# Feeds\nmyfeeds = [\n    &#039;https:\/\/blogengine.ru\/blogs\/rss\/&#039;,\n    &#039;http:\/\/blog.fossko.ru\/rss\/&#039;,\n\n]\n\n# User agents\nuags = [\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/13.1.1 Safari\/605.1.15&#039;,\n  &#039;Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko\/20100101 Firefox\/77.0&#039;,\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/83.0.4103.97 Safari\/537.36&#039;,\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko\/20100101 Firefox\/77.0&#039;,\n  &#039;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/83.0.4103.97 Safari\/537.36&#039;,\n]\n\n# Random User Agent (from uags list)\nua = random.choice(uags)\n\n# Header\nheaders = {\n  &quot;Connection&quot; : &quot;close&quot;,  # another way to cover tracks\n  &quot;User-Agent&quot; : ua\n}\n\n# Proxies\nproxies = {\n}\n\n# DB\nscriptDir = os.path.dirname(os.path.realpath(__file__))\ndb_connection = sqlite3.connect(scriptDir + &#039;\/rss.sqlite&#039;)\ndb = db_connection.cursor()\ndb.execute(&#039;CREATE TABLE IF NOT EXISTS myrss (title TEXT, date TEXT)&#039;)\n\n# Get posts from DB and print\ndef get_posts():\n    with db_connection:\n        db.execute(&quot;SELECT * FROM myrss&quot;)\n       # print(db.fetchall())\n\n# Check post in DB\ndef article_is_not_db(article_title, article_date):\n    db.execute(&quot;SELECT * from myrss WHERE title=? AND date=?&quot;, (article_title, article_date))\n    if not db.fetchall():\n        return True\n    else:\n        return False\n\n# Add post to DB\ndef add_article_to_db(article_title, article_date):\n    db.execute(&quot;INSERT INTO myrss VALUES (?,?)&quot;, (article_title, article_date))\n    db_connection.commit()\n\n# Send notify to Telegram bot\ndef bot_sendtext(bot_message):\n    #bot_message = urllib.parse.quote(bot_message)\n    bot_message = bot_message\n    send_text = &#039;https:\/\/api.telegram.org\/bot&#039; + bot_token + &#039;\/sendMessage?chat_id=&#039; + bot_chatID + &#039;&amp;parse_mode=Markdown&amp;text=&#039; + bot_message\n    requests.get(send_text, proxies=proxies, headers=headers)\n    print(send_text)\n\n# Check, read articles\ndef read_article_feed(feed):\n    &quot;&quot;&quot; Get articles from RSS feed &quot;&quot;&quot;\n    feedparser.USER_AGENT = ua\n    feed = feedparser.parse(feed)\n    print(feed)\n    for article in feed[&#039;entries&#039;]:\n        if article_is_not_db(article[&#039;title&#039;], article[&#039;published&#039;]):\n            add_article_to_db(article[&#039;title&#039;], article[&#039;published&#039;])\n           # bot_sendtext(&#039;New feed found &#039; + article[&#039;title&#039;] +&#039;, &#039; + article[&#039;link&#039;] + &#039;, &#039; + article[&#039;description&#039;])\n            try:\n                rss_autor = article[&#039;author&#039;] +&#039;%0A%0A&#039;\n            except:\n                rss_autor = &quot;&quot;\n            MSGsend=&#039;*&#039;+ article[&#039;title&#039;] + &#039;*%0A%0A&#039; + rss_autor + article[&#039;link&#039;]\n            MSGsend=MSGsend.replace(&quot;_&quot;, &quot;\\_&quot;)  # замена подчеркивания для отправки в ТГ\n            bot_sendtext(MSGsend)            \n            time.sleep(1)\n           # print(article)\n\n# Rotate feeds array\ndef spin_feds():\n    for x in myfeeds:\n       # print(x)\n        read_article_feed(x)\n\n# Runner :)\nif __name__ == &#039;__main__&#039;:\n    spin_feds()\n    # get_posts()\n    db_connection.close()<\/code><\/pre>",
            "date_published": "2022-10-10T10:10:19+03:00",
            "date_modified": "2023-11-15T18:52:55+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "питон",
                "портфолио",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/image-5.png",
            "_date_published_rfc2822": "Mon, 10 Oct 2022 10:10:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "465",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/image-5.png"
                ]
            }
        },
        {
            "id": "446",
            "url": "https:\/\/blog.fossko.ru\/all\/avtorizaciya-na-sayte-cherez-piton\/",
            "title": "Авторизация на сайте через питон",
            "content_html": "<p>По материалам статьи: <a href=\"https:\/\/gadjimuradov.ru\/post\/python-requests-avtorizaciya-na-sajte\/\">Python requests. Авторизация на сайте<\/a><\/p>\n<p>Я описал <a href=\"\/all\/parsing-saytov-cherez-piton\/\">как парсить сайты через модуль requests<\/a>. Бывают случаи когда для части сайта нужна авторизация, то есть логин и пароль.<\/p>\n<p>Для авторизации нужно поддерживать активную сессию в модуле requests, через session.get()<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg\" width=\"377\" height=\"120\" alt=\"\" \/>\n<div class=\"e2-text-caption\">session.get(url) вместо requests.get(url)<\/div>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">import requests\nimport re\nfrom bs4 import BeautifulSoup\nimport pandas as pd\n\nurl = &#039;https:\/\/freelance.ru\/login\/&#039;\n\n# Важно. По умолчанию requests отправляет вот такой \n# заголовок &#039;User-Agent&#039;: &#039;python-requests\/2.22.0 ,  а это приводит к тому , что Nginx\n# отправляет 404 ответ. Поэтому нам нужно сообщить серверу, что запрос идет от браузера  \n\nuser_agent_val = &#039;Mozilla\/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/88.0.4324.104 Safari\/537.36&#039;\n\n# Создаем сессию и указываем ему наш user-agent\nsession = requests.Session()\nr = session.get(url, headers = {\n    &#039;User-Agent&#039;: user_agent_val\n})\n\n# Указываем referer. Иногда , если не указать , то приводит к ошибкам. \nsession.headers.update({&#039;Referer&#039;:url})<\/code><\/pre><p>В оригинальной статье было снимание куков, я не совсем понимаю когда использовать. В данном скрипе, я это не использую.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">_xsrf = session.cookies.get(&#039;_xsrf&#039;, domain=&quot;.freelance.ru&quot;)<\/code><\/pre><p>Дальше посылаем post-запрос<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">login = &quot;xxxx&quot;\npasswd = &quot;xxxx&quot;\n\npost_request = session.post(url, {\n    &#039;login&#039;: login ,\n    &#039;passwd&#039;: passwd,\n    &quot;check_ip&quot;: &quot;on&quot;,\n    &quot;submit&quot;: &quot;%C2%F5%EE%E4&quot;,\n    &quot;auth&quot;: &quot;auth&quot;,\n    &quot;return_url&quot;: &quot;\/login\/&quot;\n})<\/code><\/pre><p>Для того чтобы узнать пост запрос, нужно зайти в инспектор кода, вкладка сеть, и найти запрос который посылается<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"638\" data-ratio=\"0.70419426048565\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.13.34.jpg\" width=\"638\" height=\"906\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.14.23.jpg\" width=\"615\" height=\"880\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">В submit я подставил значение из не декодированного вида.<\/div>\n<\/div>\n<p>Теперь переходим в закрытый раздел, обновляем сессию и снимаем данные<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &quot;https:\/\/freelance.ru\/setup\/&quot;\nr = session.get(url)\nsoup = BeautifulSoup(r.text, &quot;lxml&quot;)\nsoup<\/code><\/pre><div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"744\" data-ratio=\"3.7766497461929\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.07.28.jpg\" width=\"744\" height=\"197\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-15.07.44.jpg\" width=\"462\" height=\"285\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Мой рейтинг на этом сервисе.<\/div>\n<\/div>\n<p>Дальше можно снимать нужную информацию, <a href=\"\/all\/parsing-saytov-cherez-piton\/\">используя BeautifulSoup<\/a><\/p>\n<p>Для библиотеки Requests, есть хорошие статьи от Александра, pythonru<\/p>\n<p><a href=\"https:\/\/pythonru.com\/biblioteki\/kratkoe-rukovodstvo-po-biblioteke-python-requests\">Краткое руководство по библиотеке Python Requests<\/a> — рассказывает кратко, как пользоваться библиотекой.<\/p>\n<p><a href=\"https:\/\/pythonru.com\/biblioteki\/prodvinutoe-rukovodstvo-po-biblioteke-python-requests\">Продвинутое руководство по библиотеке Python Requests<\/a> — дополнительная информация, по объектам session, сертификатам SSL, прокси.<\/p>\n",
            "date_published": "2021-02-05T15:11:29+03:00",
            "date_modified": "2022-11-21T11:28:46+03:00",
            "tags": [
                "аналитика",
                "парсинг",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg",
            "_date_published_rfc2822": "Fri, 05 Feb 2021 15:11:29 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "446",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.01.48.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.13.34.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-14.14.23.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/frilans---Jupyter-Notebook---Google-Chrome-2021-02-05-15.07.28.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Freelance.Ru-_-Nastroyki---Moy-kabinet---Google-Chrome-2021-02-05-15.07.44.jpg"
                ]
            }
        },
        {
            "id": "443",
            "url": "https:\/\/blog.fossko.ru\/all\/parsing-saytov-cherez-piton-modulem-selenium\/",
            "title": "Парсинг сайтов через питон модулем selenium",
            "content_html": "<p>Работа идет через модуль selenium, для него нужно скачать <a href=\"https:\/\/chromedriver.chromium.org\/downloads\"> Chrome driver<\/a> и браузер Chrome.<br \/>\nВажно чтобы версия  браузера и Chrome driver была одна и та же<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"779\" data-ratio=\"2.2449567723343\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Nastroyki-O-brauzere-Chrome---Google-Chrome-2021-01-22-16.29.14.jpg\" width=\"779\" height=\"347\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Downloads---ChromeDriver---WebDriver-for-Chrome---Google-Chrome-2021-01-22-16.29.42.jpg\" width=\"745\" height=\"390\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Версию браузера смотрим Справка → О браузере, и сверяемся с версией хром драйвер.<\/div>\n<\/div>\n<p>Чтобы точно быть уверенным, что все работает установите библиотеку selenium, импортируйте ее и запустите браузер через хром драйвер.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">pip install selenium\nfrom selenium.webdriver import Chrome\nbrowser = Chrome (&quot;d:\\del\\chromedriver_win32\\chromedriver.exe&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.34.08.jpg\" width=\"755\" height=\"246\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/data_,---Google-Chrome-2021-01-22-16.35.27.jpg\" width=\"822\" height=\"669\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Если все корректно, запускается хром в режиме: «Браузером управляет тестовое ПО»<\/div>\n<\/div>\n<p>В тестовом браузере будут выполнятся все команды.<\/p>\n<p>Импортируем необходимые библиотеки<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">from selenium.webdriver import Chrome\nfrom selenium.webdriver.common.keys import Keys\nfrom selenium.webdriver.support.ui import WebDriverWait as wait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom selenium.common.exceptions import NoSuchElementException\nfrom bs4 import BeautifulSoup\nfrom time import sleep<\/code><\/pre><p>Переход на сайт<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &quot;https:\/\/bus.gov.ru\/registry&quot;\nbrowser.get(url)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.38.35.jpg\" width=\"1131\" height=\"605\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В тестовом браузере открылся сайт <a href=\"https:\/\/bus.gov.ru\/registry\">https:\/\/bus.gov.ru\/registry<\/a><\/div>\n<\/div>\n<p>Нужно ввести в строке поиска «онкологический диспансер»<\/p>\n<p>Способ 1<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">input_el = browser.find_element_by_tag_name(&quot;input&quot;)\ninput_el.send_keys(&quot;онкологический диспансер&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.08.jpg\" width=\"951\" height=\"488\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Вводится наименование в поле <i>input<\/i><\/div>\n<\/div>\n<p>Нажать энтер или кнопку найти.<\/p>\n<p>Нажатие кнопки энтер:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">input_el.send_keys(Keys.ENTER)<\/code><\/pre><p>Нажатие кнопки найти:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">browser.find_element_by_xpath(&quot;\/html\/body\/div[2]\/ui-view\/form\/div[2]\/div\/div[2]\/div\/button&quot;).click()<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.33.jpg\" width=\"1110\" height=\"448\" alt=\"\" \/>\n<div class=\"e2-text-caption\">После выполнения кода браузер ищет диспансеры<\/div>\n<\/div>\n<p>Дальше работаем как <a href=\"\/all\/parsing-saytov-cherez-piton\/\">при простом парсинге сайта<\/a><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">soup = BeautifulSoup(browser.page_source, &quot;lxml&quot;)\nsoup<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.51.45.jpg\" width=\"1102\" height=\"324\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В переменной <i>soup<\/i> вся текущая страница<\/div>\n<\/div>\n<p>Смотрим где содержится название учреждения и ссылка на него<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">soup.find (&quot;a&quot;, class_=&quot;result__button&quot;).get(&quot;href&quot;)\nsoup.find(&quot;a&quot;,class_=&quot;result__title&quot;).text<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.53.27.jpg\" width=\"1137\" height=\"220\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Для получения части ссылки используем запрос <i>get<\/i>, для названия <i>text<\/i><\/div>\n<\/div>\n<p>Чтобы не искать по всей странице, можно оставить информацию которая нам нужна, она содержится к контейнере c классом <i>results<\/i><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">orgs=soup.findAll(&quot;div&quot;,class_=&quot;result&quot;)\norgs<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.55.56.jpg\" width=\"1019\" height=\"390\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Содержимое всех контейнеров <i>result<\/i><\/div>\n<\/div>\n<p>Обработка текущей страницы<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">data = []\nfor el in orgs:\n    name = el.find(&quot;a&quot;, class_=&quot;result__title&quot;).text\n    link = &quot;https:\/\/bus.gov.ru\/registry&quot; + el.find(&quot;a&quot;, class_=&quot;result__button&quot;).get(&quot;href&quot;)\n    #print (name, link)\n    data.append([name,link])\ndata<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.57.40.jpg\" width=\"1112\" height=\"373\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Названия учреждений и ссылка на страницу с описанием<\/div>\n<\/div>\n<p>Нужно нажимать на страницу «следующая»<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">next_button = browser.find_element_by_class_name(&quot;pagination__next&quot;)\nnext_button.click()<\/code><\/pre><p>Код нажимает на элемент с классом <i>pagination__next<\/i><\/p>\n<p>Готовый код для сбора всей информации<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &#039;https:\/\/bus.gov.ru\/registry&#039;\nbrowser.get(url)\nsleep(5)\ninput_el = browser.find_element_by_tag_name(&#039;input&#039;)\ninput_el.send_keys(&#039;онкологический диспансер&#039;)\ninput_el.send_keys(Keys.ENTER)\nsleep(5)\n\ndata = []\n\n\nfor i in range(10):\n    \n    soup = BeautifulSoup(browser.page_source, &quot;lxml&quot;)\n    orgs = soup.findAll(&#039;div&#039;, class_=&#039;result&#039;)\n    \n    for el in orgs:\n        name = el.find(&#039;a&#039;, class_=&#039;result__title&#039;).text\n        link = &quot;https:\/\/bus.gov.ru&quot;+el.find(&#039;a&#039;, class_=&#039;result__button&#039;).get(&#039;href&#039;)\n        print(name, link)\n        \n\n        data.append([name, link])\n        \n    print(len(data))\n    try:\n        next_button = browser.find_element_by_class_name(&#039;pagination__next&#039;)\n        next_button.click()\n    except NoSuchElementException:\n        continue\n    sleep(6)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-17.01.04.jpg\" width=\"1138\" height=\"457\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Все данные попадают в таблицу <i>data<\/i>, в ней столбец с наименованием и ссылка<\/div>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/xhEhlyFn1vM?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Подробный вебинар про модуль selenium, используется <a href=\"https:\/\/www.anaconda.com\/products\/individual\">среда разработки Анаконда<\/a> с модулем Юпитер. Во второй части парсится сайт с судебными решениями.<\/div>\n<\/div>\n",
            "date_published": "2021-01-22T17:03:17+03:00",
            "date_modified": "2023-11-15T18:52:30+03:00",
            "tags": [
                "аналитика",
                "парсинг",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Nastroyki-O-brauzere-Chrome---Google-Chrome-2021-01-22-16.29.14.jpg",
            "_date_published_rfc2822": "Fri, 22 Jan 2021 17:03:17 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "443",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js",
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Nastroyki-O-brauzere-Chrome---Google-Chrome-2021-01-22-16.29.14.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Downloads---ChromeDriver---WebDriver-for-Chrome---Google-Chrome-2021-01-22-16.29.42.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.34.08.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/data_,---Google-Chrome-2021-01-22-16.35.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.38.35.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.08.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Reestr-organizaciy---Google-Chrome-2021-01-22-16.41.33.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.51.45.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.53.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.55.56.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-16.57.40.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/selenium---Jupyter-Notebook---Google-Chrome-2021-01-22-17.01.04.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-xhEhlyFn1vM-cover.jpg"
                ]
            }
        },
        {
            "id": "442",
            "url": "https:\/\/blog.fossko.ru\/all\/parsing-saytov-cherez-piton\/",
            "title": "Парсинг сайтов через питон",
            "content_html": "<p>Устанавливаем и импортируем библиотеки в питон<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">pip install requests\npip install pandas\nimport requests\nfrom bs4 import BeautifulSoup\nimport pandas as pd\nfrom time import sleep<\/code><\/pre><p>Переменной <i>url<\/i> присваиваем  ссылку на страницу кинопоиска, в переменную <i>r<\/i> результат гет запроса к этой странице<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">url = &quot;https:\/\/www.kinopoisk.ru\/s\/type\/film\/list\/1\/find\/%F1%E5%EA%F1\/&quot;\nr = requests.get(url)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.53.48.jpg\" width=\"1162\" height=\"429\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Текстовое содержимое страницы сайта — <i>r.text<\/i><\/div>\n<\/div>\n<p>Переведем содержимое страницы в формат кода<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">soup = BeautifulSoup(r.text, &quot;lxml&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.56.04.jpg\" width=\"1147\" height=\"412\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Содержимое переменной — <i>soup<\/i><\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Rezultaty-poiska-(922)---Google-Chrome-2021-01-21-13.01.03.jpg\" width=\"1629\" height=\"461\" alt=\"\" \/>\n<div class=\"e2-text-caption\">При помощи инспектора кода находим контейнеры с названием фильма, годом, названием на языке оригинала и баллом кинопоиска<\/div>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">russian_name = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;, class_ = &quot;js-serp-metrika&quot;).text\nrussian_name\noriginal_name = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;span&#039;, class_ = &quot;gray&quot;).text\noriginal_name\nyear = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;span&#039;, class_ = &quot;year&quot;).text\nyear\nkinopoisk = soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;div&#039;, class_ = &quot;rating&quot;).text\nkinopoisk<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.04.12.jpg\" width=\"1150\" height=\"475\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Все данные по первому фильму встречающемуся на странице<\/div>\n<\/div>\n<p>Находим контейнер с кусочком кода и генерируем ссылку на фильм<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">link = &quot;https:\/\/www.kinopoisk.ru&quot; +soup.find(&#039;div&#039;,class_ = &quot;element&quot;).find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;).get(&quot;data-url&quot;)\nlink<\/code><\/pre><div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1253\" data-ratio=\"9.7890625\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.06.27.jpg\" width=\"1253\" height=\"128\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.08.59.jpg\" width=\"1121\" height=\"164\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Готовая ссылка на фильм и контейнер содержащий ссылку<\/div>\n<\/div>\n<p>Можно составить код, который сделает таблицу, содержащую все фильмы с данной таблицы<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">data = []\nfilms =soup.findAll(&quot;div&quot;,class_ = &quot;element&quot;)\nfor film in films:\n    russian_name = film.find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;, class_ = &quot;js-serp-metrika&quot;).text\n    original_name = film.find(&#039;span&#039;, class_ = &quot;gray&quot;).text\n    \n    try:\n        year = film.find(&#039;span&#039;, class_ = &quot;year&quot;).text\n    except:\n        year = &quot;&quot;\n    \n    try:\n        kinopoisk = film.find(&#039;div&#039;, class_ = &quot;rating&quot;).text\n    except:\n        kinopoisk = &quot;&quot;\n    \n    link = &quot;https:\/\/www.kinopoisk.ru&quot; +film.find(&#039;div&#039;, class_ = &quot;info&quot;).find(&#039;a&#039;).get(&quot;data-url&quot;)\n  \n    #print (russian_name)\n    #print (original_name)\n    #print (year)\n    #print (kinopoisk)\n    #print (link)\n    data.append([russian_name, original_name,year,kinopoisk,link  ])<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.12.30.jpg\" width=\"1015\" height=\"439\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Содержимое таблицы <i>data<\/i><\/div>\n<\/div>\n<p>Мы можем собрать все фильмы с одной страницы. Теперь нужно сделать цикл для сбора со всех страниц данного раздела. В этом разделе 11 страниц, значит нужен цикл для формирования списка страниц<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">for page in range(1,12):\n    url = f&quot;https:\/\/www.kinopoisk.ru\/s\/type\/film\/list\/1\/find\/%F1%E5%EA%F1\/order\/relevant\/page\/{str(page)}\/&quot;\n    print(url)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.15.33.jpg\" width=\"1030\" height=\"328\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат выполнения цикла <i>for<\/i> с полученными страницами<\/div>\n<\/div>\n<p>Теперь можно дополнить весь код. Не забываем про слип, так как на многих сайтах стоит защита от парсинга<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">data = []\n\nfor page in range(1,12):\n    url = f&quot;https:\/\/www.kinopoisk.ru\/s\/type\/film\/list\/1\/find\/%F1%E5%EA%F1\/order\/relevant\/page\/{str(page)}\/&quot;\n    print(url)\n    \n    r = requests.get(url)\n    sleep(40)\n    soup = BeautifulSoup(r.text, &quot;lxml&quot;)\n    \n    films = soup.findAll(&quot;div&quot;, class_ =&quot;element&quot;)\n\n    for film in films:\n        \n        russian_name = film.find(&quot;div&quot;, class_=&quot;info&quot;).find(&quot;a&quot;).text\n       # print(russian_name)\n    \n        original_name = film.find(&quot;div&quot;, class_=&quot;info&quot;).find(&quot;span&quot;, class_=&quot;gray&quot;).text\n    \n        year = film.find(&quot;span&quot;, class_=&quot;year&quot;).text\n\n        try:\n            year = film.find(&quot;div&quot;, class_= &quot;span&quot;).text\n        except:\n            year = &quot;&quot;\n        \n        try:\n            rate = film.find(&quot;div&quot;, class_= &quot;rating&quot;).text\n        except:\n            rate = &quot;&quot;\n    \n        link = &quot;https:\/\/www.kinopoisk.ru&quot;+film.find(&quot;div&quot;, class_=&quot;info&quot;).find(&quot;a&quot;).get(&quot;data-url&quot;)\n    \n        data.append([russian_name, original_name, year, link])<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.18.07.jpg\" width=\"1000\" height=\"304\" alt=\"\" \/>\n<div class=\"e2-text-caption\">По мере прохождения страниц, будут печатаются страницы на которых находится сейчас робот<\/div>\n<\/div>\n<p>Делаем заголовки таблицы и выгружаем в файл csv<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">header = [&#039;russian_name&#039;, &#039;original_name&#039;, &#039;year&#039;, &#039;link&#039;]\ndf = pd.DataFrame(data, columns = header)\ndf.head()\n\ndf.to_csv(&quot;d:\\data_kino.csv&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.21.39.jpg\" width=\"1100\" height=\"372\" alt=\"\" \/>\n<div class=\"e2-text-caption\">получившаяся таблица с выгрузкой<\/div>\n<\/div>\n<p>Можно и в питоне получить список всех ссылок на фильмы, работая с таблицей<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">for i in data:\n    #print (i)\n    link = i[3]\n    print (link)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.23.49.jpg\" width=\"625\" height=\"357\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/ZhTf6NIVLEU?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<div class=\"e2-text-caption\">Вебинар курса «Веб-скрейпинг для журналистов. С программированием и без». Используется среда разработки <a href=\"https:\/\/www.anaconda.com\/products\/individual\">Анаконда<\/a>.<\/div>\n<\/div>\n",
            "date_published": "2021-01-21T13:25:45+03:00",
            "date_modified": "2023-11-15T18:53:07+03:00",
            "tags": [
                "аналитика",
                "парсинг",
                "питон"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.53.48.jpg",
            "_date_published_rfc2822": "Thu, 21 Jan 2021 13:25:45 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "442",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.53.48.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-12.56.04.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Rezultaty-poiska-(922)---Google-Chrome-2021-01-21-13.01.03.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.04.12.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.06.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.08.59.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.12.30.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.15.33.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.18.07.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.21.39.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/urok-zhurnalisty-piton---Jupyter-Notebook---Google-Chrome-2021-01-21-13.23.49.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/remote\/youtube-ZhTf6NIVLEU-cover.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}