だから私はウェブ漫画をダウンロードして私のデスクトップ上のフォルダーに入れるPythonスクリプトを作成しようとしています。私はここで似たようなことをする似たようなプログラムをいくつか見つけましたが、私が必要とするものと全く同じものはありません。私が最もよく似たものがここにあります( http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images )。私はこのコードを使ってみました:
>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)
それから私は私のファイル "00000001.jpg"のために私のコンピューターを捜しました、しかし私が見つけたのはそれのキャッシュされた絵だけでした。ファイルが自分のコンピュータに保存されたことさえわかりません。ファイルのダウンロード方法を理解したら、残りのファイルの処理方法はわかったと思います。基本的にはforループを使用し、文字列を '00000000'。 'jpg'で分割して、 '00000000'を最大の数まで増分します。これを何らかの方法で決定する必要があります。これを行うための最良の方法、またはファイルを正しくダウンロードする方法に関する推奨事項はありますか?
ありがとうございます。
編集6/15/10
これが完成したスクリプトです。選択したディレクトリにファイルが保存されます。いくつかの奇妙な理由で、ファイルがダウンロードされていないと彼らはただしました。それをクリーンアップする方法に関する任意の提案は大歓迎です。私は現在、サイト上に存在する多くの漫画を見つける方法を模索しています。そうすれば、一定数の例外が発生した後にプログラムを終了させるのではなく、最新の漫画だけを入手できます。
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
rllib.urlretrieve を使用する:
import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
レコードのためだけに、リクエストライブラリを使用します。
import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()
それはrequests.get()エラーをチェックする必要がありますが。
Python 3の場合、import urllib.request
をインポートする必要があります。
import urllib.request
urllib.request.urlretrieve(url, filename)
詳しくは link をご覧ください。
Python 3バージョンの@ DiGMiの答え:
from urllib import request
f = open('00000001.jpg', 'wb')
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read())
f.close()
私はこれを見つけました 答え そして私はより信頼できる方法でそれを編集します
def download_photo(self, img_url, filename):
try:
image_on_web = urllib.urlopen(img_url)
if image_on_web.headers.maintype == 'image':
buf = image_on_web.read()
path = os.getcwd() + DOWNLOADED_IMAGE_PATH
file_path = "%s%s" % (path, filename)
downloaded_image = file(file_path, "wb")
downloaded_image.write(buf)
downloaded_image.close()
image_on_web.close()
else:
return False
except:
return False
return True
ダウンロード中にこれからあなたは他のリソースや例外を得ることはありません。
.read()
を使用して部分的または全体的な応答を読み取り、次にそれを既知の適切な場所で開いたファイルに書き込むのが最も簡単です。
ファイルがウェブサイトdir
の同じディレクトリsite
にあり、次のフォーマットを持つことを知っているなら:filename_01.jpg、...、filename_10.jpgそしてそれらをすべてダウンロードしてください:
import requests
for x in range(1, 10):
str1 = 'filename_%2.2d.jpg' % (x)
str2 = 'http://site/dir/filename_%2.2d.jpg' % (x)
f = open(str1, 'wb')
f.write(requests.get(str2).content)
f.close()
たぶんあなたは 'User-Agent'を必要とします:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36')]
response = opener.open('http://google.com')
htmlData = response.read()
f = open('file.txt','w')
f.write(htmlData )
f.close()
これは私にとってpython 3を使ってうまくいきました。
それはcsvファイルからURLのリストを取得し、フォルダにそれらをダウンロードし始めます。コンテンツや画像が存在しない場合、それはその例外を受け取り、その魔法を作り続けます。
import urllib.request
import csv
import os
errorCount=0
file_list = "/Users/$USER/Desktop/YOUR-FILE-TO-DOWNLOAD-IMAGES/image_{0}.jpg"
# CSV file must separate by commas
# urls.csv is set to your current working directory make sure your cd into or add the corresponding path
with open ('urls.csv') as images:
images = csv.reader(images)
img_count = 1
print("Please Wait.. it will take some time")
for image in images:
try:
urllib.request.urlretrieve(image[0],
file_list.format(img_count))
img_count += 1
except IOError:
errorCount+=1
# Stop in case you reach 100 errors downloading images
if errorCount>100:
break
else:
print ("File does not exist")
print ("Done!")
上記のコードはすべて、元のイメージ名を保存することを許可していません。元のイメージ名は必要な場合があります。これは、元のイメージ名を保持しながら、イメージをローカルドライブに保存するのに役立ちます。
IMAGE = URL.rsplit('/',1)[1]
urllib.urlretrieve(URL, IMAGE)
これを試してください 詳しくは==。
retrieve()
のドキュメントを注意深く読むことをお勧めする以外に( http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve )、実際にはread()
をコンテンツに対して呼び出すことをお勧めします。応答を作成して、取得する一時ファイルに保存するのではなく、選択したファイルに保存します。
もっと簡単な解決策は(python 3)かもしれません:
import urllib.request
import os
os.chdir("D:\\comic") #your path
i=1;
s="00000000"
while i<1000:
try:
urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/"+ s[:8-len(str(i))]+ str(i)+".jpg",str(i)+".jpg")
except:
print("not possible" + str(i))
i+=1;
これはどうですか:
import urllib, os
def from_url( url, filename = None ):
'''Store the url content to filename'''
if not filename:
filename = os.path.basename( os.path.realpath(url) )
req = urllib.request.Request( url )
try:
response = urllib.request.urlopen( req )
except urllib.error.URLError as e:
if hasattr( e, 'reason' ):
print( 'Fail in reaching the server -> ', e.reason )
return False
Elif hasattr( e, 'code' ):
print( 'The server couldn\'t fulfill the request -> ', e.code )
return False
else:
with open( filename, 'wb' ) as fo:
fo.write( response.read() )
print( 'Url saved as %s' % filename )
return True
##
def main():
test_url = 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico'
from_url( test_url )
if __== '__main__':
main()
これを行うもう1つの方法は、fastaiライブラリを使用することです。これは私にとって魅力的なように働きました。私はurlretrieve
を使ってSSL: CERTIFICATE_VERIFY_FAILED Error
に直面していたのでそれを試みました。
url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)
プロキシサポートが必要な場合は、次のようにします。
if needProxy == False:
returnCode, urlReturnResponse = urllib.urlretrieve( myUrl, fullJpegPathAndName )
else:
proxy_support = urllib2.ProxyHandler({"https":myHttpProxyAddress})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
urlReader = urllib2.urlopen( myUrl ).read()
with open( fullJpegPathAndName, "w" ) as f:
f.write( urlReader )