2016-01-21 96 views
0

我试图采取一些http代理并将它们追加到列表中,然后单独通过使用urllib打开它们来测试它们,但出现以下类型错误。我已经试过在测试函数中用str()包装'proxy',但是返回了另一个错误。如何将字符串添加到Python中的字典中?

proxies = [] 

with open('working_proxies.txt', 'rb') as working_proxies: 
    for proxy in working_proxies: 
     proxy.rstrip() 
     proxies.append(proxy) 

def test(proxy): 
    try: 
     urllib.urlopen(
      "http://google.com", 
      proxies={'http': proxy} 
     ) 
    except IOError: 
     print "Connection error! (Check proxy)" 
    else: 
     working_proxy = True 

working_proxy = False 
while working_proxy == False: 
    myProxy = proxies.pop() 
    test(myProxy) 

我的错误:

Connection error! (Check proxy) 
Traceback (most recent call last): 
    File "proxy_hand.py", line 26, in <module> 
    test(proxy) 
    File "proxy_hand.py", line 16, in test 
    proxies={'http': proxy} 
    File "/usr/lib/python2.7/urllib.py", line 87, in urlopen 
    return opener.open(url) 
    File "/usr/lib/python2.7/urllib.py", line 193, in open 
    urltype, proxyhost = splittype(proxy) 
    File "/usr/lib/python2.7/urllib.py", line 1074, in splittype 
    match = _typeprog.match(url) 
TypeError: expected string or buffer 

回答

1

您打开与代理的文件作为二进制这里:

with open('working_proxies.txt', 'rb') as working_proxies: 

'rb'模式字符串b意味着你将可以读取二进制,例如bytes对象。

要么以文本模式打开文件(或许指定比你的系统默认的编解码器等),或者使用一个明确的bytes.decode()打电话给你的bytes对象进行解码,以str

proxies.append(proxy.decode('ascii')) 

我期望ASCII是足以解码适合用作代理的主机名。

请注意,您的working_proxy标志不起作用;它不在test中标记为global。也许你想抓住IOError例外而不是test,或者将循环移入该函数。你还需要弄清楚当你耗尽代理时你会做什么(所以当他们没有人工作时)。

相关问题