Парсинг rss ленты с защитой от ботов
Имеется rss лента: "https://tass.ru/rss/v2.xml". Необходимо получить содержимое ленты либо через feedparser, либо через requests. Ни то, ни другое соответственно не работает, т.к сервер имеет механизм защиты от ботов. Прочитать удалось только одним способом, скопировать в headers данные из отладчика в браузере значения cookies и user-agent. Но такой способ не работает на удаленном сервере. Если сделать запрос на удаленном сервере, с headers-ами домашнего пк, то приходит ответ примерно следующего содержимого: "<meta name="robots" content="noindex, noarchive"...". Вопрос в следующем как прочитать эту ленту, не прописывая headers, т.к это не работает на удаленном сервере?
Ответы (1 шт):
Надеюсь это Вам поможет
pip install requests-html
from requests_html import HTMLSession
s = HTMLSession()
response = s.get('https://tass.ru/rss/v2.xml')
response.html.render(
wait=8,
timeout=10,
sleep=4
)
with open('item.xml', 'wb') as file:
file.write(
response.html.raw_html
)
<html xmlns="http://www.w3.org/1999/xhtml"><head><style id="xml-viewer-style">/* Copyright 2014 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
div.header {
border-bottom: 2px solid black;
padding-bottom: 5px;
margin: 10px;
}
div.collapsible > div.hidden {
display:none;
}
.pretty-print {
margin-top: 1em;
margin-left: 20px;
font-family: monospace;
font-size: 13px;
}
#webkit-xml-viewer-source-xml {
display: none;
}
.collapsible-content {
margin-left: 1em;
}
.comment {
white-space: pre;
}
.button {
-webkit-user-select: none;
cursor: pointer;
display: inline-block;
margin-left: -10px;
width: 10px;
background-repeat: no-repeat;
background-position: left top;
vertical-align: bottom;
}
.collapse-button {
background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='%23909090' width='10' height='10'><path d='M0 0 L8 0 L4 7 Z'/></svg>");
height: 10px;
}
.expand-button {
background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='%23909090' width='10' height='10'><path d='M0 0 L0 8 L7 4 Z'/></svg>");
height: 10px;
}
</style></head><body><div id="webkit-xml-viewer-source-xml"><rss xmlns="" xmlns:atom="https://www.w3.org/2005/Atom" version="2.0"><channel><title>ТАСС</title>
<description>ИНФОРМАЦИОННОЕ АГЕНТСТВО РОССИИ ТАСС</description>
<language>ru-ru</language>
<link><![CDATA[https://tass.ru]]></link>
<copyright>ТАСС</copyright>
<image><url><![CDATA[https://tass.ru/i/rss/logo.png]]></url>
<title>ТАСС</title>
<link><![CDATA[https://tass.ru]]></link>
</image>
<atom:link href="https://tass.ru/rss/v2.xml" rel="self" type="application/rss+xml"/>
<item><title>Калягин заявил, что никакие санкции не помешают талантам</title>
<link><![CDATA[https://tass.ru/kultura/14379485]]></link>
<guid><![CDATA[https://tass.ru/kultura/14379485]]></guid>
<pubDate>Thu, 14 Apr 2022 18:28:44 +0300</pubDate>
<description>Народный артист РФ отметил, что "ситуация на Украине - это новая реальность, с которой приходится считаться"</description>
<category>Культура</category>
<category>Военная операция на Украине</category>
</item>
<item><title>Отреставрированное историческое здание Литинститута в Москве примет студентов 1 сентября</title>
<link><![CDATA[https://tass.ru/nedvizhimost/14377917]]></link>
<guid><![CDATA[https://tass.ru/nedvizhimost/14377917]]></guid>
<pubDate>Thu, 14 Apr 2022 18:28:31 +0300</pubDate>
<description>Реконструкция объекта идет с 2016 года</description>
<category>Недвижимость</category>
</item>
<item><title>На подготовку к ЕГЭ в дистанционном формате в КБР направят более 30 млн рублей</title>
<link><![CDATA[https://tass.ru/obschestvo/14381127]]></link>
<guid><![CDATA[https://tass.ru/obschestvo/14381127]]></guid>
<pubDate>Thu, 14 Apr 2022 18:26:52 +0300</pubDate>
<description>К проведению экзаменов привлекут 4,5 тыс. специалистов, они проходят подготовку</description>
<category>Общество</category>
<category>Северный Кавказ</category>
</item>
<item><title>Карпов: Федерации шахмат России не стоит выходить из Европейского шахматного союза</title>
<link><![CDATA[https://tass.ru/sport/14381147]]></link>
<guid><![CDATA[https://tass.ru/sport/14381147]]></guid>
<pubDate>Thu, 14 Apr 2022 18:26:10 +0300</pubDate>
<description>В четверг наблюдательный совет Федерации шахмат России единогласно проголосовал за вхождение в состав участников Азиатской шахматной федерации</description>
<category>Спорт</category>
...
Можно так чтобы получить XML в чистом виде
from requests_html import HTMLSession
from bs4 import BeautifulSoup as Soup
s = HTMLSession()
response = s.get('https://tass.ru/rss/v2.xml')
response.html.render(
wait=8,
timeout=10,
sleep=4
)
soup = Soup(response.html.raw_html, 'html.parser')
with open('item.xml', 'w', encoding='utf-8') as file:
file.write(
soup.find(id="webkit-xml-viewer-source-xml").find('rss').prettify()
)