Здравствуйте!
Сегодня я Вам расскажу про интересную библиотеку для Python под названием Pywebcopy.
PyWebCopy – бесплатный инструмент для копирования отдельных веб-страниц или же полного копирования сайта на жесткий диск.
Модуль обладает такими полезными методами как:
save_webpage() - для сохранения одной страницы;
save_website() - позволяет копировать сайт целиком.
Как предупреждают разработчики используйте save_website() аккуратно, т.к метод отправляет множество запросов, что может повлечь за собой значительную нагрузку на сервер.
Итак, не будем тянуть и приступим к коду. Сначала скачаем необходимые библиотеки:
pip install pywebcopy
pip install validators
Теперь приступаем к написанию скрипта. Для начала импортируем заранее установленные библиотеки:
from pywebcopy import save_webpage, save_website
import validators
Теперь напишем блоки, которые будут скачивать весь веб-сайт или его отдельную страницу:
def webpage(url, folder, name):
save_webpage(
url=url,
project_folder=folder,
project_name=name,
bypass_robots=True,
debug=True,
open_in_browser=True,
delay=None,
threaded=False,
)
def website(url, folder, name):
save_website(
url=url,
project_folder=folder,
project_name=name,
bypass_robots=True,
debug=True,
open_in_browser=True,
delay=None,
threaded=False,
)
Блок webpage скачивает отдельную страницу сайта по ссылке url в папку folder и называет папку с сайтом name. Блок website скачивает весь сайт, а не его отдельную страницу.
Теперь напишем блок, который будет выводить текст красного цвета в терминал, для вывода ошибок.
def warning(text):
print("\033[1m\033[31m{}\033[0m".format(text))
Теперь соединяем всё это вместе:
print("""Выберите цифру:
1 - Сохранить страницу
2 - Сохранить сайт""")
b=False
while b==False:
try:
a = int(input())
if a==1 or a==2:
b=True
else:
warning("Выберите корректный номер!")
except:
warning("Только цифры!")
c=False
while c==False:
url = input("Введите ссылку: ")
if validators.url(url):
c=True
else:
warning("Некорректная ссылка!")
folder=input("Куда сохранять: ")
name=input("Название проекта: ")
if a==1:
webpage(url, folder, name)
else:
website(url, folder, name)
В этом куске кода мы просим пользователя выбрать один из вариантов, или скачать весь сайт или только одну его страницу. Потом делаем проверку того, что пользователь ввел цифру, и что это число равно 1 либо 2. Потом с помощью библиотеки validators проверяем корректность введённой пользователем ссылки, если такая ссылка существует, то просим пользователя ввести путь к папке в которую будет сохранен сайт. А потом просим ввести название проекта. После чего, если все данные введены верно, то начинается закачка сайта на Ваш компьютер.
Ну вроде бы всё. Теперь Вы можете скачивать любой сайт к себе на компьютер. Но будьте окуратны с этим скриптом, так как если попытаться скачать весь сайт YouTube, то комп просто ляжет от огромного размера данных. Удачи!
Вот весь исходный код данного скрипта:
from pywebcopy import save_webpage, save_website
import validators
def warning(text):
print("\033[1m\033[31m{}\033[0m".format(text))
def webpage(url, folder, name):
save_webpage(
url=url,
project_folder=folder,
project_name=name,
bypass_robots=True,
debug=True,
open_in_browser=True,
delay=None,
threaded=False,
)
def website(url, folder, name):
save_website(
url=url,
project_folder=folder,
project_name=name,
bypass_robots=True,
debug=True,
open_in_browser=True,
delay=None,
threaded=False,
)
print("""Выберите цифру:
1 - Сохранить страницу
2 - Сохранить сайт""")
b=False
while b==False:
try:
a = int(input())
if a==1 or a==2:
b=True
else:
warning("Выберите корректный номер!")
except:
warning("Только цифры!")
c=False
while c==False:
url = input("Введите ссылку: ")
if validators.url(url):
c=True
else:
warning("Некорректная ссылка!")
folder=input("Куда сохранять: ")
name=input("Название проекта: ")
if a==1:
webpage(url, folder, name)
else:
website(url, folder, name)
Комментарии (9)
igand
06.06.2022 12:49Что-то параметров маловато. Например, в HTTrack, Teleport и т.п. можно указывать маску файлов для скачивания, глубину перехода по ссылкам и кучу всего ещё.
romaJMG
06.06.2022 13:17+1Наверное это и не позиционируется как замена софту и может быть использовано в консоли, в отличие от ГУИшного софта. В каких то случаях может пригодится, вероятно.
berez
06.06.2022 13:21+7save_website() — позволяет копировать сайт целиком
Да-да, но только если сайт статический и не блокирует массовое скачивание. А вот если у него контент динамически в браузере формируется всякими jquery — тады ой.
MAXH0
06.06.2022 14:19Интересно, а ЯндексДзен скачать получится? С комментариями...
И можно ли задавать только определенного пользователя?Metimol Автор
06.06.2022 14:56В большинстве случаев для доступа к определенной странице требуется аутентификация. Это легко сделать, потому что pywebcopy использует requests.Session объект для базовой http-активности, доступ к которому можно получить через WebPage.session атрибут. И, как вы знаете, существует множество руководств по настройке аутентификации с помощью requests.Session.
Вот пример заполнения форм:
from pywebcopy.configs import get_config config = get_config('http://httpbin.org/') wp = config.create_page() wp.get(config['project_url']) form = wp.get_forms()[0] form.inputs['email'].value = 'bar' # etc form.inputs['password'].value = 'baz' # etc wp.submit_form(form) wp.get_links()
Voldemarius
Обычным wget также можно скачать сайт....
iig
Даже youtube?
LiauchukIvan
Даже google