使用python3中的请求模块登录此网站

时间:2015-04-21 08:05:48

标签: python-3.x python-requests csrf

  

这是我到目前为止所做的事情。我不得不手动提取CSFRToken(我不知道正则表达式,所以这部分很乱)。 CSFR是Cookie的一部分吗?因为我的cookie只显示另外两个ID类型的参数,所以我放弃了cookie部分,并按照这种方式进行。

import requests


URL = r'http://login.cheezburger.com/'
client = requests.session()
login_page = client.get(URL)
index = login_page.text.find("CSRFToken")
token = login_page.text[index:index+90].split('"')[-2]   # This works, I guarantee :)
#print(token)         I checked it manually


login_data = {'rlm': 'Shopper',
              'for': r'http://login.cheezburger.com/',
              'username': 'myusername', 
              'password': 'mypassword',
              'CSRFToken': token}
req = client.post(URL, data=login_data)
  

现在,每个人都没有错误,但我也没有登录这个网站。此请求的文字显示我仍然停留在登录页面中!

     

发送的参数是(如firefox的开发工具所示):

rlm: 'Shopper'
for: 'http://login.cheezburger.com/'
username: 'myusername', 
password: 'mypassword',
CSRFToken: '8uhhbf67-1233-fff3-123g1-123123fsdfs22'
  

网站来源如下(包含表单数据的部分):

<div class="contents-msl">
    <h2>Client Login</h2>
    <p>Enter username and password</p>
    <div class="form-all-msl">
        <form action="/login.action" id="loginForm" method="post"
              enctype="application/x-www-form-urlencoded"><input type=hidden name=rlm
                                                                 value="Shopper"><input
                type=hidden
                name=for
                value="http%3a%2f%2flogin%cheezburger%2ecom%2f">
            <ul class="form-section-msl">
                <label class="form-label-left-msl" for="loginUserName">
                    Username<span class="form-required">*</span>
                </label>

                <div class="form-input-msl">
                    <input type="text" class="form-textbox-msl" id="loginUserName" name="username"
                           size="20">
                </div>
                <label class="form-label-left-msl" for="loginPwd">
                    Password<span class="form-required-msl">*</span>
                </label>

                <div class="form-input-msl">
                    <input type="password" class="form-textbox-msl" id="loginPwd" name="password"
                           size="20">
                </div>
                <div class="form-input-msl">
                    <div class="form-single-column-msl">

                    </div>
                </div>
            </ul>
    </div>


            <button class="members-btn-msl" type="submit">Login</button>
<input type="hidden" name="CSRFToken" class="CSRFToken" value="8uhhbf67-1233-fff3-123g1-123123fsdfs22" />                    </form>
        </div>
    </div>

1 个答案:

答案 0 :(得分:0)

您可能想要添加一些标题

headers = {
'Accept':
    'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding':
    'gzip, deflate, sdch',
'Accept-Language':
    'en-US,en;q=0.8,vi;q=0.6',
'Cache-Control':
    'max-age=0',
'Connection':
    'keep-alive',
'User-Agent':
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36',

}

然后在代码中添加标题:

req = client.post(URL, data=login_data)
祝你好运!

相关问题