来到第三题,此题是输入昵称和密码,进行登录和注册。但此题比第二题相对难一些。多了Cookie,需要进行获取和处理Cookie的值 。如图
先进行注册,然后输入昵称和密码后,进行登录,进入如图界面(不行的多尝试几次,直到找到这个界面)
代码一
一、用urllib.requests库re正则表达式和来完成
1、urllib.requests库进行得到网页
2、re 正则表达式来匹配内容
3、此题的思路是用requests.post()请求和 for循环来实现从0到30的输入。
下边就和闯关二差不多了。需要进入控制台进行数据分析。找到Cookie的值,并把他保存在data字典里。具体代码如下
import urllib.request as ur
import urllib.parse as up
import http.cookiejar as hc
import re
# 网站打开时会先生成一个cookies,里面只有csrfmiddlewaretoken值,需要把这个cookies保存下来,
# 在登录的时候需要验证用到,还需要提取csrfmiddlewaretoken的值,在POST提交表单的时候
# 需要提交三个数据,用户名、密码和该值,等验证登录通过以后,服务器会更新cookies,里面
# 有两个值sessionid和csrfmiddlewaretoken,需要重新提取csrfmiddlewaretoken的值,因为已经
# 发生变化了,然后再重新保存cookies到本地,后面的操作会一直用到这两项数据
url = 'http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex02/'
cookie = hc.MozillaCookieJar()
handler = ur.HTTPCookieProcessor(cookie)
opener = ur.build_opener(handler)
req = ur.Request(url)
res = opener.open(req)
# 保存第一次cookies到本地
cookie.save('cookie.txt', ignore_discard=True, ignore_expires=True)
# 提取csrfmiddlewaretoken值
for i in cookie:
token = i.value
value = {'csrfmiddlewaretoken': token, 'username': 'fangjun', 'password': '19870716'}
data = up.urlencode(value).encode('utf-8')
headers = {
"User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4',
"referer": 'http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex02/'
}
# 加载cookies登录网站
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
handler = ur.HTTPCookieProcessor(cookie)
opener = ur.build_opener(handler)
# 提交表单数据,这里的headers非必须项,仅作示例
req = ur.Request(url, data, headers)
res = opener.open(req)
# 登录成功,重新保存cookies到本地
cookie.save('cookie.txt', ignore_discard=True, ignore_expires=True)
# 测试密码开始
url = 'http://www.heibanke.com/lesson/crawler_ex02/'
# 加载cookies
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
cookievalue=[]
for i in cookie:
cookievalue.append(i.value)
#重新提取csrfmiddlewaretoken的值
token = cookievalue[0]
handler = ur.HTTPCookieProcessor(cookie)
opener = ur.build_opener(handler)
pat = re.compile(r'<h3>您输入的密码错误, 请重新输入</h3>')
for i in range(30):
# 还是需要提交三个数据
data = {'username': 'xxx', 'password': i, 'csrfmiddlewaretoken': token}
data = up.urlencode(data).encode('utf-8')
req = ur.Request(url, data)
res = opener.open(req).read().decode('utf-8')
if pat.search(res):
print("it's wrong", i)
else:
print('right,the password is', i)
break
代码运行如下
代码二
二、用requests库re正则表达式和来完成
1、requests库进行得到网页
2、re 正则表达式来匹配内容
具体代码如下
import requests
url = 'http://www.heibanke.com/lesson/crawler_ex02/'
login_url = 'http://www.heibanke.com/accounts/login'
login_data = {'username': 'liuhaha', 'password': '123456'}
# 获取默认cookie
response = requests.get(url)
if response.status_code == 200:
print('Welcome')
cookies = response.cookies
# 登录
login_data['csrfmiddlewaretoken'] = cookies['csrftoken']
login_response = requests.post(login_url, allow_redirects=False, data=login_data, cookies=cookies)
if login_response.status_code == 200:
print('login sucessfully')
# 获取登录成功后的cookie
cookies = login_response.cookies
playload = {'username':'liuhaha', 'password':'1'}
playload['csrfmiddlewaretoken'] = cookies['csrftoken']
for i in range(31):
playload['password'] = i
print(u'传入参数为:' + str(playload))
r = requests.post(url, data=playload, cookies=cookies)
# print(u'执行结果:' + str(r.status_code))
if r.status_code == 200:
if u"成功" in r.text:
print(u'闯关成功!密码为:' + str(i))
break
else:
print(u'Failed')
break
输入密码9后进入下一关,如图