scraping - ¿Cómo leo los datos de imagen de una URL en Python?
web scraping python examples (6)
En Python3, los módulos StringIO y cStringIO han desaparecido.
En Python3 debes usar:
from PIL import Image
import requests
from io import BytesIO
response = requests.get(url)
img = Image.open(BytesIO(response.content))
Lo que trato de hacer es bastante simple cuando se trata de un archivo local, pero el problema surge cuando trato de hacerlo con una URL remota.
Básicamente, estoy tratando de crear un objeto de imagen PIL a partir de un archivo extraído de una URL. Claro, siempre podría buscar el URL y almacenarlo en un archivo temporal, luego abrirlo en un objeto de imagen, pero eso se siente muy ineficiente.
Esto es lo que tengo:
Image.open(urlopen(url))
Se deshace quejándose de que seek()
no está disponible, entonces intenté esto:
Image.open(urlopen(url).read())
Pero eso tampoco funcionó. ¿Existe una mejor manera de hacerlo, o está escribiendo en un archivo temporal la forma aceptada de hacer este tipo de cosas?
Para aquellos de ustedes que usan Pillow, a partir de la versión 2.8.0 pueden:
from PIL import Image
import urllib2
im = Image.open(urllib2.urlopen(url))
o si usa requests
:
from PIL import Image
import requests
im = Image.open(requests.get(url, stream=True).raw)
Referencias
Para aquellos que están haciendo algo de sklearn / numpy post procesamiento (es decir, aprendizaje profundo), puede envolver el objeto PIL con np.array (). Esto podría evitar que tenga que buscarlo en Google como lo hice yo:
from PIL import Image
import requests
import numpy as np
from StringIO import StringIO
response = requests.get(url)
img = np.array(Image.open(StringIO(response.content)))
Use StringIO
para convertir la cadena de lectura en un objeto similar a un archivo:
from StringIO import StringIO
import urllib
Image.open(StringIO(urllib.urlopen(url).read()))
Yo uso la biblioteca de solicitudes. Parece ser más robusto.
from PIL import Image
import requests
from StringIO import StringIO
response = requests.get(url)
img = Image.open(StringIO(response.content))
podrías intentar usar un StringIO
import urllib, cStringIO
file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)