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

news/2024/7/19 10:41:23 标签: 爬虫, python

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

 

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

  解题思路

    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登录。

  解题过程:

 

 

 

 

python">#!/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()

 

转载于:https://www.cnblogs.com/hxs2660/p/5559611.html


http://www.niftyadmin.cn/n/721889.html

相关文章

Spring MVC 返回不跳转视图相应视图原因分析

package com.taotao.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;/*** 系统 Controller* ClassName: IndexController* Des…

AIX服务级别---你所需要了解的基本资料

AIX服务级别---你所需要了解的基本资料TL是什么&#xff1f; TL 是”Technology Level”的缩写。 从2006年开始&#xff0c;原来的AIX的Maintenance Level 将改称为 Technology Level。 并且&#xff0c;每年只发布两个新版本。第一个TL 只限于硬件的特征和功能增强&#xff0c…

[抖音插旗备注接口]拼多多新店如何选词写标题,那些渠道可以选词

不得不说&#xff0c;标题是拼多多店铺的一个重要引流点&#xff0c;如果你是新店那填写关键词时就需要更加注意&#xff0c;因为优化的好坏直接关系到拼多多店铺的流量问题&#xff0c;一个好的关键词不仅能给店铺带来流量&#xff0c;还可以为店铺省去很多不必要的麻烦&#…

微软自动图像说明技术的最新进展

作者&#xff1a;John Platt 微软雷德蒙研究院副院长兼杰出科学家 文章译自&#xff1a;Rapid Progress in Automatic Image Captioning 多年来&#xff0c;我一直热衷于接受图像理解&#xff08;image understanding&#xff09;领域各种艰巨的挑战。关于图像理解&#xff0c;…

基于实际开发的Oracle SQL优化建议

1)避免Select *2)编写SQL尽量使用相同的编码风格。语句解析、语句执行、返回执行结果等几个步骤。共享的SGA区&#xff0c;如有省去解析sql3)使用truncate替换delete。delete属于DML语言。4)在确保业务逻辑前提下及时COMMIT事务5)in&#xff1a;子查询->主查询 exists&…

【转】有序数组求中位数问题

1、有两个已排好序的数组A和B&#xff0c;长度均为n&#xff0c;找出这两个数组合并后的中间元素&#xff0c;要求时间代价为O(logn)。2、假设两个有序数组长度不等&#xff0c;同样的求出中位数。一&#xff1a;解析&#xff1a; 这个题目看起来非常简单。第一题的话&#xff…

【天猫erp、发货接口】如何从点击、访客、销量方面提升拼多多流量

现在有很多的商家都入驻拼多多&#xff0c;商家们入驻拼多多的一大目的就是看中了拼多多“薄利多销”的一个点&#xff01;但是很多商家在入驻开店之后&#xff0c;却发现自己店铺的流量怎么都提升不起来&#xff1f;那么&#xff0c;下面就来讲解一下拼多多流量该怎么提升的问…

三、java面向对象编程_1

目录 一、对象和类的概念 二、对象和引用 1.对象 2.成员变量 3.引用 三、java类的定义 四、构造函数&#xff08;构造方法) 五、内存分析 一、对象和类的概念 1.对象 对象用计算机语言对应问题域中事物的描述&#xff0c;对象通过“属性&#xff08;attribute&#xff09;”和“…