连接中止请求错误

Connection aborted requests error

所以这个错误发生在 1.5 循环,它进行了一个完整的循环并在第二个函数处停止:

目标站点冻结了一段时间,我看到了这个:

有什么问题吗?

代码:

import requests

def vissok(id):
    with requests.Session() as c:
    url = 'http://www.worldofdraft.com/ajax/user.php'
    gameurl = 'http://www.worldofdraft.com/ajax/entry.php'
    GPL = ['5332', '5594', '5444', '5488', '5547', '5371', '5383', '5061', '5456', '5451', '5550']
    BPL = ['5388', '5596', '5481', '5587', '5585', '5514', '5099', '5249', '5566', '5501', '5357']
    GID = id
    UDID = '0'
    ACT = 'draft'
    ACT2 = 'save_draft'
    SIGN = '18852c5f48a94bf3ee58057ff5c016af'
    USERNAME1 = 'email@randommail.com'
    USERNAME2 = 'email2@randommail.com'
    PASSWORD = 'supersecretpass'
    LOGIN = 'login'
    c.get(url)
    login_data = dict(action = LOGIN, login = USERNAME1, password = PASSWORD)
    c.post(url, data = login_data)

    c.get(gameurl)
    game_data = dict(player_id = GPL[0], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[1], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[2], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[3], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[4], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[5], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[6], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[7], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[8], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[9], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = GPL[10], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data_save = dict( action = ACT2, id = GID, user_draft_id = UDID, sign = SIGN)
    c.post(gameurl, data = game_data_save)


def simplebot(id):  
with requests.Session() as c:
    url = 'http://www.worldofdraft.com/ajax/user.php'
    gameurl = 'http://www.worldofdraft.com/ajax/entry.php'
    GPL = ['5332', '5594', '5444', '5488', '5547', '5371', '5383', '5061', '5456', '5451', '5550']
    BPL = ['5388', '5596', '5481', '5587', '5585', '5514', '5099', '5249', '5566', '5501', '5357']
    GID = id
    UDID = '0'
    ACT = 'draft'
    ACT2 = 'save_draft'
    SIGN = '18852c5f48a94bf3ee58057ff5c016af'
    USERNAME1 = 'email@randommail.com'
    USERNAME2 = 'email2@randommail.com'
    PASSWORD = 'supersecretpass'
    LOGIN = 'login'
    c.get(url)
    login_data = dict(action = LOGIN, login = USERNAME2, password = PASSWORD)
    c.post(url, data = login_data)

    c.get(gameurl)
    game_data = dict(player_id = BPL[0], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[1], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[2], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[3], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[4], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[5], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[6], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[7], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[8], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[9], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data = dict(player_id = BPL[10], action = ACT, id = GID)
    c.post(gameurl, data = game_data)
    game_data_save = dict( action = ACT2, id = GID, user_draft_id = UDID, sign = SIGN)
    c.post(gameurl, data = game_data_save)


i = 184
while i < 189:
    simplebot(i)
    vissok(i)
    i += 1

所以网站阻止我发送太多请求。所以必须进行一些节流,所以我在循环中延迟了 30 秒,并且在每个 'c.post'

之后延迟了 2 秒
import time

game_data2 = dict(player_id = BPL[0], action = ACT, id = GID)
c.post(gameurl2, data = game_data2)
time.sleep(2)

循环看起来像:

i = 193
while i < 2000:
    vissok(i)
    simplebot(i)
    print "id: %d done" % i
    time.sleep(30)
    i += 1

正如我在评论中提到的,您需要限制您的请求。
您已经设法自行解决了这个问题,应该可以解决。

我会提出一个更简洁、更畅销的解决方案,您可以在其中创建一个 GETPOST 函数来跟踪您上次发出请求的时间,并减少代码。

看看:

import requests
from time import time, sleep

url = 'http://www.worldofdraft.com/ajax/user.php'
gameurl = 'http://www.worldofdraft.com/ajax/entry.php'
GPL = ['5332', '5594', '5444', '5488', '5547', '5371', '5383', '5061', '5456', '5451', '5550']
BPL = ['5388', '5596', '5481', '5587', '5585', '5514', '5099', '5249', '5566', '5501', '5357']
GID = id
UDID = '0'
ACT = 'draft'
ACT2 = 'save_draft'
SIGN = '18852c5f48a94bf3ee58057ff5c016af'
USERNAME1 = 'email@randommail.com'
USERNAME2 = 'email2@randommail.com'
PASSWORD = 'supersecretpass'
LOGIN = 'login'

last_request = time()
def get(c, url):
    global last_request
    if time()-last_request < 2:
        sleep(2-(time()-last_request))
    ret = c.get(url)
    last_request = time()
    return ret

def post(c, url, data):
    global last_request
    if time()-last_request < 2:
        sleep(2-(time()-last_request))
    ret = c.post(url, data = login_data)
    last_request = time()
    return ret

def vissok(id):
    global url, gameurl, GPL, GID, UDID, ACT, ACT2, SIGN, USERNAME1, PASSWORD, LOGIN
    with requests.Session() as c:
        get(c, url)
        login_data = dict(action = LOGIN, login = USERNAME1, password = PASSWORD)
        post(c, url, data = login_data)

        get(c, gameurl)
        for index in range(0, len(GPL)-1):
            game_data = dict(player_id = GPL[index], action = ACT, id = GID)
            post(c, gameurl, data = game_data)

        game_data_save = dict( action = ACT2, id = GID, user_draft_id = UDID, sign = SIGN)
        post(c, gameurl, data = game_data_save)


def simplebot(id): 
    global url, gameurl, BPL, GID, UDID, ACT, ACT2, SIGN, USERNAME2, PASSWORD, LOGIN
    with requests.Session() as c:

        get(c, url)
        login_data = dict(action = LOGIN, login = USERNAME2, password = PASSWORD)
        post(c, url, data = login_data)

        get(c, gameurl)
        for index in range(0, len(BPL)-1):
            game_data = dict(player_id = BPL[index], action = ACT, id = GID)
            post(c, gameurl, data = game_data)

        game_data_save = dict( action = ACT2, id = GID, user_draft_id = UDID, sign = SIGN)
        post(c, gameurl, data = game_data_save)

i = 184
while i < 189:
    simplebot(i)
    vissok(i)
    i += 1
    sleep(30) # Not sure why you want to wait 30 seconds here, but i kept it.

基本上我所做的是我把你所有的变量放在代码的顶部并使它们成为全局变量(因为你两次使用完全相同的变量,这节省了很多 space 在您的代码中重用它们而不是复制它们)。

然后我删除了您发出的所有 c.post 个看起来像这样的电话:

game_data = dict(player_id = BPL[0], action = ACT, id = GID)
c.post(gameurl, data = game_data)
game_data = dict(player_id = BPL[1], action = ACT, id = GID)
c.post(gameurl, data = game_data)

并从中循环,因为唯一改变的是 0 -> 1 -> 2 等等

我还创建了一个 get()post() 函数,基本上可以完成您刚才所做的事情,但添加了一个 sleep() 来计算 2 秒与自最后一个请求,因此它将在每个 GET 和 POST 请求之间最多等待 "dynamically" 2 秒。

尚未验证此代码,但希望它能让您了解将来可以使用编程做什么。

祝你好运!