Не удалось загрузить изображение по URL-ссылке с помощью Python - PullRequest
0 голосов
/ 17 октября 2018

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

работает - https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng8&TRANSPARENT=true&layers=global%3Abase&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1934774.0599543825%2C6239707.492975509%2C1937220.044859508%2C6242153.477880634

не работает - https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&layers=custom%3Avrbovce_elektrina&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1947003.9844800085%2C6242153.477880634%2C1949449.969385134%2C6244599.46278576

Метод 1

Использование запросов Python и библиотек подушек.Здесь изображение должно быть загружено непосредственно с URL.

import requests
from PIL import Image
from io import BytesIO

url = 'https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&layers=custom%3Avrbovce_elektrina&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1947003.9844800085%2C6242153.477880634%2C1949449.969385134%2C6244599.46278576'

response = requests.get(url)
img = Image.open(BytesIO(response.content))   # error occurs here
img.save('output.png')

Я получаю следующую ошибку:

OSError: cannot identify image file <_io.BytesIO object at 0x04956510>

Метод 2

Использованиебиблиотека Sethonium и хром-драйвер Python.Здесь я пытаюсь показать изображение в веб-браузере и распечатать всю страницу, используя библиотеку Selenium.

from selenium import webdriver
from PIL import Image
from io import BytesIO

url = 'https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&layers=custom%3Avrbovce_elektrina&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1947003.9844800085%2C6242153.477880634%2C1949449.969385134%2C6244599.46278576'

chrome = webdriver.Chrome('path/to/chromedriver')
chrome.get(url)

png = chrome.get_screenshot_as_png()
im = Image.open(BytesIO(png))
im.save('output.png')

chrome.quit()

Проблема этого метода заключается в том, что изображение не загружается (отображается) в открытом браузере Chrome.драйвером хромового драйвера.При вставке ссылки вручную в обычный (настольное приложение) Chrome изображение показывается.

Method 2 - image does not load into chrome

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

Как писал @Piotrek, проблема была не в коде.Я думаю, что проблема была на стороне сервера.Вот что у меня сработало:

  1. Я использовал Метод 2
  2. перед открытием ссылки URL Я открыл следующий «родительский» URL (https://mobec.sk/vrbovce#base),, который использует эти изображения для создания карты
  3. . На следующем шаге я открыл URL-ссылку изображения в веб-браузере
    chrome с помощью модуля python selenium
  4. потом я мог бы сделать снимок экрана

Вот код, который работал для меня:

from selenium import webdriver
from PIL import Image
from io import BytesIO

web_driver = webdriver.Chrome('path/to/chromedriver')
web_driver.get('https://mobec.sk/vrbovce#base')

web_driver.get('https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&layers=custom%3Avrbovce_elektrina&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1947003.9844800085%2C6242153.477880634%2C1949449.969385134%2C6244599.46278576')

png = web_driver.get_screenshot_as_png()
im = Image.open(BytesIO(png))
im.save('output.png')

web_driver.quit()
0 голосов
/ 17 октября 2018

Для этого вы можете использовать библиотеку StringIO .

import requests
from PIL import Image
from StringIO import StringIO

url = 'https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng8&TRANSPARENT=true&layers=global%3Abase&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1934774.0599543825%2C6239707.492975509%2C1937220.044859508%2C6242153.477880634'

response = requests.request("GET", url)
image = Image.open(StringIO(response.content))
image.save('output.png')

для python3;

import requests
from PIL import Image
from io import BytesIO

url = 'https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng8&TRANSPARENT=true&layers=global%3Abase&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1934774.0599543825%2C6239707.492975509%2C1937220.044859508%2C6242153.477880634'

response = requests.request("GET", url)
image = Image.open(BytesIO(response.content))
image.save('output.png')
0 голосов
/ 17 октября 2018

Я протестировал оба метода на обеих ссылках, и похоже, что со второй ссылкой что-то не так: первая работает отлично, либо при ручном открытии с помощью браузера, либо с использованием любого из этих методов;второй не открывается в браузере и выдает ошибку в обоих методах (оба они хороши в коде).

Как написано в сообщении об ошибке - Could not find layer custom:vrbovce_elektrina - в обоих методах и при ручном вставке браузер не может найти слой с именем vrbovce_elektrina.Может быть, там есть опечатка или на этой странице нет такого изображения / слоя.

Код хорош, просто ссылка не работает.

0 голосов
/ 17 октября 2018

Используя запросы, просто запишите содержимое ответа в файл:

with open('image-file', 'wb') as fp: 
   fp.write(response.content)
...