使用python请求登录网站时返回400

时间:2016-09-26 14:58:52

标签: python http login python-requests

我正在尝试使用请求库编写一个python脚本来登录网站。 这是登录表单。

<form action="/login" method="POST"><input type="hidden" name="post_key" value="b762c617d52cf987fdb40d74c6a04e07"><input type="hidden" name="return_to" value="http://www.pixiv.net/"><input type="hidden" name="lang" value="en"><input type="hidden" name="source" value="pc"><div class="input-field-group"><div class="input-field"><input type="text" name="pixiv_id" placeholder="E-mail address / pixiv ID" autocapitalize="off"></div><div class="input-field"><input type="password" name="password" placeholder="Password" autocapitalize="off">

这是我的代码。

import requests

url = "https://accounts.pixiv.net/login"

# set requests headers
headers = {
'Connection':'keep-alive',
'User-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'
}

# get user id and password
pixiv_id = raw_input("Your pixiv id : ")
password = raw_input("Your pixiv password: ")

payload = {
    'action' : '/login',
    'return_to' : 'http://www.pixiv.net'
}
payload['pixiv_id']=pixiv_id
payload['password']=password


with requests.Session() as s:
    r = s.post(url, data=payload, headers=headers)
    response = s.get("http://www.pixiv.net")
    print r.status_code
    print response.text

我的问题是,我应该填写表格中的所有隐藏价值吗? 此外,我已经运行了很多次,但它总是返回400.有谁能帮我弄清楚我的代码问题?

1 个答案:

答案 0 :(得分:1)

当我登录并查看浏览器开发人员工具时,我发现在点击“登录”后会发送更多POST请求参数:

enter image description here

requests只会发送您明确告诉它发送的内容 - 这意味着,您还应该发送所有隐藏的表单参数。它可能涉及HTML解析 - 例如,您可以使用BeautifulSoup

或者,您可以使用mechanizemechanicalsouprobobrowser等工具自动发现并发送表单的隐藏属性。