我在服务器上收到“ IndexError:列表索引超出范围”错误,但在本地计算机上却没有

时间:2019-01-06 19:44:27

标签: python

我制作了一个python脚本,该脚本抓取了'http://spys.one/en/socks-proxy-list/'处的网页并获取了该处的所有IP地址,然后检查它们是否可用,最后返回了所有活动IP地址的列表。然后有第二个脚本连接到电报bot API,并使用第一个脚本向用户显示最近的socks5工作服务器列表。

我是一名业余程序员,并且是Python编程语言的新手。我制作了这些脚本来进行锻炼。随时指出我的错误并展示改进代码的方法。预先感谢!

import requests as req
import re
import socket


def is_open(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip, int(port)))
        s.shutdown(2)
        return True
    except:
        return False


# Initial settings:
url = 'http://spys.one/en/socks-proxy-list/'
regex = '\d{1,4}\.\d{1,4}\.\d{1,4}\.\d{1,4}'

# Request URL
response = req.get(url).text

# Extract IP and port from source
p = re.compile(regex)
results = p.findall(response)

# Fetch and check the first 20 IPs
alive = []
for i in range(0, 20):
    if is_open(results[i], '1080'):
        alive.append(results[i])


def gimmeprox():
    links = []
    for x in range(0,len(alive)):
        links.append('https://t.me/proxy?server=' + alive[int(x)] + '&port=1080')

    payload = '\n\n'.join(links)
    return payload

当我运行此代码和其他(机器人)脚本时,一切正常,但是一旦将其放到网络上(heroku等),它就会在第30行崩溃:

line 30, in <module>
    if is_open(results[i], '1080'):

错误""

2 个答案:

答案 0 :(得分:1)

简短的回答:“结果”并不总是有20个项目。因此,您基本上是在要求一些不存在的东西。

您应该始终检查长度,然后再进行迭代;或在不需要索引的情况下,只需遍历实际项目而不是索引即可。

答案 1 :(得分:1)

跑步时

for i in range(20):
    if is_open(results[i], '1080'):
        alive.append(results[i])

并且len(results)为<20,您最终将尝试访问results[len(results)],从而导致IndexError。为防止这种情况,请选择len(results)和20的较低值作为range的参数,例如: min(len(results), 20) 。< / p>

另一种方法是循环遍历results的所有值并在您拥有20时中断。

for r in result:
    if is_open(r, '1080'):
        alive.append(r)
    if len(alive) >= 20:  # shouldn't actually get over 20, just a precaution
        break