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

第四关地址:http://www.heibanke.com/lesson/crawler\_ex03/

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

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

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

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

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

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

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

代码如下:

1import re 2import threading 3import time 4import requests 5from bs4 import BeautifulSoup 6 7 8pwlist = [-1 for i in range(100)] 9count = 0 10lock = threading.Lock() 11 12 13def main(): 14 url_login = 'http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex03/' 15 url = 'http://www.heibanke.com/lesson/crawler_ex03/' 16 session = requests.Session() 17 session.get(url_login) 18 token = session.cookies['csrftoken'] 19 # 登录 20 session.post(url_login, data={'csrfmiddlewaretoken': token, 'username': 'xx', 'password': 'xx'}) 21 threadlist = [threading.Thread(target=getpw, args=(session,)) for i in range(2)] 22 for thread in threadlist: 23 thread.setDaemon(True) 24 thread.start() 25 for thread in threadlist: 26 thread.join() 27 psd = ''.join(pwlist) 28 print(f'密码:{psd}') 29 session.get(url) 30 token = session.cookies['csrftoken'] 31 r = session.post(url, data={'csrfmiddlewaretoken': token, 'username': 'aa', 'password': psd}) 32 html = r.text 33 if '密码错误' not in html: 34 m = re.search('(?<=\<h3\>).*?(?=\</h3\>)', html) 35 print(m.group()) 36 37 38def getpw(session): 39 pw_url = 'http://www.heibanke.com/lesson/crawler_ex03/pw_list/' 40 global count, pwlist 41 while count < 100: 42 try: 43 html = session.get(pw_url).text 44 except: 45 time.sleep(1) 46 continue 47 if '404 Not Found' in html: 48 continue 49 soup = BeautifulSoup(html, 'lxml') 50 pos = soup.find_all('td', {'title': 'password_pos'}) 51 val = soup.find_all('td', {'title': 'password_val'}) 52 for i in range(len(pos)): 53 p = int(pos[i].string) 54 v = val[i].string 55 lock.acquire() 56 if pwlist[p - 1] == -1: 57 pwlist[p - 1] = v 58 count += 1 59 lock.release() 60 61 62if __name__ == '__main__': 63 main()

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )