在前两关结束之后,进入第三关,
这里需要我们注册,注册后再登录页面
题目说比上一关多了两层保护,我们可以看到顶部有个注销按钮,也就是说首先要先登录才能继续做题。首先观察在登录的时候除了用户名和密码到底还发送了些什么。
打开chrome,在登录界面,右键点开Inspect,然后在昵称和密码区域分别输入自己的用户名和密码,点击登录,可以在Network中看到如下的变化,
点击第一行可以看到
图中我们可以看到,除了发送用户名和密码,我们还发送了一个csrfmiddlewaretoken的数据。回到题目的页面,刷新下网页,在Response Headers也就是服务器响应的数据的Set-Cookie里发现有个csrftoken的字段:
然后再登录一遍,发现发送的表单数据中的csrfmiddlewaretoken中的值就是这个:
也就是说,每次登录的时候还要拿进入这个页面服务器给你的“csrftoken”作为你下次登录时的“csrfmiddlewaretoken”和用户名密码一起传给服务器。
# coding=utf-8
import requests
website1 = 'http://www.heibanke.com/accounts/login'
website2 = 'http://www.heibanke.com/lesson/crawler_ex02'
wrongNotify = '您输入的密码错误, 请重新输入'
s = requests.Session()
s.get(website1) # 访问登录页面获取登录要用的csrftoken
token1 = s.cookies['csrftoken'] # 保存csrftoken
dataWebsite1 = {'username': 'ljlljlljl',
'password': '111111',
'csrfmiddlewaretoken': token1
}
s.post(website1, data=dataWebsite1)
pwd = 1
while pwd < 30:
# 以下步骤原理和上面一样
s.post(website2)
token2 = s.cookies['csrftoken']
dataWebsite2 = {'username': 'ljl',
'password': pwd,
'csrfmiddlewaretoken': token2
}
result = s.post(website2, data=dataWebsite2)
if wrongNotify in result.content:
print '密码%d错误' % pwd
pwd += 1
else:
print '密码是%d' % pwd
break