Python 请求登录网站

标签 python python-3.x python-requests session-cookies build-automation

我似乎无法使用 python requests.session() 函数登录我的大学网站。我已尝试检索登录所需的所有 header 和 cookie,但它无法使用我的凭据成功登录。它没有显示任何错误,但我在应该登录后查看的源代码显示它仍然没有登录。并且我被告知我需要使用 csrf cookie 信息,但我似乎无法动态检索 csrf cookie 数据,因为当我尝试像检索其他 2 个 cookie 信息一样检索时,它会引发 KeyError 。请帮助某人。

我的所有代码都在下面。我用我的凭据填写了登录名和密码,但其余的是确切的代码。

import requests

with requests.session() as r:
    url = "https://www.ouac.on.ca/apply/nonsecondary/intl/en_CA/user/login"
    page = r.get(url)
    aspsessionid = r.cookies["ASPSESSIONID"]
    ouacapply1 = r.cookies["OUACApply1"]
    LOGIN = ""
    PASSWORD = ""
    submit = "Log In"
    login_data = dict(ASPSESSIONID=aspsessionid, OUACApply1=ouacapply1, login=LOGIN, password=PASSWORD, submitButton=submit)
    header = {"Referer":"https://www.ouac.on.ca/apply/nonsecondary/intl/en_CA/user/login", "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0"}
    logged_in = r.post(url, data=login_data, headers=header)
    new_page = r.get(url="https://www.ouac.on.ca/apply/nonsecondary/intl/en_CA/profile/")
    plain_text = new_page.text
    print(plain_text)

最佳答案

我没有帐户,所以无法测试它,但可能是这样的。

import requests
import bs4
import webbrowser

def display(content):
    # to see this HTML in web browser
    with open('temp.html', 'wb') as f:
        f.write(content)
        webbrowser.open('temp.html')

with requests.session() as r:

    LOGIN = ""
    PASSWORD = ""

    login_url = "https://www.ouac.on.ca/apply/nonsecondary/intl/en_CA/user/login"
    profile_url="https://www.ouac.on.ca/apply/nonsecondary/intl/en_CA/profile/"

    # session need it only once and it will remember it
    r.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0"
    })

    # load page with form - to get cookies and `csrf` from HTML
    response = r.get(login_url)

    #display(response.content)

    # get `csrf` from HTML
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    csrf = soup.find('input', {'name': 'csrf'}).attrs['value']

    print('csrf:', csrf)

    # cookies are not part of form so you don't use in form_data,
    # session will use cookies from previous request so you don't have to copy them
    form_data = {
        'login': LOGIN,
        'password': PASSWORD,
        'submitButton': "Log In",
        'csrf': csrf,
    }

    # send form data to server
    response = r.post(login_url, data=form_data)

    print('status_code:', response.status_code)
    print('history:', response.history)
    print('url:', response.url)

    #display(response.content)

    response = r.get(profile_url)

    display(response.content)

关于Python 请求登录网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869039/

相关文章:

python - 如何有效地将多个函数应用于数据框?

python - pandas - 根据列值将每行复制 'n' 次

python - idlex 1.13 : Unable to located "idlexlib"

python - Unix 时间戳转 ISO 8601 时间格式

python - 在 Python 请求中将字典放入字典

python - 必须在您的浏览器中启用 Cookie [Python 请求]

python - 如果索引和列相同,如何在单独的列中获取数据集的相关值

python - 当发送给它的查询太长时,uWSGI 似乎会中断

python-3.x - ImportError:没有名为 '_tkinter' 的模块,请安装 python3-tk 包

python - 用BeautifulSoup抓取: object has no attribute