-2

对不起,如果我的英语不好。我想编写一个可以每 15 秒打开一次站点的程序。但是用不同的IP来做。这意味着获取一个 IP 列表,每 15 秒打开一个网站。你是怎么做到的?我应该使用什么模块?谢谢

4

1 回答 1

2

如果您要问如何确保每 15 秒触发一次连接,即使每个连接可能需要几秒钟(甚至可能超过 15 秒钟),这很容易。由于您每 15 秒只建立一个连接,因此没有理由不为每个连接生成一个线程。

所以:

def connectToSiteFunction(ip):
    # your code to bind ip (if it's a source) or connect to it (if it's a dst) 
    # and do your thing here

def connectAndWait():
    for ip in ips:
        t = threading.Thread(target=connectToSiteFunction, args=(ip,))
        yield t
        t.start()
        os.sleep(15)

threads = [t for t in connectAndWait()]
for t in threads:
    t.join()

如果您在谈论目标 IP,并且想知道如何为每个请求使用不同的 IP……那么,您通常只需修改 URL。像这样的东西:

def connectToSiteFunction(ip):
    url = 'http://{}/path/to/page.html'.format(ip)
    # now open url as normal

如果您询问如何将源地址与您选择的 URL 下载库绑定,您必须告诉我们哪个库,但是:该库将有一个参数,或者它可以让您指定一个socket工厂,否则将是不可能的(除非你想socket.socket用自己的工厂进行猴子补丁)。如果它允许您指定一个socket工厂,那么这样做的方法是:

def make_socket_factory(srcip):
    def socket_factory():
        s = socket.socket()
        s.bind((srcip, 0))
        return s
    return socket_factory

make_socket_factory(srcip)然后作为工厂传入。

如果您首先想知道如何下载 URL……有很多方法可以做到这一点,从 stdliburllib2requestspycurlto twisted,并且已经有很多关于 SO(和其他地方)比较和对比它们的答案。

于 2013-01-09T22:34:16.500 回答