黑板客爬虫闯关笔记(1-3关)

--首先,感谢黑板客老师做了这个爬虫闯关系列,让大家学习到不少知识。

第一关:将网页提示的数字加在网址后面

  解题思路

    1、找到数字对应的html标签,用正则匹配标签内容。

    2、将数字提取出来加到第一关网址后面,获取新的数字。

  解题过程:

第二关:

  解题思路:从0~30依次尝试登录。

第三关:在第二关的基础上加了两层保护

  1、访问第关时会跳转到一个登录页面,必须先登录(测试帐号:username:test;password:test123)。

  2、登录时有一个CSRF参数。

  解题思路:

  1、先发一个GET请求获取登录页面,将服务器返回的csrftoken保存。

  2、尝试用username:test;password:test123;csrftoken登录。登录成功后保存服务器返回的新csrftoken。

  3、尝试用username:test;password:(0~30);csrftoken登录。

  解题过程:

#!/usr/bin/python
# codeing:utf-8
# Be hxs
import re
import time
from threading import Thread
try:
    import requests
except ImportError:
    print "import requests error"
    exit(0)

def print_run_time(func):
    """
    装饰器函数,输出运行时间
    """
    def wrapper(self, *args, **kw):
        local_time = time.time()
        # print args),kw
        func(self)
        print ‘run time is {:.2f}:‘.format(time.time() - local_time)
    return wrapper
