Passed
Pull Request — master (#44)
by torrua
02:00
created

app.site.functions   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 47
dl 0
loc 68
rs 10
c 0
b 0
f 0

1 Function

Rating   Name   Duplication   Size   Complexity  
B get_data() 0 59 6
1
import re
2
from urllib import request, error
3
4
from bs4 import BeautifulSoup
5
6
from app.logger import log
7
8
9
def get_data(
10
    url: str, parser: str = "lxml", headers: dict = None
11
) -> dict[str, bool | str | BeautifulSoup]:
12
    """
13
    This function downloads and parses content of URL site
14
    :url: address of needed site or directory
15
    :return: dict with elements:
16
             > :"result":  *bool* with result of downloading process
17
             > :"content": *BeautifulSoup* with elements if Result is True
18
                            OR
19
                           *str* with error message if Result is False
20
    """
21
    cntnt, rslt, msg = "content", "result", "message"
22
    pattern_http = "^http"
23
    m_l = {
24
        "start": "Начинаем загрузку данных с сайта",
25
        "error": "Не удалось получить данные:\n\t>> Адрес:\t%s\n\t>> Ошибка:\t%s",
26
        "get_site": "Пробуем скачать данные с ресурса",
27
        "url_check": "Проверяем, являются ли введенные данные адресом веб-страницы",
28
        "url_correct": "Введен корректный адрес веб-страницы:\t%s",
29
        "path_check": "Проверяем, являются ли введенные данные адресом файла \n\t>> Адрес:\t%s",
30
        "parse": "Пробуем обработать полученные данные",
31
        "agent": "Содержиимое строки headers:\n\t>>\t%s",
32
        "success": "Данные с сайта успешно загружены",
33
    }
34
35
    log.info(m_l["start"])
36
    log.debug(m_l["url_check"])
37
38
    if re.match(pattern_http, url):
39
        log.debug(m_l["url_correct"], url)
40
        try:
41
            log.debug(m_l["get_site"])
42
            request_to_site = request.Request(
43
                url=url, headers=headers if headers else {}
44
            )
45
            response = request.urlopen(request_to_site)
46
        except (error.URLError, error.HTTPError) as err:
47
            log.error(m_l["error"], url, err)
48
            log.error(m_l["agent"], headers)
49
            return {rslt: False, cntnt: str(err), msg: 5152}
50
51
        try:
52
            log.debug(m_l["parse"])
53
            site_data = BeautifulSoup(response, parser)
54
        except error.HTTPError as err:
55
            log.error(m_l["error"], *(url, err))
56
            return {rslt: False, cntnt: str(err), msg: 5152}
57
    else:
58
        log.debug(m_l["path_check"], url)
59
        try:
60
            log.debug(m_l["get_site"])
61
            site_data = BeautifulSoup(open(url), parser)
62
        except (FileNotFoundError, UnicodeDecodeError) as err:
63
            log.error(m_l["error"], *(url, err))
64
            return {rslt: False, cntnt: str(err), msg: 5152}
65
66
    log.info(m_l["success"])
67
    return {rslt: True, cntnt: site_data, msg: None}
68