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