黑板客爬虫闯关第四关

编程入门 行业动态 更新时间:2024-10-24 02:01:00

黑板客<a href=https://www.elefans.com/category/jswz/34/1770264.html style=爬虫闯关第四关"/>

黑板客爬虫闯关第四关

上学期太忙了,第四关也就一直没去捣鼓(严重拖延症)。今天天气不错,也就抽点时间来整了整。
这一关的核心是Python多线程。密码总共有13页,每一页出现的密码是随机的。也就是说,即使你从第一页翻到最后一页,每一位的密码也不一定能全部获得。而且你会发现,页面载入速度非常慢(这是黑板课老师故意的),这样可以很好地使用Python多线程。Python的多线程和Java多线程不太一样:“Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode”(引用自知乎-为什么有人说 Python 的多线程是鸡肋呢?)。这里的compromise是针对CPU密集型程序,但对于IO密集型程序却非常适用。因为当一个线程在等待网页数据返回时,Python解释器就可以去解释另一个线程的代码,在等待的时间内处理了其它事情。
这一关的思路很简单,先定义一个长度为100的全局list用于保存密码,初始全部置为x(这里也可以再定义一个数组用于标记对应位置密码是否已获取):

pwdlist = ['x' for i in range(0, 100)]

再定义一个全局计数器用于统计已获取密码的位数:

count = 0

当位数达到100时,则终止线程,打印密码。
每个线程都不断访问密码页面(由于每一页都是随机的,于是这里每一次访问的都是第一页),将获得的密码与已有的密码进行比较,若是新的密码(即该位为1),则将其写入pwdlist中,并置count++:

for index in range(0, len(password_pos_list)):if pwdlist[int(password_pos_list[index]) - 1] == 'x':count += 1pwdlist[int(password_pos_list[index]) - 1] = password_val_list[index]

这里对于密码的提取用到了BeautifulSoup,登录的方法和第三关相同,具体实现这里不过多阐述。

# coding=utf-8
import re
import requests
from bs4 import BeautifulSoup
from threading import Threadlogin_website = ''
pwd_website = '/'# 登录记账本
def login_fun():s = requests.Session()s.get(login_website)     # 访问登录页面获取登录要用的csrftokentoken1 = s.cookies['csrftoken']      # 保存csrftoken# 将csrftoekn存入字段csrfmiddlewaretokendataWebsite1 = {'username': 'user','password': 'password','csrfmiddlewaretoken': token1}s.post(login_website, data=dataWebsite1)return sclass MyThread(Thread):def __init__(self, s):Thread.__init__(self)self.s = sdef run(self):global countglobal pwdlistglobal exitruler = repile(r'.*>(\d*)<.*')  # 提取密码位置和值的正则表达式while count < 100:pwdpage = s.get(pwd_website).contentpassword_pos = BeautifulSoup(pwdpage, 'html.parser').findAll('td', {'title': 'password_pos'})password_val = BeautifulSoup(pwdpage, 'html.parser').findAll('td', {'title': 'password_val'})password_pos_list = []  # 密码位置listpassword_val_list = []  # 密码值listif password_pos:for i in password_pos:password_pos_list.append(ruler.findall(str(i))[0])for j in password_val:password_val_list.append(ruler.findall(str(j))[0])print self.nameprint password_pos_listprint password_val_listfor index in range(0, len(password_pos_list)):if pwdlist[int(password_pos_list[index]) - 1] == 'x':count += 1pwdlist[int(password_pos_list[index]) - 1] = password_val_list[index]print countif exit == 0:exit = 1print ''.join(pwdlist)if __name__ == '__main__':s = login_fun()exit = 0count = 0pwdlist = ['x' for i in range(0, 100)]for i in range(0, 20):  # 线程数,可自定义thread = MyThread(s)thread.start()

正确密码:5251693147792557930332653149016366877456628817361853825367526497233818308674451353577489506952443295

更多推荐

黑板客爬虫闯关第四关

本文发布于:2024-03-23 18:17:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1741304.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   黑板

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!