|
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
|
|
|
raise ValueError() |
|
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
|
|
|
raise err |
|
49
|
|
|
|