黑板客爬虫闯关

第一关:
url: http://www.heibanke.com/lesson/crawler_ex00/
打开网页是这样的

自己试几次就可以发现规律,此次的数字是下一次请求的数字,手动操作任务量还是挺大的,通关后大概是这样:

源码如下:

import os,sys
import re
import requests
reload(sys)
sys.setdefaultencoding('utf-8')
# 第一关 猜数字
# 此次的数字是下一次请求的数字
# url: http://www.heibanke.com/lesson/crawler_ex00/
def ex01():
    # 匹配数字
    def findNum(url):
        res = requests.get(url).content
        num = re.findall('数字[^\d]*(\d+)[\.<]',res)
        return num
    # 首先获得数字
    url = "http://www.heibanke.com/lesson/crawler_ex00/"
    num = findNum(url)
    # 循环直至出来结果
    while num:
        url2 = url+num[0]
        num = findNum(url2)
        print u'访问网页:%s'%url2
    else:
        print u'第二关网页:%s'%url2

以上就是第一关。



接下来是第二关:
url: http://www.heibanke.com/lesson/crawler_ex01/
页面打开是这样的:

通过页面很直观的知道,密码是30以内,所以我就没把30放在考虑范围内,也就是说是0-29。
后来查看此次关卡传的参数,发现出来用户名和密码之外还多了一个csrfmiddlewaretoken,于是就去页面找了下,猜想是这个value,试了下,果然是

源码如下:

#-*- coding:utf-8 -*-

#author:Koelre

# 黑板课爬虫闯关
# url: http://www.heibanke.com/lesson/crawler_ex00/

import os,sys
import re
import requests
from lxml import etree

reload(sys)
sys.setdefaultencoding('utf-8')

# 获取csrf值
def getcsrf():
    url = 'http://www.heibanke.com/lesson/crawler_ex01/'
    res = requests.get(url,timeout=30).text
    tree = etree.HTML(res)
    csrf = tree.xpath('/html/body/div/div/div[2]/form/input/@value')[0]
    return csrf



# 第二关 猜密码
# 密码是30以内,所以我就没把30放在考虑范围内,就是0-29
# url: http://www.heibanke.com/lesson/crawler_ex01/
def ex02():
    scrf = getcsrf()
    url = 'http://www.heibanke.com/lesson/crawler_ex01/'
    data = {
    "csrfmiddlewaretoken": str(scrf),
    "username": "a",
    "password": "1"
    }
    for x in xrange(30):
        data["password"] = x
        res = requests.post(url,data=data).content
        if u"错误" not in res:
            print u"密码:%s"%x
            break



接下来是第三关:
url: http://www.heibanke.com/lesson/crawler_ex02/
页面打开是这样的:

这个首先就需要登录啦,注册登录之后打开就是这样的:

所以,第三关相对第二关就需要登录了,密码还是30以内,所以我就没把30放在考虑范围内,就是0-29



接下来是第四关:
url: http://www.heibanke.com/lesson/crawler_ex03/
页面打开是这样的:

看见这样蒙圈,于是输入试试:

发现已经不是输入密码那么简单了,所以 在这里耐心找

上下翻了几页也才明白,意思是说:虽然说同样需要登录,我看了好几遍才清楚它的密码逻辑,“密码的位置”最大的是100,所以,密码长度应该是100个,如果只是遍历完一遍显示的页数,数字可能会达不到100个,所以这样就需要循环几遍才能得到所有的。



接下来是第五关:
url: http://www.heibanke.com/lesson/crawler_ex04/
页面打开是这样的:

发现除了需要登录,输入密码(同样是数字 - 就从0开始),还多了一个验证码,经查看,验证码就是一种图片,我的方案就是每次把那个图片下载下来在本地识别就OK了。

源码如下:

#-*- coding:utf-8 -*-

# 黑板课爬虫闯关
# url: http://www.heibanke.com/lesson/crawler_ex00/

import os,sys
import re
import random
import requests
from lxml import etree
import pytesseract
from PIL import Image,ImageEnhance

reload(sys)
sys.setdefaultencoding('utf-8')

# 登录 
# 3,4,5都需要登录
# url: http://www.heibanke.com/accounts/login
def login():
    website1 = 'http://www.heibanke.com/accounts/login'
    se = requests.Session()
    se.get(website1)
    token1 = se.cookies['csrftoken']# 保存csrftoken  
    # 登录参数
    dataWebsite1 = {
        'username': 'Koelre',  
        'password': 'lixue961314',  
        'csrfmiddlewaretoken': token1  
    }
    res = se.post(website1, data=dataWebsite1)#登录
    print res.status_code
    return se


# 第三关 猜密码
# url: http://www.heibanke.com/lesson/crawler_ex02/
def ex03():
    website2 = 'http://www.heibanke.com/lesson/crawler_ex02/'
    s = login()# 登录
    for x in xrange(30):
        # 以下步骤原理和上面一样
        token2 = s.cookies['csrftoken']
        dataWebsite2 = {
        'username': 'a',  
        'password': x,  
        'csrfmiddlewaretoken': token2
        }
        result = s.post(website2, data=dataWebsite2).content
        if u"错误" not in result: 
            print u"3--密码:%s"%x
            break



