461

requestsPythonのモジュールを使用してWebから画像をダウンロードして保存しようとしています。

これが私が使用した(動作する)コードです:

img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
    f.write(img.read())

以下を使用した新しい(機能しない)コードを次に示しますrequests

r = requests.get(settings.STATICMAP_URL.format(**data))
if r.status_code == 200:
    img = r.raw.read()
    with open(path, 'w') as f:
        f.write(img)

応答から使用する属性について教えてくださいrequests

4

16 に答える 16

602

response.rawファイルオブジェクトを使用するか、応答を反復処理することができます。

ファイルのようなオブジェクトを使用するresponse.raw場合、デフォルトでは、圧縮された応答はデコードされません(GZIPまたはdeflateを使用)。decode_content属性をに設定することで、とにかく強制的に解凍することができますTrue(デコード自体を制御するように設定します)requests。次に、PythonでデータをファイルオブジェクトにストリーミングするためにFalse使用できます。shutil.copyfileobj()

import requests
import shutil

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
    with open(path, 'wb') as f:
        r.raw.decode_content = True
        shutil.copyfileobj(r.raw, f)        

応答を繰り返すには、ループを使用します。このように繰り返すと、この段階でデータが確実に解凍されます。

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
    with open(path, 'wb') as f:
        for chunk in r:
            f.write(chunk)

これにより、128バイトのチャンクでデータが読み取られます。別のチャンクサイズの方がうまくいくと思われる場合は、カスタムチャンクサイズのResponse.iter_content()メソッドを使用してください。

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
    with open(path, 'wb') as f:
        for chunk in r.iter_content(1024):
            f.write(chunk)

Pythonが改行を試行して変換しないようにするには、宛先ファイルをバイナリモードで開く必要があることに注意してください。また、最初に画像全体がメモリにダウンロードされないstream=Trueように設定しました。requests

于 2012-10-30T11:18:15.533 に答える
268

リクエストからファイルのようなオブジェクトを取得し、ファイルにコピーします。これにより、すべてを一度にメモリに読み込むことも回避されます。

import shutil

import requests

url = 'http://example.com/img.png'
response = requests.get(url, stream=True)
with open('img.png', 'wb') as out_file:
    shutil.copyfileobj(response.raw, out_file)
del response
于 2013-08-04T13:32:16.223 に答える
205

これはどうですか、簡単な解決策です。

import requests

url = "http://craphound.com/images/1006884_2adf8fc7.jpg"
response = requests.get(url)
if response.status_code == 200:
    with open("/Users/apple/Desktop/sample.jpg", 'wb') as f:
        f.write(response.content)
于 2014-02-06T06:33:00.427 に答える
85

リクエストを使用して画像をダウンロードする必要もあります。私は最初にMartijnPietersの答えを試しましたが、うまくいきました。urllibしかし、この単純な関数でプロファイルを作成したところ、とに比べて非常に多くの関数呼び出しを使用していることがわかりましたurllib2

次に、リクエストモジュールの作成者が推奨する方法を試しました。

import requests
from PIL import Image
# python2.x, use this instead  
# from StringIO import StringIO
# for python3.x,
from io import StringIO

r = requests.get('https://example.com/image.jpg')
i = Image.open(StringIO(r.content))

これにより、関数呼び出しの数が大幅に減り、アプリケーションが高速化されました。これが私のプロファイラーのコードと結果です。

#!/usr/bin/python
import requests
from StringIO import StringIO
from PIL import Image
import profile

def testRequest():
    image_name = 'test1.jpg'
    url = 'http://example.com/image.jpg'

    r = requests.get(url, stream=True)
    with open(image_name, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)

def testRequest2():
    image_name = 'test2.jpg'
    url = 'http://example.com/image.jpg'

    r = requests.get(url)
    
    i = Image.open(StringIO(r.content))
    i.save(image_name)

if __name__ == '__main__':
    profile.run('testUrllib()')
    profile.run('testUrllib2()')
    profile.run('testRequest()')

の結果testRequest

343080 function calls (343068 primitive calls) in 2.580 seconds

そしての結果testRequest2

3129 function calls (3105 primitive calls) in 0.024 seconds
于 2013-08-07T15:52:16.180 に答える
67

