33关Python游戏,测试你的爬虫能力到底及格不?

系统 1578 0

33关Python游戏,测试你的爬虫能力到底及格不?_第1张图片


作者 | 苏克1900

责编 | 胡巍巍

转载自高级农民工(ID: Mocun6)


最近在网上看到一个非常有意思的 Python 游戏通关网站,一共有 33 关,每一关都需要利用 Python 知识解题找到答案,然后进入下一关。

很考验对 Python 的综合掌握能力,比如有的闯关需要用到正则表达式,有的要用到爬虫。

我们平常学 Python 都是按章节顺序、包或者模块来学,容易前学后忘。正好可以拿这个网站来综合测试一下对 Python 的掌握情况,以便查缺补漏。

来说说这个网站怎么玩。

33关Python游戏,测试你的爬虫能力到底及格不?_第2张图片

mark

这是网站主页面,很有历史感对吧,诞生了已有十几年了。但千万不要因为看着像老古董而小瞧它。

33关Python游戏,测试你的爬虫能力到底及格不?_第3张图片

mark

我们来玩玩看,点击「get challenged」开始挑战。

第 0 关是 Warming up 热身环节:

这一关要求是修改 URL 链接,给的提示是电脑上的数学表达式:2 的 38 次方,所以大概就是需要计算出数值,然后修改url 进入下一关。

所以这关就是考 Python 的基本数值运算,你知道怎么算么?

打开 Python 自带终端,一行代码就能计算出结果:

33关Python游戏,测试你的爬虫能力到底及格不?_第4张图片

mark

把原链接中的   0 替换为   274877906944 回车就会进入下一关:

33关Python游戏,测试你的爬虫能力到底及格不?_第5张图片

mark

游戏这就正式开始了。图片中的笔记本给了三组字母,很容易发现规律:前面的字母往后移动两位就是后面的字母。

那么需要做的就是根据这个规律把下面的提示字符串,做位移解密得到真正的句子含义:

这道题考察字符串编码和 for 循环相关知识,代码实现如下:

            

1 text =  '''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
6 text_translate =  ''
7 for  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
17 print(text_translate)

得到结果:

            

1 i hope you didnt translate it by hand. 
2 thats what computers are for. 
3 doing it in by hand is inefficient and that's why this text is so long. 
4 using string.maketrans()is recommended. now apply on the url.

作者很风趣,当然不能手动去一个推算了,推荐用 string.maketrans() 这个方法解决,我们上面采取的是比较直接的方法,官方给出了更为精简的方法:

            

1 import  string
2 l = string.lowercase
3 t = string.maketrans(l, l[ 2 :] + l[: 2 ])
4 print  (text.translate(t))

然后把 url 中的 map 改为ocr回车就来到了第 2 关:

33关Python游戏,测试你的爬虫能力到底及格不?_第6张图片

mark

作者接着说过关的提示可能在书里(当然不可能了)也可能在网页源代码里。那就右键查看源代码往下拉看到绿色区域,果然找到了问题:

33关Python游戏,测试你的爬虫能力到底及格不?_第7张图片

mark

意思就是:要在下面这一大串字符里找到出现次数最少的几个字符

考察了这么几个知识点:

  • 正则表达式提取字符串

  • list 计数

  • 条件语句

如果是你,你会怎么做?

来看下,十行代码快速实现:

            

1 import  requests
2 url =  'http://www.pythonchallenge.com/pc/def/ocr.html'
3 res = requests.get(url).text
4 text = re.findall( '.*? .* ' ,res,re.S)
5 # list转为str便于遍历字符
6 str =  '' .join(text)
7
8 lst = []
9 key=[]
10 #遍历字符
11 for  i  in  str:
12      #将字符存到list中
13     lst.append(i)
14      #如果字符是唯一的,则添加进key
15      if  i  not   in  key:
16         key.append(i)
17 # 将list列表中的字符出现字数统计出来
18 for  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
18 1
19 1
20 1
21 1
22 1
23 1
24 1
25 1

可以看到出现次数最少的就是最后几个字符,合起来是「equality」,替换 url 字符就闯过过了第 2 关进入下一关继续挑战。是不是有点意思?

后面每一关都需要用到相关的 Python 技巧解决,比如第 4 关:

33关Python游戏,测试你的爬虫能力到底及格不?_第8张图片

mark

这一关作者弄了个小恶作剧,需要手动输入数值到 url 中然后回车,你以为这样就完了么?并没有它有会不断重复弹出新的数值让你输入,貌似无穷尽。

33关Python游戏,测试你的爬虫能力到底及格不?_第9张图片

所以,这一关肯定不能采取手动输入的方法闯关,自然要用到 Python 了。要实现自动填充修改 url 回车跳转到新 url,循环直到网页再也无法跳转为止这一功能。

如果是你,你会怎么做?

其实,一段简单的爬虫加正则就能搞定。思路很简单,把每次网页中的数值提取出来替换成新的 url 再请求网页,循环下去,代码实现如下:

            

1 import  requests
2 import  re
3 import  os
4
5 # 首页url
6 resp = requests.get(
7      'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345' ).text
8 url =  'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
9 # 计数器
10 count =  0
11 while   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 ”,了解票务以及会务详情。


33关Python游戏,测试你的爬虫能力到底及格不?_第10张图片


推荐阅读


  • 掌声送给TensorFlow 2.0!用Keras搭建一个CNN | 入门教程

  • 一文回顾AI绘画的成长之路:从简笔画到真实人脸生成

  • 清华AI学堂班:姚期智担任首席教授,2019年首批招收30人

  • 中国AI开发者真实现状:写代码这条路,会走多久?

  • 520 这天,我突然意识到,她根本配不上我这么聪明的男人

  • 厉害!女学生偷师男子学校,变身区块链开发工程师

  • 确实, 5G与物联网离不开区块链!

  • 刷了一个半月算法题,我薪资终于Double了

  • Linux 之父:我就是觉得苹果没意思!| 人物志

  • 这本京东断货王的Python神书,刷爆整个编程圈!


640?wx_fmt=png


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论