PythonChallenge系列-P4 使用urllib

PythonChallenge系列-P4 使用urllib

Dec 30, 2013
Coding
PythonChallenge, Python

Follow The Chain #

解谜P3后,转至第四题P4,其url为

http://www.pythonchallenge.com/pc/def/linkedlist.php

只有一张图片,没有文字提示。鼠标移动到图片上,发现可点击,点击图片。

观察,url中有一个“nothing=12345”,页面内容提示“next nothing=44827”,那么把url中的12345替换成44827,又打开了一个新页面,页面又提示了新的nothing中,看来nothing值上大有文章,但具体怎么做文章,目前的提示不够,再看网页源代码。

urllib may help. DON’T TRY ALL NOTHINGS, since it will never end. 400 times is more than enough.

至此,本题的意思已经出来了。

使用urllib模块,请求url地址 http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345,从该页面获取下一个nothing的值,为44827,即请求下一个url地址为http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=44827,从该页面再获取下一个nothing的值,如此往复,400次。

思路 #

使用变量count记录请求的次数,变量nothing记录每次的nothing,初始时count=1,nothing=“12345”。对于一个nothing,以nothing构造出一个url,使用urllib函数打开这个url,使用fd.read()函数读出页面的内容,然后从页面的内容中获取下一个nothing的值,然后count++,继续以新的nothing构造新的url,重复上述过程,直到count达到400。

观察前面几个页面的内容,统一为”and the next nothing is XXXXX”,先尝试以空格分隔字符串,取分割结果数组的第五部分( 即str.split(“ ”)[5] ),发现nothing=3时,页面内容为 Your hands are getting tired and the next nothing is 94485, 所以取第五部分不行;随后我通过“nothing is ”来分隔,取str.split[“nothing is ”].[1],到了nothing=16044时,发现页面内容为Yes. Divide by two and keep going.。最后,就尝试去页面的最后一个单词(rsplit()[-1]),一切顺利

观察前400次的结果,发现 nothing=peak.html 循环出现。所以这个peak.html应该就是答案。peak.html替换P4题目首页url中的linkedlist.php,成功。

代码 #

# -*- coding: utf-8 -*-

#1   ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345 ,  and the next nothing is 44827
#2   ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=44827 ,  and the next nothing is 45439
#3   ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=45439 ,  <font color=red>Your hands are getting tired </font>and the next nothing is 94485
#86  ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=16044 ,  Yes. Divide by two and keep going.
#234 ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=66831 ,  peak.html
#235 ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=peak.html ,  and the next nothing is 55274
#382 ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=66831 ,  peak.html
#383 ,  http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=peak.html ,  and the next nothing is 55274

from urllib.request import urlopen
count, nothing = 1, "12345"
while count<= 400:
    url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="+nothing
    html = urlopen(url).read().decode('utf8')
    print(count, ", ", url, ", " , html)

    nothing = html.rsplit()[-1]
    count = count + 1

解谜 #

使用peak.html替换P4题目首页url中的linkedlist.php,成功解谜P4,并打开了下一题。

http://www.pythonchallenge.com/pc/def/peak.html

Python知识点 #

在解决的本题的过程中,发现一个不错的Python入门网站,Python For Beginners.

  • urllib 模块的使用
  • 字符串的分割,string.split
  • 字符串分割后取分割的最后一个部分。两种方法(假设分隔符为空格):(1) str.rsplit()[-1];(2)str.rsplit(’ ‘,1)[1]