我在使用aiohttp时遇到一些问题。我正在尝试使用它来监视网站的内部重定向。我检查了页面的“网络”选项卡,似乎它们每30秒左右发出一个GET请求,并且该GET请求包含一些cookie。然后服务器确定那些cookie是否正确,如果正确,则重定向,否则您将一直等待。
这是我目前的代码:
def launch():
passed = False
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
async with ClientSession(headers=headers) as session:
while passed is False:
async with session.get(url, allow_redirects=True, proxy=proxy, timeout=40) as initial:
status = await get_status(await initial.text()) # Check HTML for status
if status == "success":
logging.info("[{}] {}.".format(task_number, "Success"))
passed = True
await asyncio.sleep(30)
if __name__ == "__main__":
tasks = []
loop = asyncio.get_event_loop()
for i in range(instances):
task = asyncio.ensure_future(launch())
tasks.append(task)
loop.run_until_complete(asyncio.wait(tasks))
我正在使用一些我知道的大多数代理,它们可以正常运行并且运作良好。但是,每次我运行代码时,它都会吐出X次错误(其中X是实例数)。它是这样的:
20:49:24.246以后从未检索到任务异常:exception = TimeoutError()> 追溯(最近一次呼叫最近):文件“ main.py”,第213行,在 发射 等待初始化(a,b)文件“ main.py”,第254行,正在初始化 与session.get(URL,allow_redirects = True,proxy = proxy,timeout = 40)异步作为初始文件 “ C:\ Users \ x \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ aiohttp \ client.py”, 第843行,位于 enter self._resp =等待self._coro文件“ C:\ Users \ x \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ aiohttp \ client.py”, _request中的第387行 等待resp.start(conn)文件“ C:\ Users \ x \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ aiohttp \ client_reqrep.py”, 761行,开始 self._continue =无文件“ C:\ Users \ x \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ aiohttp \ helpers.py”, 第677行,在退出 从Nonecurrent.futures._base.TimeoutError引发asyncio.TimeoutError
我真的无法弄清楚为什么要这样做或如何解决它……它一直在崩溃。
我要访问的网站非常可靠,并且我使用的大多数代理都不错。只是随机地,它们都会开始运行,通常在测试50个实例后大约200秒之后。
我曾经用except (ValueError, InvalidURL, ClientConnectionError, ClientHttpProxyError, TimeoutError):
捕获错误并用它打印实例号,并且由于我使用的几个代理已失效,因此可能会发生几次,其余的都可以一会儿,他们都会崩溃。我删除了try / except以找出错误的确切原因,现在我注意到曾经失败的实例编号现在从未显示过(每次成功访问站点时我都会打印任务编号) ,然后就像我之前所说的那样崩溃。
我尝试设置timeout=None
,但现在它以前曾经向我发送错误消息时,它只是停止并且什么也没有发生。
有人知道我该如何解决吗?
谢谢。
编辑:只是使用proxy=None
在较小的规模上进行了相同的测试,但仍然失败。