使用Python的Requests模块登录ASP网站

时间:2016-08-28 16:14:41

标签: python asp.net login web-scraping python-requests

我试图从我的学校页面中抓取一些信息,但我很难过去登录。我知道有类似的威胁,我花了一整天阅读,但不能使它工作。

这是程序即时使用(用户名和密码已更改):

import requests

payload = {'ctl00$cphmain$Loginname': 'name', 'ctl00$cphmain$TextBoxHeslo': 'password'}

page = requests.post('http://gymnaziumbma.no-ip.org:81/login.aspx', payload)
open_page = requests.get("http://gymnaziumbma.no-ip.org:81/prehled.aspx?s=44&c=prub")

#Check content
if page.text == open_page.text:
    print("Same page")
else:
    print(open_page.text)
    print("Different page!")

你能告诉我,我做错了什么?我错过了一些参数吗?请求是否适合这个?我正在尝试使用robobrowser和BeautifulSoup,但也不起作用。我打赌我错过了一些非常微不足道的东西。

我正在使用Python 3.5

1 个答案:

答案 0 :(得分:5)

首先,您没有使用Session,所以即使您的第一篇文章成功登录,第二篇文章对此也一无所知。其次,您缺少需要发布的数据, __ VIEWSTATEGENERATOR __ VIEWSTATE ,您可以使用 BeautifulSoup 从源解析:

from bs4 import BeautifulSoup

data = {'ctl00$cphmain$Loginname': 'name', 'ctl00$cphmain$TextBoxHeslo': 'password'}
# A Session object will persist the login cookies.
with requests.Session() as s:
    page = s.get('http://gymnaziumbma.no-ip.org:81/login.aspx')
    soup = BeautifulSoup(page.content)
    data["___VIEWSTATE"] = soup.select_one("#__VIEWSTATE")["value"]
    data["__VIEWSTATEGENERATOR"] = soup.select_one("#__VIEWSTATEGENERATOR")["value"]
    s.post('http://gymnaziumbma.no-ip.org:81/login.aspx', data=data)
    open_page = s.get("http://gymnaziumbma.no-ip.org:81/prehled.aspx?s=44&c=prub")

    #Check content
    if page.text == open_page.text:
        print("Same page")
    else:
        print(open_page.text)
        print("Different page!")

您可以查看Chrome开发者工具中发布的所有表单数据。

enter image description here

上面发布的内容应该足以登录,如果没有您需要的任何值可以使用BeautifulSoup从登录表中解析。