33关Python游戏,测试你的爬虫能力到底及格不?
作者 | 苏克1900
责编 | 胡巍巍
转载自高级农民工(ID: Mocun6)
最近在网上看到一个非常有意思的 Python 游戏通关网站,一共有 33 关,每一关都需要利用 Python 知识解题找到答案,然后进入下一关。
很考验对 Python 的综合掌握能力,比如有的闯关需要用到正则表达式,有的要用到爬虫。
我们平常学 Python 都是按章节顺序、包或者模块来学,容易前学后忘。正好可以拿这个网站来综合测试一下对 Python 的掌握情况,以便查缺补漏。
来说说这个网站怎么玩。
mark
这是网站主页面,很有历史感对吧,诞生了已有十几年了。但千万不要因为看着像老古董而小瞧它。
mark
我们来玩玩看,点击「get challenged」开始挑战。
第 0 关是 Warming up 热身环节:
这一关要求是修改 URL 链接,给的提示是电脑上的数学表达式:2 的 38 次方,所以大概就是需要计算出数值,然后修改url 进入下一关。
所以这关就是考 Python 的基本数值运算,你知道怎么算么?
打开 Python 自带终端,一行代码就能计算出结果:
mark
把原链接中的 0
替换为 274877906944
回车就会进入下一关:
mark
游戏这就正式开始了。图片中的笔记本给了三组字母,很容易发现规律:前面的字母往后移动两位就是后面的字母。
那么需要做的就是根据这个规律把下面的提示字符串,做位移解密得到真正的句子含义:
这道题考察字符串编码和 for 循环相关知识,代码实现如下:
1text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq
2 ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q
3 ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq()
4 gq pcamkkclbcb. lmu ynnjw ml rfc spj.'''
5
6text_translate = ''
7for i in text:
8 if str.isalpha(i):
9 n = ord(i)
10 if i >= 'y':
11 n = ord(i) + 2 - 26
12 else:
13 n = ord(i) + 2
14 text_translate += chr(n)
15 else:
16 text_translate += i
17print(text_translate)
得到结果:
1i hope you didnt translate it by hand.
2thats what computers are for.
3doing it in by hand is inefficient and that's why this text is so long.
4using string.maketrans()is recommended. now apply on the url.
作者很风趣,当然不能手动去一个推算了,推荐用 string.maketrans() 这个方法解决,我们上面采取的是比较直接的方法,官方给出了更为精简的方法:
1import string
2l = string.lowercase
3t = string.maketrans(l, l[2:] + l[:2])
4print (text.translate(t))
然后把 url 中的 map 改为ocr回车就来到了第 2 关:
mark
作者接着说过关的提示可能在书里(当然不可能了)也可能在网页源代码里。那就右键查看源代码往下拉看到绿色区域,果然找到了问题:
mark
意思就是:要在下面这一大串字符里找到出现次数最少的几个字符
考察了这么几个知识点:
正则表达式提取字符串
list 计数
条件语句
如果是你,你会怎么做?
来看下,十行代码快速实现:
1import requests
2url = 'http://www.pythonchallenge.com/pc/def/ocr.html'
3res = requests.get(url).text
4text = re.findall('.*?<!--.*-->.*<!--(.*)-->',res,re.S)
5# list转为str便于遍历字符
6str = ''.join(text)
7
8lst = []
9key=[]
10#遍历字符
11for i in str:
12 #将字符存到list中
13 lst.append(i)
14 #如果字符是唯一的,则添加进key
15 if i not in key:
16 key.append(i)
17# 将list列表中的字符出现字数统计出来
18for items in key:
19 print(items,lst.count(items))
首先,用 Requests 请求网页然后用正则提取出字符串,接着 for 循环计算每个字符出现的次数。
1% 6104
2$ 6046
3@ 6157
4_ 6112
5^ 6030
6# 6115
7) 6186
8& 6043
9! 6079
10+ 6066
11] 6152
12* 6034
13} 6105
14[ 6108
15( 6154
16{ 6046
17
18e 1
19q 1
20u 1
21a 1
22l 1
23i 1
24t 1
25y 1
可以看到出现次数最少的就是最后几个字符,合起来是「equality」,替换 url 字符就闯过过了第 2 关进入下一关继续挑战。是不是有点意思?
后面每一关都需要用到相关的 Python 技巧解决,比如第 4 关:
mark
这一关作者弄了个小恶作剧,需要手动输入数值到 url 中然后回车,你以为这样就完了么?并没有它有会不断重复弹出新的数值让你输入,貌似无穷尽。
所以,这一关肯定不能采取手动输入的方法闯关,自然要用到 Python 了。要实现自动填充修改 url 回车跳转到新 url,循环直到网页再也无法跳转为止这一功能。
如果是你,你会怎么做?
其实,一段简单的爬虫加正则就能搞定。思路很简单,把每次网页中的数值提取出来替换成新的 url 再请求网页,循环下去,代码实现如下:
1import requests
2import re
3import os
4
5# 首页url
6resp = requests.get(
7 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345').text
8url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
9# 计数器
10count = 0
11while True:
12 try:
13 # 提取下一页动态数值
14 nextid = re.search('\d+', resp).group()
15 count = count + 1
16 nextid = int(nextid)
17 except:
18 print('最后一个url为:%s' % nexturl)
19 break
20
21 # 获取下一页url
22 nexturl = url + str(nextid)
23 print('url %s:%s' % (count, nexturl))
24 # 重复请求
25 resp = requests.get(nexturl).text
输出结果如下:
可以看到,最终循环了 85 次找到了最后一个数字16044,输入到 url 中就闯关成功。
33 关既有趣又能锻炼使用 Python 解决问题的技巧,感兴趣的话去玩玩看。
网址:http://www.pythonchallenge.com/
如果遇到不会做的题,可以在这里找到参考答案:
中参考文教程:
https://www.cnblogs.com/jimnox/archive/2009/12/08/tips-to-python-challenge.html
官方参考教程:
http://garethrees.org/2007/05/07/python-challenge/
(*本文为 AI科技大本营转载文章,转载请联系原作者)
◆
CTA核心技术及应用峰会
◆
5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。议程设置请请识别海报二维码查看。
目前CTA峰会倒计时5天!还没有拿到入场券的小伙伴可以扫描识别海报二维码或者点击阅读原文,即刻抢购。你也添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。
推荐阅读
掌声送给TensorFlow 2.0!用Keras搭建一个CNN | 入门教程
一文回顾AI绘画的成长之路:从简笔画到真实人脸生成
清华AI学堂班:姚期智担任首席教授,2019年首批招收30人
中国AI开发者真实现状:写代码这条路,会走多久?
520 这天,我突然意识到,她根本配不上我这么聪明的男人
厉害!女学生偷师男子学校,变身区块链开发工程师
确实, 5G与物联网离不开区块链!
刷了一个半月算法题,我薪资终于Double了
Linux 之父:我就是觉得苹果没意思!| 人物志
这本京东断货王的Python神书,刷爆整个编程圈!
相关文章:

【Qt】Qt再学习(十五):关于paintEvent、QPainter学习这一个demo就够了
1、描述 关于绘画事件paintEvent和绘制类QPainter的使用,推荐参考QtCreator中自带的示例basicdrawing。通过这个例子就能掌握QPainter的所有基本用法。下面是这个例子的几张截图:
HTTP缓存——304与200 from cache
个人博客原文地址 HTTP与缓存相关的字段 1. 通用字段 字段名称释义Cache-Control控制缓存具体的行为PragmaHTTP1.0时的遗留字段,当值为"no-cache"时强制验证缓存Date创建报文的日期时间(启发式缓存阶段所用)2. response字段 字段名称释义ETag服务器生成资…

一个多年网络工程师总结的工作实用经验
转载自:51CTO下载频道 1、 交换机选购指南l 设备基本指标:网络接口类型、用户可用插槽数、端口密度。l 设备功能指标:VLAN划分、堆叠、单播和组播协议支持、可网管。l 设备性能指标:背板带宽、包转…

【Qt】Qt再学习(十六):QObject::connect: Cannot queue arguments of type ‘QString‘
1、问题描述 跨线程使用信号和槽时,如果是非const的引用传参,就会报如下的错误: QObject::connect: Cannot queue arguments of type QString& (Make sure QString& is registered using qRegisterMetaType().)2、测试示例 #include <QCoreApplication>

微软提出极低资源下语音合成与识别新方法,小语种不怕没数据!| ICML 2019
作者 | 谭旭转载自微软研究院AI头条(ID: MSRAsia)编者按:目前,人类使用的语言种类有近7000种,然而由于缺乏足够的语音-文本监督数据,绝大多数语言并没有对应的语音合成与识别功能。为此,微软亚洲…

面试准备--7.31
22222转载于:https://www.cnblogs.com/czlovezmt/p/9398015.html

那些年,让我面试头大的几个排序算法,今天终于搞懂了!
作者 | 逆流的鱼yuiop转载自何俊林(ID:smartyuge)算法上,最基础的就是排序算法,几乎在面试中,或多或少会要求你手写一些基础算法。今天鱼哥带大家这些基础算法回顾下。快速排序介绍:快速排序(Qu…

【天线】天线基础:名词解释
1、定向天线和全向天线 先上图,第一张图是定向天线(一根棍子加一块板),第二张图是全向天线(一根棍子) 网上的几种解释: 全向天线就是一个棍子,围绕棍子有一圈儿信号;定…

springBean生命周期----来自spring实战总结
1、Spring对bean进行实例化 2、Spring将值和bean的引用注入到bean对应的属性中(比如说注入到被依赖的bean的方法中或属性里) 3、如果bean实现了BeanNameAware接口,将会将bean的Id传入setBeanName()方法中 4、如果bean实现了BeanFactoryAware接口,将会设置bean的BeanFactory的引…

disk boot failure,insert system disk and press enter
每次一开机就出现提示:"disk boot failure,insert system disk and press enter"http://topic.csdn.net/t/20061202/08/5201096.html 转载于:https://blog.51cto.com/yfb880106/857829

深度讲解:web前端性能优化
一、课程简介: 1、课程大纲 涉及到的分类 网络层面构建层面浏览器渲染层面服务端层面涉及到的功能点 资源的合并与压缩图片编解码原理和类型选择浏览器渲染机制懒加载预加载浏览器存储缓存机制PWAVue-SSR前端性能优化原理 作用及原理如何与真实业务场景结合理论结合…

Google Android向华为“闭源”,华为手机迎来至暗时刻!
作者 | 屠敏转载自CSDN(ID:CSDNnews)居安思危任正非,未雨绸缪如华为。在贸易战的背景下,即使早在多年前已在多个层面做好“备胎”计划的华为,在面对美国对芯片乃至操作系统等系列釜底抽薪的打压时ÿ…

【C++】C++好书推荐
一、吴咏炜推荐 1、入门级 Bjarne Stroustrup, A Tour of C, 2nd ed. Addison-Wesley, 2018 中文版: 王刚译,《C 语言导学》(第二版)。机械工业出版社,2019 Bjarne Stroustrup, The C Programming Language, 4th ed. Addison-W…

HDOJ2569 ( 彼岸 ) 【递推公式】
f13f29f321f451猜测f(n)2*f(n-1)f(n-2)在纸上打草稿写出f3的情况,然后推出f4的情况(在f3后边加*2或*3就成)f3 f4 f3 f4 f3 f4111*3 222*3 333*3112*2 221*2 331*2113*2 223*2 332*2121*2 212*2 313*2131*2 …

【C++】new和malloc的区别
一、显而易见的区别 1、属性 new/delete是C关键字,需要编译器支持; malloc/free是库函数,需要头文件支持。 2、参数 使用new操作符申请内存分配时,无须指定内存块的大小,编译器会根据类型信息自行计算;…

消息队列的面试题7
1、面试题 如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路 2、面试官心里分析 其实聊到这个问题,一般面试官要考察两块: (1)你有没有对某一个消息队列做过较为深入的原理的了解,或…

《使女的故事》大火,AI是背后最大推手?
作者 | Just、Rachel出品 | AI科技大本营(ID:rgznai100)还记得大火的美剧《使女的故事》吗?先别着急回答,这次我们不讲剧情,而要说的是这部剧背后的发行方是美国 Hulu 网站。该网站是美国第二大付费在线视频平台&#…

jQuery事件处理一瞥
以前部门一直都是使用一个名为QTT的JS框架。最近老大提出要转用jQuery框架,需要将旧框架的一些JQ没有实现的功能移植到JQ中去。当我移植到event库的时候,以下是其代码: QTT.event {KEYS : {BACKSPACE : 8,TAB : 9,RETURN : 13,ESC : 27,SPAC…

【C++】零散知识
1、抛异常时,还会执行析构操作吗? 发生异常(抛异常)时,在该作用域中的局部非PAD变量(即,有构造函数和析构函数的变量)会执行析构操作。 2、new出的内存一定在堆上吗? …

百度景鲲“升职记”
整理 | 琥珀出品 | AI科技大本营(id:rgznai100)近日,据多家媒体报道,百度人力资源负责人崔珊珊发出晋升邮件宣布,智能生活事业群总经理景鲲晋升为副总裁。百度在晋升邮件中评价他:“敢打硬仗、能…

南通市公积金信息系统goldengate复制软件采购
(二)容灾软件部分:2套Oracle GoldenGate 11G ,1 CPU(必须提供原厂商针对本项目授权、质保承诺)。特性指标系统平台支持1. 支持主流操作系统,包括:IBM AIX、HP-UX、Linux、Sun Solaris、Mic…

开源需自立!Android、GitHub、Apache全线告急!
作者 | 胡巍巍&伍杏玲责编 | 唐小引出品 | CSDN(ID:CSDNnews)华为四面楚歌,“破窗效应”爆发!继5月16日美国商务部工业与安全局(BIS)将华为列入“实体清单”之后,越来越多的美国…

【C】linux下切换工作目录至程序所在目录
1、获取当前程序的绝对路径 /proc/self/exe是一个符号链接,代表当前程序的绝对路径 用readlink读取/proc/self/exe可以获取当前程序的绝对路径 2、从字符串中获取目录 char dirname(char path); 3、改变当前工作目录 int chdir(const char *path ); 4、完整示…

Eclipse基金会发布Eclipse Photon IDE
Eclipse基金会发布了最新版本的Eclipse IDE。Eclipse Photon带来对Java 10和Java EE 8的支持,增强了PHP开发工具和Dark主题等功能。\\Eclipse Java开发工具(Eclipse Java Development Tools,JDT)对Java 10提供了完整的支持&#x…

【C++】智能指针(一)入门
1、 智能指针背后的设计思想 智能指针背后的思想是RAII,参见博客【C】零散知识 我们先来看一个简单的例子: void remodel(std::string & str) {std::string * ptr new std::string(str);...if (weird_thing())throw exception();str *ptr; dele…

Oracle 11g Release 1 (11.1) PL/SQL_多维 Collection 类型和其异常
本文内容 多维 Collection Collection 异常 多维 Collection 虽然 collection 只有一维的,但可以模型一个多维的。创建一个 collection,其每个元素也是 collection 。例如,创建一个 varray 的 nested table,一个 varray 的 varray…

入门系列之使用fail2ban防御SSH服务器的暴力破解攻击
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由SQL GM 发表于云社区专栏 介绍 对于SSH服务的常见的攻击就是暴力破解攻击——远程攻击者通过不同的密码来无限次地进行登录尝试。当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例…

谁能解答我对知识图谱的上百个疑问?
近日,我们采访了东南大学认知智能研究所所长漆桂林教授和复旦大学知识工场实验室负责人肖仰华教授,围绕知识图谱这两年在研究与产业应用道路上的一些进展与仍面临的问题。漆桂林教授提到,近两年,知识图谱的研究在四大关键技术上都…

ecshop 商品颜色尺寸仿淘宝选择功能教程(2.7.0版本)
牵涉到的修改文件(default模板为例) /themes/default/style.css /themes/default/goods.dwt 注:此路径待修改模板路径.修改步骤:一:控制样式 1.打开/themes/ecshop/p_w_picpaths 加添图片test.gif. 2.打开/themes/ecshop/style.css 最下面添加: /*--------------颜色选择器CSS添…

【C++】Effective STL:50条有效使用STL的经验
第一条:慎重选择容器类型 1、C容器:先混个眼熟 序列容器:array、vector、string、deque、list、forward_list 有序关联容器:set、map、multiset、multimap 无序关联容器:unordered_set、unordered_map、unordered_mu…