Tidak dapat mengunduh gambar dari tautan url menggunakan Python

Saya ingin mengunduh gambar dari web, tetapi saya selalu mendapat pesan kesalahan apa pun metode yang digunakan. Namun, saya tidak mengalami masalah saat mendownload gambar lain menggunakan metode ini.

berfungsi - 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

tidak berfungsi - 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

Metode 1

Menggunakan permintaan Python dan perpustakaan Bantal. Di sini gambar harus diunduh langsung dari 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')

Saya mendapatkan kesalahan berikut:

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

Metode 2

Menggunakan perpustakaan Selenium dan chromedriver Python. Di sini saya mencoba menampilkan gambar di browser web dan mencetak seluruh halaman menggunakan perpustakaan 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()

Masalah dengan metode ini adalah gambar tidak dimuat (ditampilkan) di browser Chrome yang dibuka oleh driver chromedriver. Saat menempelkan tautan secara manual ke Chrome normal (aplikasi desktop), gambar akan ditampilkan.

Metode 2 - gambar tidak dimuat ke chrome


person user21816    schedule 17.10.2018    source sumber


Jawaban (4)


Saya menguji kedua metode pada kedua tautan dan sepertinya ada yang salah dengan tautan kedua: tautan pertama berfungsi dengan baik, baik saat membukanya secara manual dengan browser atau menggunakan salah satu metode tersebut; yang kedua tidak terbuka di browser dan memberikan kesalahan di kedua metode (keduanya baik dari segi kode).

Seperti yang tertulis dalam pesan kesalahan - Could not find layer custom:vrbovce_elektrina - baik dalam metode maupun penempelan manual, browser tidak dapat menemukan lapisan bernama vrbovce_elektrina. Mungkin ada salah ketik atau tidak ada gambar/layer seperti itu di halaman ini.

Kodenya bagus, hanya saja linknya tidak berfungsi.

person Piotrek    schedule 17.10.2018
comment
Itulah yang saya pikirkan. Ketika saya mengeklik tautan kedua, browser akan mencoba membuka gambar tetapi memberi saya kesalahan (Gbr. 1). Namun, ketika saya menyalin tautan dan menempelkannya sebagai url ke tab browser web baru, gambar tersebut ditampilkan. Tahukah Anda mengapa demikian? - person user21816; 17.10.2018
comment
Jujur saja tidak tahu, karena saya tidak bisa membuka link kedua sama sekali. Mencoba menggunakan browser yang berbeda, mencoba menggunakan driver yang berbeda di Selenium (chrome, phantomjs dll) dan saya masih tidak dapat melihat gambarnya. - person Piotrek; 17.10.2018
comment
Saya berpikir jika masalahnya bukan pada informasi yang diteruskan ke server web di header permintaan HTTP (bahasa, pengguna, ...). Saya sudah mencoba mengubah header sehingga tidak mendapat informasi bahwa permintaan dikirim dengan skrip python. Namun demikian, saya tidak tahu mengapa Anda tidak dapat membukanya (Bisakah dibuka hanya di negara saya? Mengapa hanya lapisan khusus ini?) - person user21816; 17.10.2018
comment
ya, aku tahu ini aneh. akan sangat membantu untuk melihat apakah orang lain dapat membuka tautan tersebut - person Piotrek; 17.10.2018
comment
Akhirnya, saya berhasil mendownload ini dan gambar serupa lainnya. Saya tidak tahu kenapa, tapi berhasil ketika saya membuka url berikut terlebih dahulu (metode 2): mobec.sk/ vrbovce#base (ini adalah situs web yang menampilkan peta dari gambar-gambar ini). - person user21816; 17.10.2018
comment
senang itu berhasil. Lucunya, membukanya seperti yang Anda sarankan sekarang juga berfungsi untuk saya :) - person Piotrek; 17.10.2018

Seperti yang ditulis @Piotrek, masalahnya bukan pada kodenya. Saya kira masalahnya ada di sisi server. Inilah yang berhasil bagi saya:

  1. Saya telah menggunakan Metode 2
  2. sebelum membuka link url saya telah membuka url "induk" berikut (https://mobec.sk/vrbovce#base), yang menggunakan gambar-gambar ini untuk membuat peta
  3. pada langkah selanjutnya, saya telah membuka link url gambar tersebut di
    web browser chrome menggunakan modul selenium python
  4. setelah itu, saya dapat mengambil tangkapan layar dari gambar tersebut

Ini adalah kode yang berfungsi untuk saya:

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()
person user21816    schedule 17.10.2018

Dengan menggunakan permintaan, cukup tulis konten respons ke file:

with open('image-file', 'wb') as fp: 
   fp.write(response.content)
person Vikrant Sharma    schedule 17.10.2018

Anda dapat menggunakan pustaka StringIO untuk itu.

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')

untuk 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')
person uedemir    schedule 17.10.2018
comment
from StringIO import StringIO hanya berfungsi di Python 2. Di Python 3 gunakan from io import StringIO. Namun, itu juga tidak berfungsi dan memberikan pesan kesalahan ini: TypeError initial_value must be str atau None, not bytes. - person user21816; 17.10.2018
comment
Saya memperbarui jawaban saya untuk python3 dan mencoba memperbarui kode di repl.it dan berfungsi dengan baik. - person uedemir; 17.10.2018
comment
Masalahnya kode tersebut tidak berfungsi dengan url yang tertera pada contoh. Ini berfungsi baik dengan url yang Anda gunakan sejak awal. Cobalah dengan tautan tidak berfungsi dan tidak akan berjalan. Silakan lihat 2 tautan pertama dalam pertanyaan. Bagaimanapun, terima kasih atas contoh yang Anda berikan. - person user21816; 17.10.2018