1
|
|
|
from __future__ import annotations |
2
|
|
|
|
3
|
|
|
import re |
4
|
|
|
from urllib.error import HTTPError |
5
|
|
|
from urllib.request import Request, urlopen |
6
|
|
|
|
7
|
|
|
from bs4 import BeautifulSoup |
8
|
|
|
|
9
|
|
|
from app.logger import log |
10
|
|
|
|
11
|
|
|
|
12
|
|
|
def get_data(url: str) -> str | BeautifulSoup: |
13
|
|
|
""" |
14
|
|
|
This function downloads and parses content of URL site |
15
|
|
|
:url: address of needed site or directory |
16
|
|
|
:return: *BeautifulSoup* OR |
17
|
|
|
*str* with error message if Result is False |
18
|
|
|
""" |
19
|
|
|
pattern_http = "^http" |
20
|
|
|
m_l = { |
21
|
|
|
"start": "Начинаем загрузку данных с сайта", |
22
|
|
|
"error": "Не удалось получить данные:\n\t>> Адрес:\t%s\n\t>> Ошибка:\t%s", |
23
|
|
|
"get_site": "Пробуем скачать данные с ресурса", |
24
|
|
|
"url_check": "Проверяем, являются ли введенные данные адресом веб-страницы", |
25
|
|
|
"url_correct": "Введен корректный адрес веб-страницы:\t%s", |
26
|
|
|
"parse": "Пробуем обработать полученные данные", |
27
|
|
|
"success": "Данные с сайта успешно загружены", |
28
|
|
|
} |
29
|
|
|
|
30
|
|
|
log.info(m_l["start"]) |
31
|
|
|
log.debug(m_l["url_check"]) |
32
|
|
|
|
33
|
|
|
if not re.match(pattern_http, url): |
34
|
|
|
return "" |
35
|
|
|
|
36
|
|
|
log.debug(m_l["url_correct"], url) |
37
|
|
|
log.debug(m_l["get_site"]) |
38
|
|
|
|
39
|
|
|
try: |
40
|
|
|
with urlopen(Request(url=url)) as response: |
41
|
|
|
log.debug(m_l["parse"]) |
42
|
|
|
soup = BeautifulSoup(response, "lxml") |
43
|
|
|
log.info(m_l["success"]) |
44
|
|
|
return soup |
45
|
|
|
|
46
|
|
|
except HTTPError as err: |
47
|
|
|
log.error(m_l["error"], url, err) |
48
|
|
|
return str(err) |
49
|
|
|
|