爬虫闯关 第三关

地址:http://www.heibanke.com/lesson/crawler_ex02/

本关的难点就是所谓的两层认证,需要获取处理cookie

刚进入页面时没看懂是怎么玩,以为到这就结束了,抱着试试看的态度注册了下。

爬虫闯关 第三关

注册登录后,发现是一个记账点之类的,网页还没有跳转到题目网页,还不知道怎么玩。

重新从题目地址进入后,发现可以玩了:

题目页面

使用selenium实现

使用selenium实现方式好像不涉及验证之类的问题,因为完全是模拟的人类登录浏览器的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# coding=utf-8

from selenium import webdriver

url = 'http://www.heibanke.com/lesson/crawler_ex02/'

browser = webdriver.Chrome()
# browser = webdriver.Firefox()
browser.get(url)

# 登录
username = browser.find_element_by_id('id_username')
username.clear()
username.send_keys('liuhaha')

password = browser.find_element_by_id('id_password')
password.clear()
password.send_keys('123456')
password.submit()

# 重新进入问题页面
browser.get(url)

for i in range(31):
username = browser.find_element_by_name('username')
username.clear()
username.send_keys('liuhaha')

password = browser.find_element_by_id('id_password')
password.clear()
password.send_keys(i)
# FireFox下异步,Chrome下同步,submit方法会等待页面加载完成后返回
# password.submit()

# 两种浏览器下click()方法都会等到加载完成后返回
browser.find_element_by_id('id_submit').click()

returnText = browser.find_element_by_tag_name('h3')
print(returnText.text + ', password ' + str(i))
if u"成功" in returnText.text:
break
browser.back()

browser.quit()

requests实现

实现思路

题目中提到了两层保护,是哪两层呢?

首先,多了账号登陆一层,还有一层是什么呢?重新登陆,打开firebug记录一下整个流程。

请求处理流程

值得注意的一点是cookies值会存在两个地方:一个是请求标头,一个是请求正文,两者可能相同可能不同,存在请求正文的是POST请求,因此要在post data中附带上cookie值。

整个访问的详细流程:

  1. 浏览器向URL发出GET请求,得到一个302的重定向的响应,响应标头中包含了一个Location字段,告诉浏览器新的访问地址LOGIN_URL。如果之前用同样的浏览器闯过第一关或第二关,此请求的请求标头仍然会带上cookie,但并无实际作用,可忽略。
  2. 浏览器从第一步响应结果得到新的地址,并向此地址发出GET请求。响应标头中会set一个cookie,如果之前访问过该网站,那么此cookie会和请求标头的cookie一样。不管怎样,此cookie都将作为以后访问过程中的依据之一。我们将此返回的cookie记录为c1。
  3. 浏览器向再向LOGIN_URL发出POST请求,得到一个包含URL的302重定向的响应。除了请求正文中的username和password字段外,请求标头和请求正文中都附带上第二步中的cookie c1,返回的响应标头中附带上了两个新的cookie,其中一个会在下次访问的请求标头中覆盖原来的cookie c1。我们将此返回的cookies记录为c2。
  4. 向URL提交POST请求,请求标头附带的是第3步的cookie c2,请求正文是昵称密码和cookie c2的其中一个值。

其中:

  • URL=http://www.heibanke.com/lesson/crawler_ex02/
  • LOGIN_URL=http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex02/

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# coding=utf-8

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
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/爬虫闯关第三关.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%