最近在網(wǎng)上看到一個(gè)非常有意思的 Python 游戲通關(guān)網(wǎng)站,一共有 33 關(guān),每一關(guān)都需要利用 Python 知識(shí)解題找到答案,然后進(jìn)入下一關(guān)。
很考驗(yàn)對(duì) Python 的綜合掌握能力,比如有的闖關(guān)需要用到正則表達(dá)式,有的要用到爬蟲。
我們平常學(xué) Python 都是按章節(jié)順序、包或者模塊來學(xué),容易前學(xué)后忘。正好可以拿這個(gè)網(wǎng)站來綜合測試一下對(duì) Python 的掌握情況,以便查缺補(bǔ)漏。
來說說這個(gè)網(wǎng)站怎么玩。
mark
這是網(wǎng)站主頁面,很有歷史感對(duì)吧,誕生了已有十幾年了。但千萬不要因?yàn)榭粗窭瞎哦∏扑?/p>
mark
我們來玩玩看,點(diǎn)擊「get challenged」開始挑戰(zhàn)。
第 0 關(guān)是 Warming up 熱身環(huán)節(jié):
這一關(guān)要求是修改 URL 鏈接,給的提示是電腦上的數(shù)學(xué)表達(dá)式:2 的 38 次方,所以大概就是需要計(jì)算出數(shù)值,然后修改url 進(jìn)入下一關(guān)。
所以這關(guān)就是考 Python 的基本數(shù)值運(yùn)算,你知道怎么算么?
打開 Python 自帶終端,一行代碼就能計(jì)算出結(jié)果:
mark
把原鏈接中的0替換為274877906944回車就會(huì)進(jìn)入下一關(guān):
mark
游戲這就正式開始了。圖片中的筆記本給了三組字母,很容易發(fā)現(xiàn)規(guī)律:前面的字母往后移動(dòng)兩位就是后面的字母。
那么需要做的就是根據(jù)這個(gè)規(guī)律把下面的提示字符串,做位移解密得到真正的句子含義:
這道題考察字符串編碼和 for 循環(huán)相關(guān)知識(shí),代碼實(shí)現(xiàn)如下:
1text='''gfmncwmsbgblrrpylqjyrcgrzwfylb.rfyrqufyramknsrcpq 2
ypcdmp.bmglegrglzwfylbgqglcddgagclrylbrfyr'q 3
ufwrfgqrcvrgqqmjmle.sqgleqrpgle.kyicrpylq() 4
gqpcamkkclbcb.lmuynnjwmlrfcspj.''' 5 6text_translate='' 7foriintext: 8
ifstr.isalpha(i): 9
n=ord(i)10
ifi>='y':11
n=ord(i)+2-2612
else:13
n=ord(i)+214
text_translate+=chr(n)15
else:16
text_translate+=i17print(text_translate)
得到結(jié)果:
1ihopeyoudidnttranslateitbyhand.2thatswhatcomputersarefor.3doingitinbyhandisinefficientandthat'swhythistextissolong.4usingstring.maketrans()isrecommended.nowapplyontheurl.
作者很風(fēng)趣,當(dāng)然不能手動(dòng)去一個(gè)推算了,推薦用 string.maketrans() 這個(gè)方法解決,我們上面采取的是比較直接的方法,官方給出了更為精簡的方法:
1importstring2l=string.lowercase3t=string.maketrans(l,l[2:]+l[:2])4print(text.translate(t))
然后把 url 中的 map 改為ocr回車就來到了第 2 關(guān):
mark
作者接著說過關(guān)的提示可能在書里(當(dāng)然不可能了)也可能在網(wǎng)頁源代碼里。那就右鍵查看源代碼往下拉看到綠色區(qū)域,果然找到了問題:
mark
意思就是:要在下面這一大串字符里找到出現(xiàn)次數(shù)最少的幾個(gè)字符
考察了這么幾個(gè)知識(shí)點(diǎn):
正則表達(dá)式提取字符串
list 計(jì)數(shù)
條件語句
如果是你,你會(huì)怎么做?
首先,用 Requests 請求網(wǎng)頁然后用正則提取出字符串,接著 for 循環(huán)計(jì)算每個(gè)字符出現(xiàn)的次數(shù)。
1%6104 2$6046 3@6157 4_6112 5^6030 6#6115 7)6186 8&6043 9!607910+606611]615212*603413}610514[610815(615416{60461718e119q120u121a122l123i124t125y1
可以看到出現(xiàn)次數(shù)最少的就是最后幾個(gè)字符,合起來是「equality」,替換 url 字符就闖過過了第 2 關(guān)進(jìn)入下一關(guān)繼續(xù)挑戰(zhàn)。是不是有點(diǎn)意思?
后面每一關(guān)都需要用到相關(guān)的 Python 技巧解決,比如第 4 關(guān):
mark
這一關(guān)作者弄了個(gè)小惡作劇,需要手動(dòng)輸入數(shù)值到 url 中然后回車,你以為這樣就完了么?并沒有它有會(huì)不斷重復(fù)彈出新的數(shù)值讓你輸入,貌似無窮盡。
所以,這一關(guān)肯定不能采取手動(dòng)輸入的方法闖關(guān),自然要用到 Python 了。要實(shí)現(xiàn)自動(dòng)填充修改 url 回車跳轉(zhuǎn)到新 url,循環(huán)直到網(wǎng)頁再也無法跳轉(zhuǎn)為止這一功能。
如果是你,你會(huì)怎么做?
其實(shí),一段簡單的爬蟲加正則就能搞定。思路很簡單,把每次網(wǎng)頁中的數(shù)值提取出來替換成新的 url 再請求網(wǎng)頁,循環(huán)下去,代碼實(shí)現(xiàn)如下:
1importrequests 2importre 3importos 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#計(jì)數(shù)器10count=011whileTrue:12try:13#提取下一頁動(dòng)態(tài)數(shù)值14nextid=re.search('d+',resp).group()15count=count+116nextid=int(nextid)17except:18print('最后一個(gè)url為:%s'%nexturl)19break2021#獲取下一頁url22nexturl=url+str(nextid)23print('url%s:%s'%(count,nexturl))24#重復(fù)請求25resp=requests.get(nexturl).text
輸出結(jié)果如下:
可以看到,最終循環(huán)了 85 次找到了最后一個(gè)數(shù)字16044,輸入到 url 中就闖關(guān)成功。
-
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86802 -
數(shù)值運(yùn)算
+關(guān)注
關(guān)注
0文章
2瀏覽量
5087
原文標(biāo)題:33關(guān)Python游戲,測試你的爬蟲能力到底及格不?
文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
Python數(shù)據(jù)爬蟲學(xué)習(xí)內(nèi)容
Python爬蟲與Web開發(fā)庫盤點(diǎn)
Python 爬蟲:8 個(gè)常用的爬蟲技巧總結(jié)!
爬蟲可以采集哪些數(shù)據(jù)
應(yīng)對(duì)反爬蟲的策略
網(wǎng)絡(luò)爬蟲之關(guān)于爬蟲http代理的常見使用方式
0基礎(chǔ)入門Python爬蟲實(shí)戰(zhàn)課
python網(wǎng)絡(luò)爬蟲概述
Python爬蟲速成指南讓你快速的學(xué)會(huì)寫一個(gè)最簡單的爬蟲

爬蟲是如何實(shí)現(xiàn)數(shù)據(jù)的獲取爬蟲程序如何實(shí)現(xiàn)

網(wǎng)絡(luò)爬蟲是否合法
爬蟲的學(xué)習(xí)方法

評(píng)論