Вопрос или проблема
Я пытаюсь скачать конкретный файл sitemap.xml (https://www.irna.ir/sitemap/all/sitemap.xml). Проблема в том, что при загрузке конкретного sitemap.xml на несколько секунд появляется белая страница с заголовком (вы перенаправляетесь…), а затем исчезает. Когда я открыл загруженный файл sitemap.xml, он оказался просто HTML файлом с деталями страницы перенаправления, а не тем sitemap.xml, который я хотел.
Часть загруженного файла (sitemap.xml):
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content=
"HTML Tidy for HTML5 for Linux version 5.8.0">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<link href="/cdn-cgi/assets/css/static-pages-2.6.0.css" rel=
"stylesheet">
<link rel="icon" type="image/x-icon" href="//#DOMAIN#/favicon.ico">
<title></title>
</head>
<body>
<section class=
"error-section error-section--waiting error-section--ltr error-section--hide"
id="en">
<div class="container">
<div class=
"error-section__wrapper error-section__wrapper--waiting">
<div class="error-section__information">
<h1 class="error-section__title"></h1>
<h2 class=
"error-section__subtitle error-section__subtitle--waiting">
Transferring to the website...</h2>
</div>
</div>
</div>
</section>
<section class=
"error-section error-section--waiting error-section--hide" id="fa">
<div class="container">
<div class=
"error-section__wrapper error-section__wrapper--waiting">
<div class="error-section__information">
<h1 class="error-section__title"></h1>
<h2 class=
"error-section__subtitle error-section__subtitle--waiting">در ﺣﺎل
اﻧﺘﻘﺎل ﺑﻪ ﺳﺎﯾﺖ ﻣﻮرد ﻧﻈﺮ ﻫﺴﺘﯿﺪ...</h2>
</div>
</div>
</div>
</section>
<script>
var _this = this;
Использованная команда:
wget https://www.irna.ir/sitemap/all/sitemap.xml
Часть того, что я хочу (sitemap.xml):
<sitemapindex xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<sitemap>
<loc>https://www.irna.ir/sitemap/1403/12/22/sitemap.xml</loc>
</sitemap>
<sitemap>
<loc>https://www.irna.ir/sitemap/1403/12/21/sitemap.xml</loc>
</sitemap>
Я хочу скачать содержимое XML файла sitemap.xml, а не начальную страницу (которая у них обеих имеет одинаковый URL)
Это невозможно с традиционными инструментами, такими как wget
или curl
, поскольку xml
создается JavaScript.
Вы можете проверить это, когда возникают такие проблемы, например, с Firefox: откройте about:config
и установите javascript.enabled
в false
, затем перезагрузите страницу.
Что вы можете сделать, так это использовать библиотеку, поддерживающую JavaScript
, на выбранном вами языке.
Я думаю о
- Javascript pptr
- python Selenium
- Microsoft PlayWright
.
Ответ или решение
Проблема, с которой вы столкнулись при загрузке конкретного файла sitemap.xml по указанному URL-адресу и вместо этого получаете HTML-страницу ожидания с перенаправлением, имеет техническое обоснование и требуются определённые знания для решения. Основная проблема заключается в том, что запрашиваемый контент генерируется с использованием JavaScript, тогда как традиционные инструменты, такие как wget
и curl
, не могут обрабатывать JavaScript. Рассмотрим теоретическое обоснование, пример и способы реализации решения.
Теория:
Когда вы открываете страницу в браузере, он не просто загружает HTML-код, но и выполняет JavaScript, загружает дополнительные ресурсы и управляет перенаправлениями. На практике это означает, что такие страницы не могут быть корректно загружены без JavaScript-движка. Инструменты типа wget
и curl
не выполняют JavaScript-код — они просто получают HTML-код, доступный на сервере по первичному запросу, что и приводит к скачиванию статичной HTML-страницы, а не динамически сгенерированных данных, например, sitemap.xml.
Пример:
Пусть есть веб-сайт, который отображает свой контент только после выполнения некоторого JavaScript-кода. Когда вы пытаетесь загрузить его с помощью wget
, он только возвращает статический HTML, который представлен до выполнения JavaScript. Таким образом, без выполнения этого кода нельзя получить истинное содержимое сайта.
Реализация:
Для загрузки динамически созданных данных через JavaScript вам понадобится использовать библиотеку, способную работать с JavaScript. Есть несколько популярных инструментов, которые могут помочь в этом:
-
Puppeteer (для JavaScript): Puppeteer — это библиотека Node.js, предоставляющая высокоуровневый API для управления Google Chrome или Chromium через протокол DevTools. Она отлично подходит для работы с динамическими сайтами и может имитировать действия, аналогичные действиям пользователя в браузере. Puppeteer может использоваться для получения контента, который генерируется после выполнения JavaScript-кода.
-
Selenium (для Python): Selenium — это инструмент для автоматизации веб-приложений. Он написан на различных языках программирования и позволяет управлять браузерами, обеспечить выполнение JavaScript-кода и, таким образом, загружать динамический контент.
-
Playwright (для JavaScript/TypeScript): Playwright — это современный инструмент с возможностями похожими на Puppeteer, но поддерживающий разные браузеры. Он разработан командой Microsoft и предоставляет гибкий API для автоматизации задач в браузере.
Пример использования Python Selenium для решения проблемы:
Чтобы выполнить задачу с помощью Selenium на Python, вам потребуется выполнить следующие шаги:
-
Установите необходимые библиотеки:
pip install selenium
Если вы используете Chrome, загрузите соответствующий драйвер ChromeDriver с официального сайта и укажите путь к нему в коде.
-
Напишите скрипт для автоматизации:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import time # Укажите путь к вашему chrome-драйверу s = Service('/path/to/chromedriver') driver = webdriver.Chrome(service=s) try: driver.get('https://www.irna.ir/sitemap/all/sitemap.xml') # Ожидание выполнения JavaScript-кода и отображения контента time.sleep(5) # Может потребоваться увеличить время ожидания при медленном соединении # Получаем HTML-код страницы после выполнения скрипта page_source = driver.page_source # Сохраните содержимое в файл или обработайте его with open('sitemap.xml', 'w', encoding='utf-8') as file: file.write(page_source) finally: driver.quit()
Этот код открывает указанный URL в Chrome, ждет выполнение JavaScript-кода и сохраняет полученный HTML-контент в файл sitemap.xml
. Время ожидания можно изменить в зависимости от скорости подключения и работы сайта.
Заключение:
Использование инструмента с поддержкой JavaScript, такого как Selenium или Puppeteer, является наиболее эффективным методом для получения динамически генерируемого контента. Эти библиотеки позволяют не только загружать и исполнять JavaScript-код, но и позволяют эмулировать полное взаимодействие с веб-страницами, таким образом добывая необходимую информацию. Также стоит помнить, что автоматизация действий на веб-сайтах может быть ограничена правилами использования данных ресурсов, и перед тем, как проводить подобные операции, важно ознакомиться с соответствующими условиями использования.