これは、を使用するよりも簡単な場合がありますrequestsrequestsこれは、 HTTP関連の処理を使用しないことを提案する唯一の機会です。

使用する2つのライナーurllib

>>> import urllib
>>> urllib.request.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

wget非常に使いやすいという名前の素敵なPythonモジュールもあります。ここで見つかりました。

これは、設計の単純さを示しています。

>>> import wget
>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
>>> filename = wget.download(url)
100% [................................................] 3841532 / 3841532>
>> filename
'razorback.mp3'

楽しみ。

編集:outパスを指定するパラメーターを追加することもできます。

>>> out_filepath = <output_filepath>    
>>> filename = wget.download(url, out=out_filepath)
于 2015-11-23T08:02:30.077 に答える
38

次のコードスニペットはファイルをダウンロードします。

ファイルは、指定されたURLのファイル名で保存されます。

import requests

url = "http://example.com/image.jpg"
filename = url.split("/")[-1]
r = requests.get(url, timeout=0.5)

if r.status_code == 200:
    with open(filename, 'wb') as f:
        f.write(r.content)
于 2017-04-07T19:42:01.650 に答える
21

主に2つの方法があります。

  1. .content(最も単純/公式)を使用する( Zhenyi Zhangの回答を参照):

    import io  # Note: io.BytesIO is StringIO.StringIO on Python2.
    import requests
    
    r = requests.get('http://lorempixel.com/400/200')
    r.raise_for_status()
    with io.BytesIO(r.content) as f:
        with Image.open(f) as img:
            img.show()
    
  2. 使用.rawMartijn Pietersの回答を参照):

    import requests
    
    r = requests.get('http://lorempixel.com/400/200', stream=True)
    r.raise_for_status()
    r.raw.decode_content = True  # Required to decompress gzip/deflate compressed responses.
    with PIL.Image.open(r.raw) as img:
        img.show()
    r.close()  # Safety when stream=True ensure the connection is released.
    

どちらのタイミングでも目立った違いはありません。

于 2016-05-31T14:01:08.617 に答える
16

画像とリクエストをインポートするのと同じくらい簡単

from PIL import Image
import requests

img = Image.open(requests.get(url, stream = True).raw)
img.save('img1.jpg')
于 2018-09-17T08:33:37.277 に答える
5

これは、まだストリーミングを使用している、よりユーザーフレンドリーな答えです。

これらの関数を定義して、を呼び出すだけgetImage()です。デフォルトでは、URLと同じファイル名を使用して現在のディレクトリに書き込みますが、両方を変更できます。

import requests
from StringIO import StringIO
from PIL import Image

def createFilename(url, name, folder):
    dotSplit = url.split('.')
    if name == None:
        # use the same as the url
        slashSplit = dotSplit[-2].split('/')
        name = slashSplit[-1]
    ext = dotSplit[-1]
    file = '{}{}.{}'.format(folder, name, ext)
    return file

def getImage(url, name=None, folder='./'):
    file = createFilename(url, name, folder)
    with open(file, 'wb') as f:
        r = requests.get(url, stream=True)
        for block in r.iter_content(1024):
            if not block:
                break
            f.write(block)

def getImageFast(url, name=None, folder='./'):
    file = createFilename(url, name, folder)
    r = requests.get(url)
    i = Image.open(StringIO(r.content))
    i.save(file)

if __name__ == '__main__':
    # Uses Less Memory
    getImage('http://www.example.com/image.jpg')
    # Faster
    getImageFast('http://www.example.com/image.jpg')

request内臓はここgetImage()での答えに基づいており、の内臓は上記の答えに基づいています。getImageFast()

于 2014-04-06T16:08:35.440 に答える
5

コメントを投稿するのに十分な担当者がいないため、回答を投稿しますが、Blairg23によって投稿されたwgetを使用すると、パスのoutパラメーターを指定することもできます。

 wget.download(url, out=path)
于 2016-05-24T13:50:40.550 に答える
5

これが私がやった方法です

import requests
from PIL import Image
from io import BytesIO

url = 'your_url'
files = {'file': ("C:/Users/shadow/Downloads/black.jpeg", open('C:/Users/shadow/Downloads/black.jpeg', 'rb'),'image/jpg')}
response = requests.post(url, files=files)

