在urllib2 Python中正确编码url

时间:2015-10-08 04:46:47

标签: python urllib2

我必须向本地服务器发出一系列请求并检查响应。基本上我试图通过暴力强迫击中正确的URL。这是我的代码:

for i in range(48,126):
   test = chr(i)
   urln = '012a4' + test 
   url = {"tk" : urln}
   data = urllib.urlencode(url)
   print data
   request = urllib2.Request("http://127.0.0.1/brute.php", data)
   response = urllib2.urlopen(request)
   status_code = response.getcode()

我发出如下请求:http://127.0.0.1/brute.php?tk=some_val 我收到错误,因为网址编码不正确。我是内部服务器错误500,即使其中一个系列的url应该给200.手动给该url确认它。另外,在我获得200?

之前,跳过500/400错误的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

使用urllib2时,您应始终处理引发的任何异常,如下所示:

import urllib, urllib2

for i in range(0x012a40, 0x12a8e):
    url = {"tk" : '{:x}'.format(i)}
    data = urllib.urlencode(url)
    print data

    try:
        request = urllib2.Request("http://127.0.0.1/brute.php", data)
        response = urllib2.urlopen(request)
        status_code = response.getcode()
    except urllib2.URLError, e:
        print e.reason

当连接失败时,将显示以下内容,然后继续尝试下一个连接:

[Errno 10061] No connection could be made because the target machine actively refused it

e.reason将为您提供文字原因,e.errno将为您提供错误代码。因此,如果错误不是10061,那么你仍然可以停止。

最后,您似乎正在以十六进制格式骑行一系列数字?您可能会发现直接使用0x格式化来构建字符串更容易。

答案 1 :(得分:0)

听起来你会受益于try/except阻止:

 for i in range(48,126):
    test = 'chr(i)'
    new urln = '012a4' + test 
    url = {"tk" : urln}
    data = urllib.urlencode(url)
    print data
    request = urllib2.Request("http://127.0.0.1/brute.php", data)
    try:
        response = urllib2.urlopen(request)
    except:
        status_code = response.getcode()**strong text**
    print status_code

您通常也希望捕获错误:

except Exception, e:
    print e

或仅捕获特定错误,例如:

except ValueError:
    #do stuff

虽然你的代码中没有ValueError