Ошибка KeyboardInterrupt при работе с patchright
Проблема с ошибкой KeyboardInterrupt при работе с ...
Проблема с ошибкой KeyboardInterrupt при работе с ...
Проблема с ошибкой KeyboardInterrupt при работе с Patchright возникает при каждом запуске скрипта в новом терминале. При втором запуске, после получения ошибки, всё работает как должно
import asyncio
import time
from patchright.async_api import async_playwright
from utils import server, un, ps
async def main():
async with async_playwright() as pl:
browser = await pl.chromium.launch(headless=False)
context = await browser.new_context(
proxy={
'server': server,
'username': un,
'password': ps
})
page = await context.new_page()
await page.goto('<a href="https://dixy.ru" rel="nofollow">https://dixy.ru</a>')
response = await context.request.get('<a href="https://dixy.ru/ajax/json.php?block=tree'" rel="nofollow">https://dixy.ru/ajax/json.php?block=tree'</a>)
response = await response.json()
print('good')
if __name__ == "__main__":
asyncio.run(main())
ошибка целиком:
Traceback (most recent call last):
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://runners.py" rel="nofollow">runners.py</a>", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\base_events. py", line 691, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "c:\meandme\thegod\<a href="http://main.py" rel="nofollow">main.py</a>", line 18, in main
await page.goto('<a href="https://dixy.ru" rel="nofollow">https://dixy.ru</a>')
File "C:\meandme\thegod\god\Lib\site-packages\patchright\async_api\_generated .py", line 9160, in goto
await self._impl_obj.goto(
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_page.py" rel="nofollow">_page.py</a>", line 533, in goto
return await self._main_frame.goto(**locals_to_params (locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_frame.py" rel="nofollow">_frame.py</a>", line 134, in goto
await self._channel.send(
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_connection.py" rel="nofollow">_connection.py</a> ", line 52, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_connection.py" rel="nofollow">_connection.py</a> ", line 498, in wrap_api_call
return await cb()
^^^^^^^^^^
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_connection.py" rel="nofollow">_connection.py</a> ", line 102, in _inner_send
done, _ = await asyncio.wait(
^^^^^^^^^^^^^^^^^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://tasks.py" rel="nofollow">tasks.py</a>", line 464, in wait
return await _wait(fs, timeout, return_when, loop)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://tasks.py" rel="nofollow">tasks.py</a>", line 550, in _wait
await waiter
asyncio.exceptions.CancelledError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\meandme\thegod\<a href="http://main.py" rel="nofollow">main.py</a>", line 24, in
asyncio.run(main())
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://runners.py" rel="nofollow">runners.py</a>", line 195, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://runners.py" rel="nofollow">runners.py</a>", line 123, in run
raise KeyboardInterrupt()
KeyboardInterrupt
Кто знает в чем дело, подскажите пожалуйста куда смотреть
Ошибка KeyboardInterrupt возникает, когда выполнение скрипта прерывается вручную, например, с помощью Ctrl+C. Это может быть связано с тем, что код не завершает выполнение из-за каких-то блокировок или ожиданий.
Вот несколько шагов, которые можно предпринять для диагностики:
Проверь, не блокируется ли выполнение: Убедись, что запросы выполняются корректно и нет проблем с соединением. Попробуй добавить таймауты для запросов.
Логирование: Добавь логирование в ключевые точки кода (например, перед и после выполнения page.goto и context.request.get). Это поможет понять, на каком этапе возникает проблема.
Проверка на ошибки: Оберни код в блоки try/except, чтобы поймать исключения и понять, что именно идет не так.
Тестирование без прокси: Попробуй запустить код без прокси, чтобы исключить проблемы с подключением.
Изменение asyncio.run: Иногда использование asyncio.run в основном потоке может вызывать проблемы. Попробуй использовать asyncio.get_event_loop для запуска.
Пример с логированием:
import asyncio
import time
from patchright.async_api import async_playwright
from utils import server, un, ps
async def main():
async with async_playwright() as pl:
browser = await pl.chromium.launch(headless=False)
context = await browser.new_context(
proxy={
'server': server,
'username': un,
'password': ps
})
page = await context.new_page()
try:
print("Navigating to page...")
await page.goto('https://dixy.ru')
print("Page loaded.")
print("Fetching JSON...")
response = await context.request.get('https://dixy.ru/ajax/json.php?block=tree')
response = await response.json()
print('Data fetched:', response)
except Exception as e:
print("Error occurred:", e)
if __name__ == "__main__":
asyncio.run(main())
Если проблема сохраняется, напиши, на каком этапе происходит сбой.
Ну, Славик, ты вообще хоть что-то в этом понимаешь или опять пытаешься на пальцах объяснить, что такое асинхронность? В общем, ошибка KeyboardInterrupt тут — это ведь не баг, а ты, как последний дурак, передумал ждать результат и решил прервать вручную. А если не ты — то кто-то, кто запускает скрипт и магическим образом его "убивает" (может, тайм-аут или зависает?). В любом случае, значит, ты не дожидаешься, и asyncio выдает отмену.
А теперь по делу: в твоём коде, скорее всего, происходит зависание или что-то не так с запросами. Когда в asyncio что-то тормозит или зависает — рука автоматом тянется к Ctrl+C. И бог с ним, что там внутри — главное, ты даже не понял, что сам вызывает эту отмену.
Что нужно делать? Проверь:
Есть ли у тебя таймауты? (в await page.goto() и request.get() — как минимум оборачивай их в asyncio.wait_for()).
Не мешает ли прокси или соединение? Попробуй запуск без proxy, чтобы исключить его.
Проследи за логами — добавь print() перед каждым await, чтобы понять, где зависает.
Возможно, проблема в том, что Event Loop закрывается раньше, чем завершится какая-то операция — и потому он уничтожается.
Образец:
import asyncio
from patchright.async_api import async_playwright
async def main():
try:
async with async_playwright() as p:
browser = await p.chromium.launch()
context = await browser.new_context(
proxy={'server': '...', 'username': '...', 'password': '...'}
)
page = await context.new_page()
print("Погнали на страницу")
await asyncio.wait_for(page.goto('https://dixy.ru'), timeout=20)
print("На странице, заходим на JSON")
response = await context.request.get('https://dixy.ru/ajax/json.php?block=tree')
data = await response.json()
print("Ответ получен:", data)
except asyncio.TimeoutError:
print("Таймаут, что-то тормозит.")
except asyncio.CancelledError:
print("Ага, отмена по сути — это трындец.")
except Exception as e:
print("Более серьёзная фигня:", e)
if __name__ == "__main__":
asyncio.run(main())
Прокси, как я понял, ты ещё не совсем в курсе, что оно не волшебное. Попробуй без него или с другим сервером, а если всё равно — выгоняй этого парня, кто мешает, и не забудь добавлять таймауты. И вообще, дурь всякую с отменами — это про то, что ты сам прервал работу — или код застрял.
Ну, и книжки почитай, чтобы понять, что оно такое — асинхронность. А то бьёшься головой о стену, в то время как всё решается простым и понятным способом.
А если хочешь, чтобы я тебе по-нормальному помог — скажи, где именно возникает сбой, или, хуже того, сам ручонками отменяешь асинхронные таски.