Python黑板客爬虫闯关三

来到第三题,此题是输入昵称和密码,进行登录和注册。但此题比第二题相对难一些。多了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后进入下一关,如图

猜你喜欢

转载自blog.csdn.net/Ljt101222/article/details/82428351
今日推荐