Некоторое время я пытался загрузить PDF-файл в Python Playwright, который отображается с веб-страницы PHP (не включен в этот пример, поскольку имеет конфиденциальный код - вместо этого я включил ссылку на PDF-файл).
Вот мой код, использующий в качестве примера код JavaScript из https://github.com/microsoft/playwright/issues/3509:
from playwright.async_api import Playwright, async_playwright, expect
import asyncio
import os
import json
tmp_dir = './pwtest/'
user_dir = os.path.join(os.getcwd(),"pwtest","user_dir")
print("User dir: ", user_dir)
downloads_path = os.path.join(os.getcwd(),"pwtest","downloads")
print("Downloads path: ", downloads_path)
storage_state_path = "./pwtest/"
default_preferences = {
"plugins": {
"always_open_pdf_externally": True
}
}
#Making directories can likely be done more efficiently... please comment if you know how, then I'll edit the post.
try:
os.mkdir(os.path.join(os.getcwd(),"pwtest"))
except:
print("Unable to create folder... Likely it already exists.")
try:
os.mkdir(os.path.join(os.getcwd(),"pwtest","downloads"))
except:
print("Unable to create folder... Likely it already exists.")
try:
os.mkdir(os.path.join(os.getcwd(),"pwtest","user_dir"))
except:
print("Unable to create folder... Likely it already exists.")
try:
os.mkdir(os.path.join(os.getcwd(),"pwtest","user_dir","Default"))
except:
print("Unable to create folder... Likely it already exists.")
with open(os.path.join(user_dir, "Default", "Preferences"), "w") as f:
f.write(json.dumps(default_preferences))
async def run(playwright: Playwright) -> None:
browser = await playwright.chromium.launch_persistent_context(user_dir, accept_downloads=True, headless=False, slow_mo=1000)
browser.set_default_timeout(10000)
page = await browser.new_page()
# Start waiting for the download
file_name = "test_d.pdf"
async with page.expect_download() as download_info:
await page.goto("https://www.africau.edu/images/default/sample.pdf", timeout= 5000)
await page.wait_for_timeout(200)
print("Saving file to ", downloads_path, file_name)
# Wait for the download to start
download = await download_info.value
# Wait for the download process to complete
print(await download.path())
# Save downloaded file somewhere
await download.save_as(os.path.join(downloads_path, file_name))
await browser.close()
async def main() -> None:
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
Буду благодарен за помощь.
Я продолжаю получать следующую ошибку после попытки синхронизации, асинхронного кода и т. д. Другая альтернатива, скорее всего, перехватит передачу больших двоичных объектов, но я не знаю, как это делается. Посоветуйте, пожалуйста.
playwright._impl._api_types.Error: net::ERR_ABORTED at https://www.africau.edu/images/default/sample.pdf
=========================== logs ===========================
navigating to "https://www.africau.edu/images/default/sample.pdf", waiting until "load"
============================================================
Подробнее здесь: https://stackoverflow.com/questions/752 ... rr-aborted