class hbk_crawler(object):
    """黑板客爬虫闯关"""
    def __init__(self): pass
    #super(hbk_exxx, self).__init__()

    def login(self, level):
        """登录函数 input:第几关"""
        self.url = ‘http://www.heibanke.com/lesson/crawler_ex‘ + level
        self.login_url = ‘http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex‘ + level
        self.s = requests.session()
        print u"正在登录第{}关....".format(int(level)+1)
        try:
            self.csrftoken = self.s.get(self.login_url).cookies[‘csrftoken‘]
        except:
            print u"网络连接错误,请重试..."
            exit()
        self.payload = {‘username‘: ‘test‘, ‘password‘: ‘test123‘,
                        ‘csrfmiddlewaretoken‘: self.csrftoken}
        self.payload[‘csrfmiddlewaretoken‘] = self.s.post(
            self.login_url, self.payload).cookies[‘csrftoken‘]
        print u"登录成功...."
        return None

    @print_run_time
    def ex01(self, *args, **kw):
        """ 第1关:找密码"""
        url = ‘http://www.heibanke.com/lesson/crawler_ex00/‘
        num = ‘‘
        while True:
            content = requests.get(url + str(num)).text
            pattern = r‘<h3>(.*)</h3>‘
            result = re.findall(pattern, content)
            try:
                num = int(
                    ‘‘.join(map(lambda n: n if n.isdigit() else ‘‘, result[0])))
            except:
                break
            print result[0]
        print result[0]

    @print_run_time
    def ex02(self, *args, **kw):
        """ 第2关:猜密码 """
        url = ‘http://www.heibanke.com/lesson/crawler_ex01/‘
        payload = {‘username‘: ‘test‘, ‘password‘: 0}
        for n in range(30):
            payload[‘password‘] = n
            content = requests.post(url, payload).text
            pattern = r‘<h3>(.*)</h3>‘
            result = re.findall(pattern, content)
            print "try enter {} ...".format(n), result[0]
            if u"错误" not in result[0]:
                break

    @print_run_time
    def ex03(self, *args, **kw):
        """ 第3关:猜密码,加入了登录验证,CSRF保护 """
        self.login(‘02‘)
        for n in range(30):
            self.payload[‘password‘] = n
            content = self.s.post(self.url, self.payload).text
            pattern = r‘<h3>(.*)</h3>‘
            result = re.findall(pattern, content)
            print "try enter {} ...".format(n), result[0]
            if u"错误" not in result[0]:
                break

    def parseurl(self, url):
        """分析网页,查找密码位置和值"""
        while self.count < 100:
            response = self.s.get(url)
            if response.ok:
                content = response.text
                pos_pattern = r‘_pos.>(.*)</td>‘
                val_pattern = r‘_val.>(.*)</td>‘
                pos_list = re.findall(pos_pattern, content)
                val_list = re.findall(val_pattern, content)
                for pos, val in zip(pos_list, val_list):
                    if pos not in self.pw_dict:
                        self.pw_dict[pos] = val
                        self.count = self.count + 1
                print str(self.count) + ‘%‘ + self.count // 2 * ‘*‘

    @print_run_time
    def ex04(self, *args, **kw):
        """ 第4关:找密码,加入了登录验证,CSRF保护,密码长度100位,响应时间增加 """
        self.count = 0
        self.login(‘03‘)
        self.pw_dict = {}
        pw_url = (‘http://www.heibanke.com/lesson/crawler_ex03/pw_list‘,)
        # 线程数,黑板客服务器15秒内最多响应2个请求,否则返回404.
        n = 2
        threads = [Thread(target=self.parseurl, args=(
            pw_url)) for i in xrange(n)]
        for t in threads:
            print t.name, ‘start...‘
            t.start()
        for t in threads:
            t.join()
        self.pw_list = [‘‘ for n in range(101)]
        for pos in self.pw_dict.keys():
            self.pw_list[int(pos)] = self.pw_dict[pos]
        password = int(‘‘.join(self.pw_list))
        self.payload[‘password‘] = password
        response = self.s.post(self.url, self.payload)
        pattern = r‘<h3>(.*)</h3>‘
        result = re.findall(pattern, response.text)
        print result[0] 

if __name__ == ‘__main__‘:
    Hbk_crawler = hbk_crawler()
    Hbk_crawler.ex01()
    Hbk_crawler.ex02()
    Hbk_crawler.ex03()
    Hbk_crawler.ex04()
时间: 2024-10-08 10:04:16

黑板客爬虫闯关笔记(1-3关)的相关文章

黑板客爬虫闯关第一关、第二关

上来先贴地址,刚入门的可以来van啊: 黑板客爬虫闯关 0x00 第一关 打开网址,看到如下页面: 先抱着试试看的心态在网址后面加上数字看看效果: 怕不是个循环,获取网页中的数字不断加到url中,验证猜想,继续试一试: ????? 那就把原来的数字换掉: 妙啊: 这里基本确定思路,获取网页内的数字,然后在将数字加入url进行循环提交 查看源码,确定获取的信息<h3>标签内,并使用re库匹配我们要的数字 import requests from bs4 import BeautifulSoup

黑板客 -- 爬虫闯关 -- 关卡04

简介 爬虫闯关链接: 1.?http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex03/ 2. http://www.heibanke.com/accounts/login 知识点:cookie & session , csrf , Web编程,多线程密码枚举 提示:和第三题一样,看清楚,题目在http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex03/

黑板客 -- 爬虫闯关 -- 关卡05

简介 爬虫闯关链接: 1. ?http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex04/ 2.? http://www.heibanke.com/lesson/crawler_ex04/ 3.? http://www.heibanke.com 知识点:cookie & session , csrf , Web编程,验证码识别模块 提示:本题相较之于前4题的难度在于验证码识别问题,为了方便起见,就用了网络上现成的pytess

&lt;爬虫&gt;黑板爬虫闯关02

import requests from lxml import etree ''' 黑板爬虫闯关02 网址:http://www.heibanke.com/lesson/crawler_ex01/ ''' url = "http://www.heibanke.com/lesson/crawler_ex01/" data = { 'username':"shuimo", 'password': 0, } for i in range(30): data['passw

光棍节程序员闯关秀(总共10关)

程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/hamster.swf 第一关 提示: 从所有信息中找到进入下一关的方法 这一关很简单,即使没有任何web知识也能轻松通过.只要你懂得晃鼠标~~ 查看源代码会发现有这么一行: <p><astyle="color: #172024"href="?k=7a2546077

python网络爬虫入门(一)——简单的博客爬虫

最近,为了微信公众号的图文,上网疯狂的收集和看了一些有深度的新闻和有趣的引人深思的文字评论,并选择了几篇极品发布出去.但感觉一篇一篇的看实在是麻烦死了.想找一个简单的解决办法,看能不能自动把网上的资料收集起来,然后自己用统一筛选.不巧,最近准备学习下网络爬虫相关知识,于是按照网上的教程自己学着试写了一个小小的爬虫,嘻嘻,是用来爬韩寒博客的. 先把完整的代码贴上来,如果朋友们需要试验下,请先安装python相关环境,然后在复制粘贴保存,再按F5运行. #导入urllib库,python访问网页必须

sql-lib闯关秘籍之1-10关

首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky,接下来爆破字段的值.以下所有操作建议在虚拟机中进行~ First  you shoud  have  a 文件夹在你电脑上的例如phpstudy的WWW文件夹中 首先进入这里创建数据库,after that ,let‘s  we  go~ 不管是第几关,我们的最终目标是获得用户密码

sql-lib闯关秘籍之11-20关

下面开始11-20关,之前不会的关卡可以参考我这篇文章: sql-lib闯关秘籍之1-10关 不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限! 以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~ 11到21关的提交方式全是post型的,我这里使用burpsuit抓包软件,也可以用hackbar选中的post,下面的实验我们穿插的使用(用hackbar的时候我们的注释符号用#,不用--+,因为--+会出错) 第十一关 从这一关开始,我们就进入到了PO

sql-lib闯关秘籍之31-40关

下面开始11-20关,之前不会的关卡可以参考我这几篇文章: sql-lib闯关秘籍之1-10关,sql-lib闯关秘籍之11-20关,sql-lib闯关秘籍之21-30关 不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限! 以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~ sql-lib闯关秘籍之1-10关 [Sql-lib chuǎngguān mìjí zhī 1-10 guān] sql-lib checkpoints Cheats 1-10