无法使用Python从网址链接下载图片

时间:2018-10-17 08:40:51

标签: python python-requests selenium-chromedriver python-imaging-library

我想从网络上下载图像,但是无论使用哪种方法,我总是会收到错误消息。但是,使用此方法下载其他图像没有问题。

有效-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的请求和Pillow库。此处应从网址直接下载图片。

import nltk
tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
fp = open("/Users/Desktop/sample.txt", encoding='utf-8')
data = fp.read()
with open("/Users/Desktop/output.txt", 'a', encoding='utf-8' ) as f:
            f.write(''.join(tokenizer.tokenize(data)))
            f.close()

我收到以下错误:

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

方法2

使用Python的Selenium库和chromedriver。在这里,我试图在Web浏览器中显示图像,并使用Selenium库将整个页面打印到屏幕上。

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

此方法的问题在于,该图像未在由chromedriver驱动程序打开的Chrome浏览器中加载(显示)。手动将链接粘贴到普通(桌面应用程序)Chrome中时,将显示图像。

Method 2 - image does not load into chrome

4 个答案:

答案 0 :(得分:1)

我在两个链接上都测试了这两种方法,第二个链接似乎出了点问题:第一个工作得很好,无论是使用浏览器手动打开它还是使用其中任何一种方法;第二个方法无法在浏览器中打开,并且在这两种方法中均出错(都很好用代码)。

在错误消息Could not find layer custom:vrbovce_elektrina中,无论是在方法还是手动粘贴中,浏览器都找不到名为vrbovce_elektrina的图层。也许这里有错字,或者此页面上没有这样的图像/图层。

代码很好,只是链接不起作用。

答案 1 :(得分:1)

正如@Piotrek所写,问题不在代码中。我猜问题出在服务器端。这对我有用:

  1. 我已使用方法2
  2. 在打开URL链接之前,我已经打开了以下“父” URL (https://mobec.sk/vrbovce#base),使用这些图像来     创建地图
  3. 下一步,我在
    中打开了图像的url链接 chrome Web浏览器使用硒python模块
  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()

答案 2 :(得分:0)

使用请求,只需将响应内容写入文件:

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

答案 3 :(得分:0)

您可以使用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')
相关问题