Python: 尝试使用requests进行POST请求提交表单

12 浏览
0 Comments

Python: 尝试使用requests进行POST请求提交表单

我正在尝试使用Python和requests库登录一个网站进行爬虫,我尝试了以下代码(但不起作用):

import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}
r = requests.post('https://admin.example.com/login.php',headers=headers,data=payload)

但是没有任何效果,只是重定向到登录页面。我需要打开一个会话吗?我是否发送了错误的POST请求?我需要加载cookies吗?或者会话会自动处理这个?

我迷失了,需要一些帮助和解释。

我尝试登录的网站是php的,我需要"捕获set-cookie并设置cookie头"吗?如果是这样,我不知道该怎么做。

该网页是一个表单,具有以下内容(如果这有助于):

input :'username' 'password'

'id':'myform', 'action':"login.php"

一些额外的信息,也许你可以看出我漏掉了什么..

r.headers
Out[13]: CaseInsensitiveDict({
    'content-encoding': 'gzip', 
    'transfer-encoding': 'chunked',
    'set-cookie': 'PHPSESSID=v233mnt4malhed55lrpc5bp8o1; path=/',
    'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 
    'vary': 'Accept-Encoding', 
    'server': 'nginx',
    'connection': 'keep-alive', 
    'pragma': 'no-cache',
    'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
    'date': 'Tue, 24 Dec 2013 10:50:44 GMT', 
    'content-type': 'text/html'
})
r.cookies
Out[14]: <[
    Cookie(version=0, name='PHPSESSID', value='v233mnt4malhed55lrpc5bp8o1', 
    port=None, port_specified=False, domain='admin.example.com', 
    domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, 
    secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)
]>

非常感谢帮助!感谢atupal提供的答案更新:

import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'usr','pass':'123'}
link    = 'https://admin.example.com/login.php'
session = requests.Session()
resp    = session.get(link,headers=headers)
# 首先通过此方法获取页面上的cookies,并用下一行代码存储它们:
cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies))
resp    = session.post(link,headers=headers,data=payload,cookies =cookies)
# 使用firebug检查POST数据,密码实际上是'pass',位于'net'的param下。从这一步继续前进的方法是:
session.get(link)

0