码迷,mamicode.com
首页 > 编程语言 > 详细

Python:黑板课爬虫闯关第三关

时间:2018-09-15 16:28:04      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:破解   python   思路   account   pre   you   post   href   mes   

第三关开始才算是进入正题了。

输入网址 http://www.heibanke.com/lesson/crawler_ex02/,直接跳转到了 http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex02/,显示如下

技术分享图片

看到这个一愣,怎么不是第三关呢?不管,也许是标题不一样吧。点个注册看了下,里面有个验证码,顿时以为是考验证码破解。

注册以后,跳转到不知道哪里去了,重新输入 http://www.heibanke.com/lesson/crawler_ex02/,一看,原来想错了。

技术分享图片

原来这才是第三关,首先可以肯定的是,必须要先登录,并保持登录状态,否则是爬不过关的。

我用的是谷歌浏览器,打开开发者工具,随便输了个昵称和密码,追踪一下网络请求

技术分享图片

这个 csrfmiddlewaretoken 又是个什么鬼,哪里来的?

用代码试下登录看。post 用户名密码之后,print 一下响应的 html,发现并不是我看到的第三关的内容,说明登录没有成功。看一下里面有一句话:You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.

简单的说,就是为了防止CSRF攻击(其实就是黑板课设的障碍),需要一个cookie。那么就简单了,csrfmiddlewaretoken 想必就是那个 cookie 了。

追踪一下登录的网络请求,发现也有 csrfmiddlewaretoken,想必内外是一样的机制。

技术分享图片

请求网址的时候,返回一个名为 csrftoken 的 cookie,这个 cookie 的值就是 post 的时候需要的 csrfmiddlewaretoken 参数。

这样思路就理清了,每次 post 用户名密码之前,先 get 请求一下,从服务器发给你的 cookie 中获取 csrftoken 的值作为 post 时的 csrfmiddlewaretoken 参数即可。

代码如下:

import re
import requests
import time


def main():
    url_login = http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex02/
    url = http://www.heibanke.com/lesson/crawler_ex02/
    session = requests.Session()
    # 获取cookie
    session.get(url_login)
    token = session.cookies[csrftoken]
    # 登录
    session.post(url_login, data={csrfmiddlewaretoken: token, username: guliang21, password: 123qwe})
    for psd in range(30):
        print(ftest password {psd})
        session.get(url)
        token = session.cookies[csrftoken]
        r = session.post(url, data={csrfmiddlewaretoken: token, username: aa, password: psd})
        html = r.text
        if 密码错误 not in html:
            m = re.search((?<=\<h3\>).*?(?=\</h3\>), html)
            print(m.group())
            m = re.search((\<).*?href="([^"]*?)".*?(\>下一关\</a\>), html)
            print(f下一关 http://www.heibanke.com{m.group(2)})
            return
        else:
            time.sleep(1)


if __name__ == __main__:
    main()

 

Python:黑板课爬虫闯关第三关

标签:破解   python   思路   account   pre   you   post   href   mes   

原文地址:https://www.cnblogs.com/gl1573/p/9651027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!