Python

Как в Python извлечь все ссылки со страницы через requests-html

Если вам нужно получить все ссылки с веб-страницы, в requests-html есть два удобных свойства: r.html.links и r.html.absolute_links

links возвращает ссылки как они есть в HTML. Там могут быть относительные адреса вроде /about

absolute_links возвращает полные адреса с доменом, например https://example.com/about

Для большинства учебных задач лучше начинать с absolute_links, потому что такие ссылки проще сохранять, проверять и открывать повторно

Установка

Создайте папку проекта, например links-demo, и виртуальное окружение

Windows:

py -m venv .venv
.venv\Scripts\activate
python3 -m venv .venv
source .venv/bin/activate

Установите библиотеку:

python -m pip install requests-html

Если установка или запуск ломаются из-за зависимостей, для обычных статичных страниц можно использовать связку requests + beautifulsoup4. Но раз запрос именно про requests-html, начнем с нее

Простой пример

Создайте файл get_links.py

from requests_html import HTMLSession

url = "https://www.python.org/"

session = HTMLSession()
response = session.get(url)

links = response.html.absolute_links

for link in sorted(links):
    print(link)

Запустите файл

Windows:

py get_links.py
python3 get_links.py

В консоли появится список ссылок, найденных на странице

links может вернуть относительный адрес, а absolute_links делает ссылку полной

from requests_html import HTML

html = HTML(
    html='<a href="/about">О нас</a><a href="https://example.com/docs">Документация</a>',
    url="https://example.com"
)

print(html.links)
print(html.absolute_links)

Примерный вывод:

{'/about', 'https://example.com/docs'}
{'https://example.com/about', 'https://example.com/docs'}

Если вы собираете ссылки для дальнейшей обработки, absolute_links обычно удобнее

Как сохранить ссылки в файл

from requests_html import HTMLSession

url = "https://www.python.org/"

session = HTMLSession()
response = session.get(url)

links = sorted(response.html.absolute_links)

with open("links.txt", "w", encoding="utf-8") as file:
    for link in links:
        file.write(link + "\n")

print(f"Сохранено ссылок: {len(links)}")

После запуска рядом с файлом появится links.txt

Как оставить только ссылки своего сайта

from requests_html import HTMLSession
from urllib.parse import urlparse

url = "https://www.python.org/"
base_domain = urlparse(url).netloc

session = HTMLSession()
response = session.get(url)

internal_links = []

for link in response.html.absolute_links:
    if urlparse(link).netloc == base_domain:
        internal_links.append(link)

for link in sorted(internal_links):
    print(link)

Так вы убираете ссылки на другие домены

Что делать со страницами, где ссылки появляются через JavaScript

requests-html умеет пробовать рендерить JavaScript через render()

from requests_html import HTMLSession

url = "https://example.com"

session = HTMLSession()
response = session.get(url)

response.html.render(timeout=20)

for link in sorted(response.html.absolute_links):
    print(link)

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

Если сайт активно строит страницу через JavaScript, для серьезной задачи часто удобнее Playwright или Selenium. А если страница обычная, без JavaScript, обычно хватает requests и BeautifulSoup

Альтернатива через BeautifulSoup

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

url = "https://www.python.org/"
response = requests.get(url, timeout=10)
response.raise_for_status()

soup = BeautifulSoup(response.text, "html.parser")

links = []

for tag in soup.find_all("a", href=True):
    links.append(urljoin(url, tag["href"]))

for link in sorted(set(links)):
    print(link)

Для простых страниц BeautifulSoup часто предсказуемее, но requests-html удобен, когда хочется быстро достать absolute_links

Частые ошибки

Появляются ссылки вида /about

Вы используете links, а не absolute_links. Если нужны полные адреса, берите response.html.absolute_links

Список ссылок пустой

Возможные причины: сайт отдает другой HTML, требует JavaScript, блокирует запросы или ссылки создаются после загрузки страницы

Нужно вывести ссылки, которые посетил браузер

Это другая задача. requests-html читает HTML страницы, но не знает историю вашего браузера

Что почитать дальше по Python

Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x