214

そこで、ウェブコミックをダウンロードしてデスクトップのフォルダに配置する 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
4

20 に答える 20

289

パイソン 2

urllib.urlretrieve の使用

import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

パイソン3

urllib.request.urlretrieveの使用(Python 3 のレガシー インターフェイスの一部であり、まったく同じように機能します)

import urllib.request
urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
于 2010-06-15T05:42:26.683 に答える
97
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
于 2010-06-15T05:40:36.203 に答える
82

記録のために、要求ライブラリを使用します。

import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()

requests.get() エラーをチェックする必要がありますが。

于 2013-02-19T16:26:24.520 に答える
15

@DiGMiの答えのPython 3バージョン:

from urllib import request
f = open('00000001.jpg', 'wb')
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read())
f.close()
于 2013-08-29T15:40:47.627 に答える
10

私はこの答えを見つけて、より信頼できる方法で編集しました

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

これにより、ダウンロード中に他のリソースや例外が発生することはありません。

于 2013-04-08T13:25:32.387 に答える
9

dirファイルがWeb サイトの同じディレクトリにありsite、ファイル名_01.jpg、...、ファイル名_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()
于 2016-02-03T08:13:18.820 に答える
8

.read()部分的または全体的な応答を読み取り、既知の適切な場所で開いたファイルに書き込むのが最も簡単です。

于 2010-06-15T05:38:26.943 に答える
5

'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()
于 2014-05-20T09:30:24.737 に答える
3

ドキュメントをretrieve()注意深く読むことをお勧めします ( http://docs.python.org/library/urllib.html#urllib.URLopener.retrieveread() )。実際に応答の内容を呼び出してから、リトリーブが作成する一時ファイルに残すのではなく、選択したファイル。

于 2010-06-15T05:40:20.247 に答える
3

上記のコードはすべて、元のイメージ名を保持することを許可していません。これは、必要になる場合があります。これは、元のイメージ名を保持しながら、イメージをローカル ドライブに保存するのに役立ちます。

    IMAGE = URL.rsplit('/',1)[1]
    urllib.urlretrieve(URL, IMAGE)

詳細については、これを試してください。

于 2014-07-18T04:42:26.543 に答える