打开第4关链接,图片看不出任何线索:
点击图片,链接跳转到http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345,并且网页显示一行字and the next nothing is 44827
,于是将链接中的数字12345替换为44827,回车,结果刷新后的网页又只有一行:and the next nothing is 45439
重复操作,依然只有一行:Your hands are getting tired and the next nothing is 94485
已经告诉我不要手动操作了。应该写个循环来做,提取出每次页面中的数字,并更改下一次访问的 url。提取数字可以用正则表达式,也可以直接把字符串分成列表,取它的最后一项。
代码如下:
import urllib.request
import re
import time
site = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s'
num = '12345'
regex = re.compile(r'\d+')
for i in range(400):
url = site % num
req = urllib.request.urlopen(url)
text = req.read().decode('utf8')
num = re.findall(regex, text)[0]
print(text)
time.sleep(2)
执行一段时间后报错:
Traceback (most recent call last):
File "D:/SECRET/python/practice/courseOfGrowth/pythonchallenge/004.py", line 12, in <module>
num = re.findall(regex, text)[0]
IndexError: list index out of range
报错原因应该是num值没有取到,re.findall(regex, text)这段代码没有像之前那样生成列表。
根据报错之前对吼的一次输出and the next nothing is 16044
,访问链接http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=16044 网页显示:Yes. Divide by two and keep going.然后将16044除以2得到8022,再访问链接
http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=8022,得到and the next nothing is 25357。原来这个题目在这里还埋坑,两种方法,将程序num初始值设置为8022继续执行,或者完善程序。先继续执行,稍后再对程序进行完善。
继续执行一段时间,文本又变了:
There maybe misleading numbers in the text. One example is 82683. Look only for the next nothing and the next nothing is 63579
You've been misleaded to here. Go to previous one and check.
再次修改url后继续执行,直到最后返回peak.html
程序结束。则下一关的链接为
http://www.pythonchallenge.com/pc/def/peak.html
这个程序执行时遇到两次中断,根据中断原因完善代码:
import urllib.request
import re
import time
request_times = 1 #增加统计请求次数的变量
site = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s'
num = '12345'
regex = re.compile(r'\d+')
for i in range(400):
url = site % num
req = urllib.request.urlopen(url)
text = req.read().decode('utf8')
print(text)
print('这是第%s次请求'%request_times)
request_times += 1
if 'Divide' in text:
num = str((int(num) / 2))
elif 'html' in text:
print('最终答案是%s'%text)
break
else:
num = re.findall(regex, text)[-1]
time.sleep(2)
最终得到答案peak.html,并且统计请求次数应该是251次。为什么说应该是呢,因为代码优化以后执行两次,都没有执行完成,就卡住不动了,也没有报错,手动把num值改了以后又可以继续执行,猜测可能是网络问题。