Baixar arquivo de imagem a partir do código fonte da página HTML usando python?

StackOverflow https://stackoverflow.com/questions/257409

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo um raspador que baixa todos os arquivos de imagem de uma página HTML e salva-los para uma pasta específica. todas as imagens são a parte da página HTML.

Foi útil?

Solução

Aqui está um código para baixar todas as imagens a partir do URL fornecido, e guardá-los na pasta de saída especificado. Você pode modificá-lo às suas próprias necessidades.

"""
dumpimages.py
    Downloads all the images on the supplied URL, and saves them to the
    specified output file ("/test/" by default)

Usage:
    python dumpimages.py http://example.com/ [output]
"""
from bs4 import BeautifulSoup as bs
from urllib.request import (
    urlopen, urlparse, urlunparse, urlretrieve)
import os
import sys

def main(url, out_folder="/test/"):
    """Downloads all the images at 'url' to /test/"""
    soup = bs(urlopen(url))
    parsed = list(urlparse(url))

    for image in soup.findAll("img"):
        print("Image: %(src)s" % image)
        filename = image["src"].split("/")[-1]
        parsed[2] = image["src"]
        outpath = os.path.join(out_folder, filename)
        if image["src"].lower().startswith("http"):
            urlretrieve(image["src"], outpath)
        else:
            urlretrieve(urlunparse(parsed), outpath)

def _usage():
    print("usage: python dumpimages.py http://example.com [outpath]")

if __name__ == "__main__":
    url = sys.argv[-1]
    out_folder = "/test/"
    if not url.lower().startswith("http"):
        out_folder = sys.argv[-1]
        url = sys.argv[-2]
        if not url.lower().startswith("http"):
            _usage()
            sys.exit(-1)
    main(url, out_folder)

Editar:. Você pode especificar a pasta de saída agora

Outras dicas

A solução de Ryan é bom, mas falha se os URLs de origem da imagem são URLs absolutos ou qualquer coisa que não dão um resultado bom quando simplesmente concatenado com o principal URL da página. urljoin reconhece URLs relativos versus absolutos, então substituir o laço no meio com:

for image in soup.findAll("img"):
    print "Image: %(src)s" % image
    image_url = urlparse.urljoin(url, image['src'])
    filename = image["src"].split("/")[-1]
    outpath = os.path.join(out_folder, filename)
    urlretrieve(image_url, outpath)

Você tem que baixar a página e analisar HTML documento, encontrar a sua imagem com regex e baixá-lo .. Você pode usar urllib2 para download e Beautiful Soup para análise html arquivo.

E esta é a função de download de imagem um para:

def download_photo(self, img_url, filename):
    file_path = "%s%s" % (DOWNLOADED_IMAGE_PATH, filename)
    downloaded_image = file(file_path, "wb")

    image_on_web = urllib.urlopen(img_url)
    while True:
        buf = image_on_web.read(65536)
        if len(buf) == 0:
            break
        downloaded_image.write(buf)
    downloaded_image.close()
    image_on_web.close()

    return file_path

Use htmllib para extrair todas as tags img (override do_img), então use urllib2 para baixar todas as imagens.

Se a necessidade do pedido de autorização referem-se a esta:

r_img = requests.get(img_url, auth=(username, password)) 
f = open('000000.jpg','wb') 
f.write(r_img.content) 
f.close()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top