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
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. Для соседних задач пригодятся эти разборы:
- Как подключить HTML к Python через Flask: первый шаблон и обработка формы
- Как подключить HTML к Python: Flask, шаблоны и простой пример
- Face recognition Python: как установить и что делать при ошибках dlib
- Pandas и Matplotlib с Python: основы анализа данных