Então, estou tentando criar um script Python que faça o download de webcomics e os coloque em uma pasta na minha área de trabalho. Encontrei alguns programas semelhantes aqui que fazem algo semelhante, mas nada como o que eu preciso. O que eu achei mais parecido está aqui ( http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images ). Eu tentei usar este código:
>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)
Procurei no meu computador um arquivo "00000001.jpg", mas tudo o que encontrei foi a imagem em cache do mesmo. Não tenho certeza se ele salvou o arquivo no meu computador. Depois de entender como fazer o download do arquivo, acho que sei como lidar com o resto. Basicamente, basta usar um loop for e dividir a string no '00000000'. 'Jpg' e incrementar o '00000000' até o maior número, que eu precisaria determinar de alguma forma. Alguma recomendação sobre a melhor maneira de fazer isso ou como fazer o download do arquivo corretamente?
Obrigado!
EDIT 15/6/10
Aqui está o script completo, ele salva os arquivos em qualquer diretório que você escolher. Por alguma estranha razão, os arquivos não estavam sendo baixados e apenas o fizeram. Qualquer sugestão sobre como limpá-lo seria muito apreciada. Atualmente, estou descobrindo como descobrir muitas histórias em quadrinhos no site para que eu possa obter apenas a mais recente, em vez de ter o programa encerrado após um certo número de exceções.
import urllib
import os
comicCounter=len(os.listdir('/file'))+1 # reads the number of files in the folder to start downloading at the next comic
errorCount=0
def download_comic(url,comicName):
"""
download a comic in the form of
url = http://www.example.com
comicName = '00000000.jpg'
"""
image=urllib.URLopener()
image.retrieve(url,comicName) # download comicName at URL
while comicCounter <= 1000: # not the most elegant solution
os.chdir('/file') # set where files download to
try:
if comicCounter < 10: # needed to break into 10^n segments because comic names are a set of zeros followed by a number
comicNumber=str('0000000'+str(comicCounter)) # string containing the eight digit comic number
comicName=str(comicNumber+".jpg") # string containing the file name
url=str("http://www.gunnerkrigg.com//comics/"+comicName) # creates the URL for the comic
comicCounter+=1 # increments the comic counter to go to the next comic, must be before the download in case the download raises an exception
download_comic(url,comicName) # uses the function defined above to download the comic
print url
if 10 <= comicCounter < 100:
comicNumber=str('000000'+str(comicCounter))
comicName=str(comicNumber+".jpg")
url=str("http://www.gunnerkrigg.com//comics/"+comicName)
comicCounter+=1
download_comic(url,comicName)
print url
if 100 <= comicCounter < 1000:
comicNumber=str('00000'+str(comicCounter))
comicName=str(comicNumber+".jpg")
url=str("http://www.gunnerkrigg.com//comics/"+comicName)
comicCounter+=1
download_comic(url,comicName)
print url
else: # quit the program if any number outside this range shows up
quit
except IOError: # urllib raises an IOError for a 404 error, when the comic doesn't exist
errorCount+=1 # add one to the error count
if errorCount>3: # if more than three errors occur during downloading, quit the program
break
else:
print str("comic"+ ' ' + str(comicCounter) + ' ' + "does not exist") # otherwise say that the certain comic number doesn't exist
print "all comics are up to date" # prints if all comics are downloaded
beautifulsoup
? Este post aparece na lista das principaisbeautifulsoup
perguntas #Respostas:
Python 2
Usando urllib.urlretrieve
Python 3
Usando urllib.request.urlretrieve (parte da interface herdada do Python 3, funciona exatamente da mesma maneira)
fonte
import urllib.request urllib.request.retrieve("http://...")
import urllib.request urllib.request.urlretrieve("http://...jpg", "1.jpg")
. Agora é aurlretrieve
partir da 3.x.fonte
Apenas para o registro, usando a biblioteca de solicitações.
Embora deva verificar se há erros no request.get ().
fonte
Para o Python 3, você precisará importar
import urllib.request
:para mais informações confira o link
fonte
Versão Python 3 da resposta de @ DiGMi:
fonte
Encontrei esta resposta e edito-a de maneira mais confiável
Com isso, você nunca obtém outros recursos ou exceções durante o download.
fonte
Se você souber que os arquivos estão localizados no mesmo diretório
dir
do sitesite
e têm o seguinte formato: filename_01.jpg, ..., filename_10.jpg, faça o download de todos eles:fonte
É mais fácil usar apenas
.read()
para ler a resposta parcial ou inteira e gravá-la em um arquivo que você abriu em um local conhecido.fonte
Talvez você precise de 'User-Agent':
fonte
Além de sugerir que você leia os documentos com
retrieve()
atenção ( http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve ), sugiro realmente chamarread()
o conteúdo da resposta e salvá-lo em um arquivo de sua escolha, em vez de deixá-lo no arquivo temporário que a recuperação cria.fonte
Todos os códigos acima não permitem preservar o nome da imagem original, o que às vezes é necessário. Isso ajudará a salvar as imagens na unidade local, preservando o nome da imagem original
Tente isso para mais detalhes.
fonte
Isso funcionou para mim usando python 3.
Ele obtém uma lista de URLs do arquivo csv e inicia o download para uma pasta. Caso o conteúdo ou a imagem não exista, é preciso essa exceção e continua fazendo sua mágica.
fonte
Uma solução mais simples pode ser (python 3):
fonte
Que tal isso:
fonte
Se você precisar de suporte de proxy, poderá fazer o seguinte:
fonte
Outra maneira de fazer isso é através da biblioteca fastai. Isso funcionou como um encanto para mim. Eu estava enfrentando um
SSL: CERTIFICATE_VERIFY_FAILED Error
uso,urlretrieve
então eu tentei isso.fonte
Usando solicitações
fonte
Usando o urllib, você pode fazer isso instantaneamente.
fonte