# 第四关 猜密码
# url: http://www.heibanke.com/lesson/crawler_ex03/
def guesspass(se,password):
    website2 = 'http://www.heibanke.com/lesson/crawler_ex03/'
    dataweb2 = {
    "csrfmiddlewaretoken": "JUwPvezXy54mqH5MrklkBSiecn1ZZnqv",
    "username": "a",
    "password": password
    }
    req = se.post(website2,data=dataweb2).content
    return req

# 收集密码的值
passes = ['' for x in range(101)]
def ex04():
    global passes
    se = login()# 登录
    # for i in range(1,14):
    passwebsite = 'http://www.heibanke.com/lesson/crawler_ex03/pw_list/?page=1'#+str(i)
    # 密码
    res = se.get(passwebsite).content
    etr = etree.HTML(res)
    # 第一个是标题
    trs = etr.xpath('/html/body/div/div/div/table/tr')[1:]
    for tr in trs:
        pa1 = tr.xpath('td[1]/text()')[0].strip()#密码位置
        pa1 = int(re.findall('\d+',pa1)[0])
        pas = tr.xpath('td[2]/text()')[0].strip()#密码的值
        passes[pa1] = pas
    password = ''.join(passes)#把密码拼接字符串
    if len(password)==100:
        # 猜密码
        result = guesspass(se,password)
        # 判断密码是否猜对
        if u"错误" not in result: 
            print u"4--密码:%s"%password
    else:
        ex04()


# 第五关
# url: http://www.heibanke.com/lesson/crawler_ex04/
def VerificationCode(imgurl):
    # 保存验证码
    imgs = requests.get(imgurl).content
    with open('1.jpg','wb') as f:
        f.write(imgs)
        
    image = Image.open('1.jpg')
    imgry = image.convert('L')#图像加强,二值化
    sharpness = ImageEnhance.Contrast(imgry)#对比度增强
    sharp_img = sharpness.enhance(2.0)
    sharp_img.save('1.jpg')

    text = pytesseract.image_to_string(image)
    return text

def ex05(a=1,passd=1):
    website = 'http://www.heibanke.com/lesson/crawler_ex04/'
    se = login()# 登录
    res1 = se.get(website)
    # print res1.status_code
    etr = etree.HTML(res1.content)
    token2 = etr.xpath('/html/body/div/div/div[2]/form/input/@value')[0].strip()
    imgsrc = etr.xpath('/html/body/div/div/div[2]/form/div[3]/img/@src')[0].strip()
    #验证码链接
    imgurl = 'http://www.heibanke.com'+str(imgsrc)
    #图片code
    capcodes = etr.xpath('//*[@id="id_captcha_0"]/@value')[0]
    # 保存验证码图片且识别验证码
    text = VerificationCode(imgurl)
    # print capcodes,text,passd
    web2data = {
        "csrfmiddlewaretoken":token2,
        "username":"a",
        "password":passd,
        "captcha_0":capcodes,
        "captcha_1":text
    }
    # 提交信息 - 开始猜测
    # 尝试每个数字多猜几次,验证码有时候会识别错误
    res2 = se.post(website,data=web2data,timeout=30).content
    if u"验证码输入错误" not in res2:
        if u"密码错误" not in res2:
            with open('pass.txt','ab') as f:
                f.write(u"密码是:%s"%passd)
        else:
            ex05(a,passd+1)
    else:
        # 多输入几次验证码,预防验证码错误
        if a<=3:
            ex05(a+1,passd)
        else:
            a=1
            ex05(a,passd+1)



github上面也放源码了,点它就可以了 -- >> github-crawler

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 最近看到的一个关于Python爬虫的闯关游戏,手痒,试他一试。 第一关 地址:http://www.heibank...
    whaike阅读 2,336评论 6 16
  • 有些伪装者,毫无痕迹的出现在你的周围。裹着一副美丽的皮囊,和着一副动人的嗓音,穿着一套好人脸的衣服,慢慢悠悠的走在...
    Jun子若阅读 291评论 0 0
  • 1.好开心哪,今天早上虽然醒的比较晚,但还是毫不犹豫的就出发去跑步啦。且按照惯例,跑到山上,做了呼吸法。 2.哇,...
    可爱的小俪阅读 172评论 0 0
  • 今天记录下午和苏广聊完天之后的感受与感想。 具体的原因暂且不说了! 但其中的感受却是使我意犹未尽。 听了人家的经历...
    赵扬帆阅读 225评论 0 0
  • 同类的事情在春卷身上发生的很多,比如,她会花个一两万买双Red wing,买的时候我们都觉得没有必要,可是...
    韦姐姐私房茶阅读 160评论 3 1