• Python requests, при выводе всего сайта выводит body и после него: Request unsuccessful. Как пофиксить?

    ak545
    @ak545
    Yurii Abraham, если на хостинге поставить какой-то из браузеров - да. Правда, боюсь, установка браузера потянет за собой кучу других GUI-зависимостей. Всё таки браузеры разрабатывались для визуализации информации.

    Чтобы не запускать браузеры в режиме GUI их обычно запускают с дополнительными параметрами, типа headless.
    Ниже примеры

    Если FireFox
    pip install selenium
    Драйвера: https://github.com/mozilla/geckodriver/releases
    from selenium import webdriver
    from selenium.webdriver.firefox.options import Options
    
    options = Options()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    options.add_argument('--hide-scrollbars')
    driver = webdriver.Firefox(options=options)
    url = 'https://eldorado.ua/uk/vytjazhka-gunter-hauer-agna-600-gl/p71226038/'
    driver.get(url)
    html = driver.page_source
    driver.quit()
    print(html)


    Если Chrome (надо сперва узнать какой версии)
    pip install selenium
    Драйвера: https://sites.google.com/a/chromium.org/chromedriv...

    Драйвера можно ставить руками или сразу из скрипта, например, при помощи этого пакета (это справедливо и для FireFox):
    pip install webdriver-manager
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from webdriver_manager.chrome import ChromeDriverManager
    
    options = Options()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    driver = webdriver.Chrome(
        ChromeDriverManager(version="91.0.4472.19").install(), 
        options=options
    )
    url = 'https://eldorado.ua/uk/vytjazhka-gunter-hauer-agna-600-gl/p71226038/'
    driver.get(url)
    html = driver.page_source
    driver.quit()
    print(html)


    И есть ещё и другие пути (типа Selenium Server или PhantomJS), но они устарели и не рекомендуются для использования разработчиками Selenium.
    И да, под Chrome обойти защиту не удалось (разбираться не стал).
    "Из коробки" работает только под FireFox.

    P.S. Общаться в социальных сетях желания нет.
  • Как словарь сделать глобальным?

    ak545
    @ak545
    o5a, да, действительно.
    Но тогда и у автора вопроса некорректный пример в коде и он не вызовет такую ошибку.

    takecake, укажите именно тот пример Вашего кода, который приводит к данной ошибке. Чуется мне, что active_list Вы определяете совсем не там и не так, как в приведённом здесь фрагменте.
  • Как исправить reponse 401?

    ak545
    @ak545
    soremix, если сайт требует куки, то да.
  • Как словарь сделать глобальным?

    ak545
    @ak545
    Добавлю:

    объявление внутри функции переменной как global требуется только тогда, когда этой переменной требуется присвоить некое значение. Если нам требуется только читать значения из этой переменной, то можно обойтись без директивы global так как переменная active_list в Вашем случае уже глобальная по отношению к функции on_click ибо объявлена и инициализирована выше уровнем.

    Поясню на примере:

    ACTIVE_LIST = {
         'DPM1': 1,
         'DPM2': 2,
         'DPM3': 3,
    }
    
    
    def func1():
        print(ACTIVE_LIST['DPM1'])
    
    
    def func2():
        global ACTIVE_LIST
        ACTIVE_LIST['DPM1'] = 3
        print(ACTIVE_LIST['DPM1'])
    
    
    func1()
    ``` 1
    
    func2()
    ``` 3
    
    func1()
    ``` 3


    И да, это не обязательно, но рекомендации PEP советуют именовать такие глобальные переменные или константы в верхнем регистре.
  • Как исправить reponse 401?

    ak545
    @ak545
    import sys
    import requests
    from requests.auth import HTTPBasicAuth
    
    REQUEST_HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                           'AppleWebKit/537.36 (KHTML, like Gecko) '
                           'Chrome/91.0.4472.77 Safari/537.36',
    }
    
    # Пример авторизации по HTACCESS логину и паролю
    
    HT_LOGIN = ''
    HT_PASSWORD = ''
    
    url = f'https://....'
    # Работать лучше через сессии
    s = requests.session()
    try:
         # GET запрос
         result = s.get(
             url,
             auth=HTTPBasicAuth(HT_LOGIN, HT_PASSWORD),
             timeout=60,
             headers=REQUEST_HEADERS,
             verify=True
         )
         result.raise_for_status()
         html = result.text
    except requests.exceptions.RequestException as e:
        print(f'Не получилось подключиться к сайту: {url}\n{e}')
        sys.exit(-1)
    
    # Далее пример если кроме HTACCESS имеется ещё и 
    # форма авторизации, например, с полями 'login' и 'password'
    
    LOGIN = ''
    PASSWORD = ''
    try:
         # Для передачи данных формы требуется POST запрос
         result = s.post(
             url,
             auth=HTTPBasicAuth(HT_LOGIN, HT_PASSWORD),
             data=[('login', LOGIN), ('password', PASSWORD)],
             timeout=60,
             headers=REQUEST_HEADERS,
             verify=True
         )
         result.raise_for_status()
         html = result.text
    except requests.exceptions.RequestException as e:
        print(f'Не получилось подключиться к сайту: {url}\n{e}')
        sys.exit(-1)