Каким образом можно извлечь все ссылки с веб-сайта?

Как с помощью кода на Python получить все ссылки, доступные на сайте, включая поддомены и страницы, например:  
- *.example.com/*  
- example.com/forum  
- example.com/about  

То есть, как просканировать весь сайт?
  • 15 октября 2024 г. 20:42
Ответы на вопрос 2
Чтобы извлечь все ссылки с веб-сайта с использованием Python, можно использовать библиотеки, такие как `requests` для получения HTML-кода страниц и `BeautifulSoup` для его парсинга. Также можно использовать библиотеку `urllib` для работы с URL.

Однако стоит отметить, что сканирование веб-сайтов должно проводиться с осторожностью и уважением к правилам `robots.txt`, которые могут ограничивать доступ к определенным частям сайта. Перед тем как сканировать сайт, всегда проверяйте его политику в отношении веб-сканирования.

Вот пример простого скрипта, который будет извлекать ссылки из указанного сайта и его поддоменов:

```python
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import time

# Функция для получения всех ссылок с заданного URL
def get_all_links(url):
    links = set()  # Используем множество для уникальности ссылок
    try:
        response = requests.get(url)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')
            for a_tag in soup.find_all('a', href=True):
                href = a_tag['href']
                full_url = urljoin(url, href)  # Преобразуем относительные URL в абсолютные
                # Проверяем, что ссылка относится к домену
                if urlparse(full_url).netloc == urlparse(url).netloc:
                    links.add(full_url)
    except Exception as e:
        print(f"Error: {e}")
    return links

# Основная функция для запуска сканирования
def crawl_website(start_url, max_depth=2):
    visited = set()
    to_visit = {start_url}
    
    while to_visit and max_depth > 0:
        current_url = to_visit.pop()
        if current_url not in visited:
            print(f"Crawling: {current_url}")
            visited.add(current_url)
            links = get_all_links(current_url)
            to_visit.update(links - visited)  # Добавляем новые ссылки для сканирования
            time.sleep(1)  # Задержка, чтобы не перегружать сервер
        
        max_depth -= 1

    return visited

# Запуск скрипта
if __name__ == "__main__":
    start_url = "https://example.com"  # Укажите URL сайта
    found_links = crawl_website(start_url)
    print("\nFound links:")
    for link in found_links:
        print(link)
```

### Объяснение кода:
1. **get_all_links(url)**: Эта функция получает HTML-код страницы по указанному URL и извлекает все ссылки, проверяя, относятся ли они к тому же домену.
2. **crawl_website(start_url, max_depth=2)**: Основная функция, которая управляет процессом обхода. Она использует множество `visited` для хранения уже посещенных ссылок и множество `to_visit` для ссылок, которые нужно посетить.
3. **time.sleep(1)**: Вставка задержки для предотвращения излишней нагрузки на сервер.
4. **Запуск скрипта**: Задайте начальный URL сайта и запустите скрипт.

### Важное замечание:
- Убедитесь, что вы соблюдаете правила использования сайта.
- Если у сайта есть файл `robots.txt`, проверьте, разрешает ли он обход для ваших целей.
Почитайте про sitemaps 
На примере intelsib.ru
https://intelsib.ru/robots.txt
https://intelsib.ru/sitemap.xml
Похожие вопросы