функция get из модуля Python запросов переходит на неправильную веб-страницу - PullRequest
0 голосов
/ 29 мая 2020

Я создал программу Python, которая извлекает данные с веб-сайта, требующего от пользователя входа в систему с учетными данными. Он отлично работает с учетной записью, но как только я пытаюсь использовать другую учетную запись (которая, как я знаю, отлично работает на реальном веб-сайте), возникает странная проблема. Вот часть, в которой вызываются функции:

print(getFullMarks((login('firstAccountUsername', 'firstAccountPasword'))))
print(getFullMarks((login('secondAccountUsername', 'secondAccountPassword'))))

Вторая учетная запись связана с проблемой. Я точно знаю, что в обоих случаях он входит в систему правильно, поэтому с функцией входа в систему нет проблем. Функция входа в систему возвращает объект сеанса, который я могу использовать для навигации по веб-сайту, поэтому, когда я вызываю на нем метод get, я могу вставить ссылку, которая ведет на страницу указанного веб-сайта. Вот проблема: по какой-то причине, хотя с первой учетной записью я могу легко получить доступ к любой странице веб-сайта, со второй, независимо от того, какую ссылку я даю методу get, я всегда оказываюсь на главной странице веб-сайта (вы можете доступ к домашней странице только после входа в систему, поэтому я знаю, что обе учетные записи входят в систему правильно). Как это исправить?

Вот код функции входа в систему:

def login(username, password):
    s = requests.Session()
    r = s.get(link, headers={"User-Agent": "Mozilla/5.0"})
    soup = BeautifulSoup(r.text, "html.parser")
    payload = {i['name']: i.get('value', '') for i in soup.select('input[name]')}
    payload['_username'] = username
    payload['_password'] = password
    cookie = r.headers['set-cookie'].split(" ")[0]
    s.post(post_url, data=payload, headers={
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'en-US,en;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Length': '96',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': '_ga=GA1.3.99501944.1555252666; ' + str(cookie),
        'Host': 'nuvola.madisoft.it',
        'Origin': 'https://nuvola.madisoft.it',
        'Referer': 'https://nuvola.madisoft.it/login',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    })
    return s

А вот код функции getFullMarks, где вызывается метод get:

def getFullMarks(session):
    marks = list()
    r = session.get('https://nuvola.madisoft.it/area_tutore/voto/situazione')
    soup = BeautifulSoup(r.text, features='lxml')
...