Программы Python зависают после исключения aycnio из-за неожиданного закрытия Pyppeteer

#python #puppeteer #python-asyncio #pyppeteer

#python #puppeteer #python-asyncio #pyppeteer

Вопрос:

Мое соединение с pyppeteer неожиданно закрылось, и это привело к зависанию моей программы на Python вместо завершения работы и правильной регистрации ошибки. Кто-нибудь знает, как правильно перехватить это исключение и правильно выйти из программы Python?

Вот часть моего сценария:

  async def _proxy_browser(self, url, headless = False):

    args = []

    for i in range(5):

        try:
            browser = await launch(headless = headless,
                                   args = args,
                                   defaultViewport = None)
            

            page = await browser.newPage()
            await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0')
            await page.goto(url, {'waitUntil' : 'domcontentloaded'})
            time.sleep(5)
           
            content = await page.content()

            return content

        except (pyppeteer.errors.PageError, pyppeteer.errors.TimeoutError) as e:
          print('error', e)
          time.sleep(2)
          continue

        finally:
            time.sleep(1)
            await browser.close()

    return 

def proxy_browser_request(self, url, headless = False):

    loop = asyncio.get_event_loop()
    response = loop.run_until_complete(self._proxy_browser(url, headless))

    return response
 

Вот обратная трассировка, которую я получил:

 [E:pyppeteer.connection] connection unexpectedly closed
    Task exception was never retrieved
    future: <Task finished name='Task-1379' coro=<Connection._async_send() done, defined at C:UsersnameAppDataLocalProgramsPythonPython38libsite-packagespyppeteerconnection.py:69> exception=InvalidStateError('invalid state')>
    Traceback (most recent call last):
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packagespyppeteerconnection.py", line 73, in _async_send
        await self.connection.send(msg)
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packageswebsocketsprotocol.py", line 567, in send
        await self.write_frame(True, opcode, data)
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packageswebsocketsprotocol.py", line 1083, in write_frame
        await self.ensure_open()
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packageswebsocketsprotocol.py", line 803, in ensure_open
        raise self.connection_closed_exc()
    websockets.exceptions.ConnectionClosedError: code = 1006 (connection closed abnormally [internal]), no reason
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packagespyppeteerconnection.py", line 79, in _async_send
        await self.dispose()
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packagespyppeteerconnection.py", line 170, in dispose
        await self._on_close()
      File "C:UsersnameAppDataLocalProgramsPythonPython38libsite-packagespyppeteerconnection.py", line 151, in _on_close
        cb.set_exception(_rewriteError(
    asyncio.exceptions.InvalidStateError: invalid state
 

Комментарии:

1. безголовый = False — так что же происходит в браузере, запускается ли он и загружает страницу или что вы можете увидеть, когда возникает эта ошибка?

Ответ №1:

Предположим, что статус 1006 сообщает вам, что сайт может понять — ваш сеанс автоматизирован и прерывает ваше соединение с ws, вам нужно поиграть с аргументами Chrome или попробовать расширение pyppeteer stealth (оно портировано на python — используйте Google)