首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能使用Python "requests“库来填写这个表单呢?

为什么我不能使用Python "requests“库来填写这个表单呢?
EN

Stack Overflow用户
提问于 2015-03-16 12:25:46
回答 2查看 1.2K关注 0票数 1

我想使用Python中的requests库填写一个登录表单。如下所示,字段名为usernamepassword

所以我写了下面的脚本:

代码语言:javascript
复制
session = requests.session()
p = session.post("http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx", {'username':'myUsername','password':'myPassword'})
print 'headers', p.headers
print 'cookies', requests.utils.dict_from_cookiejar(session.cookies)
print 'html',  p.text

问题是,当我运行它时,它再次返回登录页!我的节目怎么了?

更新:

我也尝试将参数作为数据发送,但是没有什么改变。例如,下面的代码还返回相同的输出:

代码语言:javascript
复制
payload = {'username': 'myUsername', 'password': 'myPassword'}
r = requests.post("http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx", data=payload)
print(r.text)

Update2 :

我使用Burp套装捕获数据包,以了解不同之处:

这是我的浏览器发送的数据包:

代码语言:javascript
复制
POST /SubSystem/Portal/Index1/Login/Login2.aspx HTTP/1.1
Host: 192.168.94.1
Proxy-Connection: keep-alive
Content-Length: 134
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://192.168.94.1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: ASP.NET_SessionId=nntwluu5uhrldzuymsv333uc; CURRENT_LANGUAGE_2=fa

__VIEWSTATE=%2FwEPDwUKMTY5ODAzNzY1MmRkpL4TXtJfODqn0yxypIJaOzkl4YUWynT8urN%2BYYXM%2FnY%3D&Command=LOGIN&username=myUsername&password=myPassword

这就是第二个Python脚本发送的数据包:

代码语言:javascript
复制
POST /SubSystem/Portal/Index1/Login/Login2.aspx HTTP/1.1
Host: 192.168.94.1
Content-Length: 31
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.4.3 CPython/2.7.0 Windows/7
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded

username=myUsername&password=myPassword
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 13:15:06

看起来您首先需要发送一个POST请求,但从您最近的更新来看,该帖子还需要一些可用的cookies -还有一个名为"Command“的隐藏字段,需要发送值"LOGIN",所以。

代码语言:javascript
复制
import requests

URL = "http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx"

# Set up session object so we can store cookies across requests
session = requests.session()
# GET the page to get any initial cookies required for the POST
r = session.get(URL)
# POST to the login form (making sure to add "Command")
r = session.post(URL, data={'Command': 'LOGIN', 'username': 'x', 'password': 'y'})

至于在保存页面时不获取图像的原因是,当浏览器加载页面时,它会看到指向资源/样式表/图像的链接,并发出进一步的访问请求-- requests所做的就是按原样加载页面的“文本”。有实现这一目标的方法,但这超出了回答核心问题的范围。

关于我可以使用这些会话对象进行多个登录的注释吗?-这里有一种方法.

代码语言:javascript
复制
# List of users and passwords
USERS = {
    'rod': 'password1',
    'jane': 'password2',
    'freddy': 'password3'
}
# Initial name->initial session with cookies
sessions = {name:requests.session().get(URL) for name in USERS}
# Login users
sessions.update(
    (name, session.post(URL, data={'Command': 'LOGIN', 'username': name, 'password': USERS[name]})) 
    for name, session in sessions.items()
)
# Now do something with users
r1 = sessions['rod'].get('http://something.com')
r2 = sessions['freddy'].get('http://something.com', params={'foo': 'bar'})
# etc...
票数 3
EN

Stack Overflow用户

发布于 2015-03-16 12:39:57

支持@EsseTi的答案,使用data=Payload方法获取它们。。

代码语言:javascript
复制
import requests
payload = {'id_login': 'UserName', 'id_password': 'Password'}
url = #Your URL
something = requests.post(url, data=payload)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29076778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档