img = Image.open(BytesIO(response.content))
img.show()
于 2019-10-18T10:37:49.020 に答える
3

これは、リクエストを含むバイナリファイルをダウンロードする方法に関するグーグル検索で出てくる最初の応答です。リクエストを含む任意のファイルをダウンロードする必要がある場合は、次を使用できます。

import requests
url = 'https://s3.amazonaws.com/lab-data-collections/GoogleNews-vectors-negative300.bin.gz'
open('GoogleNews-vectors-negative300.bin.gz', 'wb').write(requests.get(url, allow_redirects=True).content)
于 2019-06-17T13:23:38.527 に答える
3

私のアプローチは、response.content(blob)を使用して、バイナリモードでファイルに保存することでした。

img_blob = requests.get(url, timeout=5).content
     with open(destination + '/' + title, 'wb') as img_file:
         img_file.write(img_blob)

キーワードに基づいてunsplash.comから画像をダウンロードする私のPythonプロジェクトをチェックしてください。

于 2020-08-20T01:01:04.920 に答える
1

あなたはこのようなことをすることができます:

import requests
import random

url = "https://images.pexels.com/photos/1308881/pexels-photo-1308881.jpeg? auto=compress&cs=tinysrgb&dpr=1&w=500"
name=random.randrange(1,1000)
filename=str(name)+".jpg"
response = requests.get(url)
if response.status_code.ok:
   with open(filename,'w') as f:
    f.write(response.content)
于 2019-05-02T19:21:42.187 に答える
0

使用が最も簡単な解決策の1つであるというBlairg23に同意します。urllib.request.urlretrieve

ここで指摘したいことが1つあります。リクエストがスクリプト(ボット)経由で送信されたために何もダウンロードされない場合があります。Google画像や他の検索エンジンからの画像を解析する場合は、最初user-agentにリクエストに渡してからheaders画像をダウンロードする必要があります。それ以外の場合は、リクエストはブロックされ、エラーがスローされます。

画像を渡しuser-agentてダウンロードします。

opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582')]
urllib.request.install_opener(opener)

urllib.request.urlretrieve(URL, 'image_name.jpg')

requests、、bs4を使用してGoogle画像から画像をスクレイプしてダウンロードするオンラインIDEのコードurllib.requests


または、Google、Bing、Yahoo!、DuckDuckGo(およびその他の検索エンジン)などの検索エンジンから画像を取得することが目標の場合は、SerpApiを使用できます。これは無料プランの有料APIです。

最大の違いは、検索エンジンからブロックをバイパスする方法や、HTMLまたはJavaScriptから特定の部分を抽出する方法を理解する必要がないことです。これは、エンドユーザー向けにすでに行われているためです。

統合するコード例:

import os, urllib.request
from serpapi import GoogleSearch

params = {
  "api_key": os.getenv("API_KEY"),
  "engine": "google",
  "q": "pexels cat",
  "tbm": "isch"
}

search = GoogleSearch(params)
results = search.get_dict()

print(json.dumps(results['images_results'], indent=2, ensure_ascii=False))

# download images 
for index, image in enumerate(results['images_results']):

    # print(f'Downloading {index} image...')
    
    opener=urllib.request.build_opener()
    opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582')]
    urllib.request.install_opener(opener)

    # saves original res image to the SerpApi_Images folder and add index to the end of file name
    urllib.request.urlretrieve(image['original'], f'SerpApi_Images/original_size_img_{index}.jpg')

-----------
'''
]
  # other images
  {
    "position": 100, # 100 image
    "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQK62dIkDjNCvEgmGU6GGFZcpVWwX-p3FsYSg&usqp=CAU",
    "source": "homewardboundnj.org",
    "title": "pexels-helena-lopes-1931367 - Homeward Bound Pet Adoption Center",
    "link": "https://homewardboundnj.org/upcoming-event/black-cat-appreciation-day/pexels-helena-lopes-1931367/",
    "original": "https://homewardboundnj.org/wp-content/uploads/2020/07/pexels-helena-lopes-1931367.jpg",
    "is_product": false
  }
]
'''

免責事項、私はSerpApiで働いています。

于 2021-10-29T07:12:02.340 に答える
-2

ダウンロード用画像

import requests
Picture_request = requests.get(url)
于 2021-06-17T05:33:55.550 に答える