第四关地址:http://www.heibanke.com/lesson/crawler_ex03/

一开始看到的时候有点蒙,不知道啥意思,说密码需要找出来但也没说怎么找啊。

别急,随便输了个昵称和密码,提交一下,就能看到密码提示了。

进入到找密码的链接,显示如下:

注意那一行大字,提示网页加载速度很慢,这一关的意图很明显了,就是:多线程。

密码一共100位,这里虽然显示了翻页,但其实每一页显示的位置是随机的,可能会重复,所以并不是一页页翻到最后一页就可以获取到完整的密码了。

所以我们只要开个多线程,不停的刷第一页就可以了,直到100位全部获取到。

登录部分和第三关是一样的,链接:https://www.cnblogs.com/gl1573/p/9651027.html

代码如下:

import re
import threading
import time
import requests
from bs4 import BeautifulSoup pwlist = [-1 for i in range(100)]
count = 0
lock = threading.Lock() def main():
url_login = 'http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex03/'
url = 'http://www.heibanke.com/lesson/crawler_ex03/'
session = requests.Session()
session.get(url_login)
token = session.cookies['csrftoken']
# 登录
session.post(url_login, data={'csrfmiddlewaretoken': token, 'username': 'xx', 'password': 'xx'})
threadlist = [threading.Thread(target=getpw, args=(session,)) for i in range(2)]
for thread in threadlist:
thread.setDaemon(True)
thread.start()
for thread in threadlist:
thread.join()
psd = ''.join(pwlist)
print(f'密码:{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()) def getpw(session):
pw_url = 'http://www.heibanke.com/lesson/crawler_ex03/pw_list/'
global count, pwlist
while count < 100:
try:
html = session.get(pw_url).text
except:
time.sleep(1)
continue
if '404 Not Found' in html:
continue
soup = BeautifulSoup(html, 'lxml')
pos = soup.find_all('td', {'title': 'password_pos'})
val = soup.find_all('td', {'title': 'password_val'})
for i in range(len(pos)):
p = int(pos[i].string)
v = val[i].string
lock.acquire()
if pwlist[p - 1] == -1:
pwlist[p - 1] = v
count += 1
lock.release() if __name__ == '__main__':
main()

这里有一点需要注意,开了很多个线程以后,会发现返回一堆的404,这是黑板课做的一个限制,服务器15秒内最多返回两个请求,否则返回404,所以,开20个线程和开2个线程是一样的。

Python:黑板课爬虫闯关第四关的更多相关文章

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

    近日发现了[黑板课爬虫闯关]这个神奇的网页,练手爬虫非常的合适 地址:http://www.heibanke.com/lesson/crawler_ex00/ 第一关非常的简单 get 请求网址,在响 ...

  2. Python:黑板课爬虫闯关第五关

    第五关是最后一关了,至此之后黑板课就没有更新过关卡了. 第五关地址:http://www.heibanke.com/lesson/crawler_ex04/ 可以看到,是在第三关的基础上加了验证码. ...

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

    第三关开始才算是进入正题了. 输入网址 http://www.heibanke.com/lesson/crawler_ex02/,直接跳转到了 http://www.heibanke.com/acco ...

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

    第二关依然是非常的简单 地址:http://www.heibanke.com/lesson/crawler_ex01/ 随便输入昵称呢密码,点击提交,显示如下: 这样看来就很简单了,枚举密码循环 po ...

  5. python3 黑板客爬虫闯关游戏(四)

    这关较第三关难度增加许多,主要多了并发编程 密码一共有100位,分布在13页,每页打开的时间在15秒左右,所以理所当然的想到要用并发,但是后来发现同IP访问间隔时间不能小于8秒,不然会返回404,所以 ...

  6. python3 黑板客爬虫闯关游戏(一)

    这是学习python爬虫练习很好的网站,强烈推荐! 地址http://www.heibanke.com/lesson/crawler_ex00/ 第一关猜数字 很简单,直接给出代码 import ur ...

  7. python3 黑板客爬虫闯关游戏(三)

    第三关,先登录,再猜密码,这关难度较第二关大幅增加,要先去注册一个登录账号,然后打开F12,多登录几次,观察headers数据的变化 给出代码,里面注释很详细 import urllib.reques ...

  8. python3 黑板客爬虫闯关游戏(二)

    第二关猜登录密码,需要用到urllib.request和urllib.parse 也很简单,给代码 import urllib.request as ur import urllib.parse as ...

  9. 嵩天老师python网课爬虫实例1的问题和解决方法

    一,AttributeError: 'NoneType' object has no attribute 'children', 网页'tbody'没有子类 很明显,报错的意思是说tbody下面没有c ...

随机推荐

  1. server.go 源码阅读

    ; i < conn.retries(); i++ {         r.conf.addr = conn.addr()         listener, err = net.Listen( ...

  2. JS代码检查工具ESLint

    前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...

  3. POJ_2104_K-th Number_主席树

    POJ_2104_K-th Number_主席树 题意:给定一个长度为n的序列,m次询问区间第k小 分析: 主席树模板 主席树可以理解成为n棵权值线段树的前缀和 但我们不能建n棵线段树,只需要对于每个 ...

  4. java集合框架之Collections

    参考http://how2j.cn/k/collection/collection-collections/369.html Collections是一个类,容器的工具类,就如同Arrays是数组的工 ...

  5. Java 使用PDFBox提取PDF文件中的图片

    今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...

  6. Docker 容器

    1.  容器 在过去,如果要开始编写Python应用程序,首先要做的就是在机器上安装Python运行时环境.但是,这就造成了这样一种情况:你的机器上的环境需要完美,以便你的应用程序能够按预期运行,而且 ...

  7. 使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效

    最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效. 情况下:使用 list-type 属性来设置文件列表的样式. 最终的优化之后:(演 ...

  8. Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别

    引言 在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊.要想学好Netty,这几个概念必须要掌握清楚. 同步和异步 同步与异步的区别在于,异步基于 ...

  9. itest 开源测试管理项目中封装的下拉列表小组件:实现下拉列表使用者前后端0行代码

    导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景       像easy ui 之类的纯前端组件,也有下拉列表组件,但是使用的时候,每个下拉列表,要配一个URL ...

  10. C++删除文件末尾字符

    C++中使用fstream来进行文件读写,如果要覆盖文件末尾的部分字符,应该怎么操作呢? #include <iostream> #include <fstream> std: ...