Python (Pyppeteer): [WinError 10054] Существующее соединение было принудительно закрыто удаленным хостом - PullRequest
0 голосов
/ 24 апреля 2020

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

Это Python код, чтобы сделать скриншот.

from pyppeteer import launch

async def main():
    browser = await launch(headless=True)
    page = await browser.newPage()

    arg = sys.argv[1]

    await page.goto("http://localhost:8888/map.html"), {'waitUntil': 'networkidle2'})
    await page.pdf({'path': 'screenshot.pdf', 'landscape' : True,  'format': 'A4'});
    await browser.close()


asyncio.get_event_loop().run_until_complete(main())

Вот код map.html, который я пытаюсь передать через сервер Python. Он читает файл json с некоторыми настройками функций и вызывает flex_map, который имеет некоторый код D3 Javascript.

<html>
<head>
    <meta charset="utf-8">
    <script src="https://d3js.org/d3.v5.min.js"></script> 
    <script src="/js/legend.js"></script>
    <script src="/js/flex_map.js"></script>
</head>
  <body>
    <script>

      d3.json("/settings/map_settings.json").then(function(mapSettings) { 
          flex_map(mapSettings.geoJsonFile, 
                   mapSettings.dataFile, 
                   mapSettings.fillVariable, 
                   mapSettings.geoVariable, 
                   mapSettings.geoJsonGeoVariable,
                   mapSettings.legend_title,
                   mapSettings.legendTranslateX, 
                   mapSettings.legendTranslateY);
      });

    </script>
  </body>
</html>

Когда я отправляю этот код с python take_screenshot.py после создания локального сервера, Я получаю следующую ошибку:

Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...
127.0.0.1 - - [23/Apr/2020 18:34:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2020 18:34:04] "GET /map.html HTTP/1.1" 304 -
127.0.0.1 - - [23/Apr/2020 18:34:04] "GET /settings/map_settings.json HTTP/1.1" 304 -
127.0.0.1 - - [23/Apr/2020 18:34:04] "GET /data/temp_data.csv HTTP/1.1" 304 -
127.0.0.1 - - [23/Apr/2020 18:35:08] "GET /map.html HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2020 18:35:08] "GET /js/legend.js HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2020 18:35:08] "GET /js/flex_map.js HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2020 18:35:08] "GET /settings/map_settings.json HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2020 18:35:09] "GET /data/temp_data.csv HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2020 18:35:09] "GET /geoJSON/us_counties.json HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 52861)
Traceback (most recent call last):
  File "C:\Anaconda\lib\socketserver.py", line 650, in process_request_thread
    self.finish_request(request, client_address)
  File "C:\Anaconda\lib\socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Anaconda\lib\http\server.py", line 646, in __init__
    super().__init__(*args, **kwargs)
  File "C:\Anaconda\lib\socketserver.py", line 720, in __init__
    self.handle()
  File "C:\Anaconda\lib\http\server.py", line 426, in handle
    self.handle_one_request()
  File "C:\Anaconda\lib\http\server.py", line 394, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "C:\Anaconda\lib\socket.py", line 589, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
----------------------------------------

Я не совсем уверен, где может быть источник этой проблемы. Одна странная вещь - если я изменю файл HTML на

<html>
<head>
    <meta charset="utf-8">
    <script src="https://d3js.org/d3.v5.min.js"></script> 
    <script src="/js/legend.js"></script>
    <script src="/js/flex_map.js"></script>
</head>
  <body>
    <script>
          flex_map(args go here...);
    </script>
  </body>
</html>

, код работает нормально и делает снимок экрана, так что это может быть связано с загрузкой в ​​файл json, но я не уверен, как решить это. Также нормально работает код map.html на Chrome через localhost.

...