2017-05-27 6 views
1

から間違ってエンコードされた画像をダウンロードしてください私は現在が午前問題は、アニメーションgifとして表示する画像をダウンロードしようとしているが、jpgとしてエンコードされ表示されます。ファイル拡張子とMIMEタイプが両方とも.jpg add image/jpegであるため、jpgとしてエンコードされているようです。のpython3のURL

その後、私はエラーを取得、ファイル開こうとすると、私のローカルマシン(マックOSX)にファイルをダウンロードする:私はそれならば、一部の人は多分ちょうど、そのイメージを無視することを実現しながら

The file could not be opened. It may be damaged or use a file format that Preview doesn’t recognize. 

を修正することができます、私はそれを無視するだけでなく、解決策を探しています。

問題のURLはここにある:ここで

http://www.supergrove.com/wp-content/uploads/2017/03/gif-images-22-1000-about-gif-on-pinterest.jpg 

は私のコードである、と私は提案を開いています:

from PIL import Image 
import requests 

response = requests.get(media, stream = True) 
response.raise_for_status() 

with open(uploadedFile, 'wb') as img: 
    for chunk in response.iter_content(chunk_size=1024): 
     if chunk: 
      img.write(chunk) 
    img.close() 
+0

何ファインダーと、ファイルの拡張子を変更するために行けば? –

+0

イメージを右クリックしてダウンロードしようとしましたが、それを開くかどうか確認してください。私の場合(Debian 8)、firefoxは正しくそれを開きます。 – raratiru

+0

@ whackamadoodle3000違いはありません。それが私が最初に試したことの一つです。また、ファイルをディスクに保存する前にファイル拡張子を変更してみました。 – stwhite

答えて

1

は、この場合には自分の質問に答えるために持っていたが、この問題への答えは、要求のためのrefererを追加しました。ほとんどの場合、htaccessファイルは、リクエストが自分のサーバーから来た場合を除いて、イメージのサーバー上で直接アクセスすることを妨げます。

from fake_useragent import UserAgent 
from io import StringIO,BytesIO 
import io 
import imghdr 
import requests 

# Set url 
mediaURL = 'http://www.supergrove.com/wp-content/uploads/2017/03/gif-images-22-1000-about-gif-on-pinterest.jpg' 

# Create a user agent 
ua = UserAgent() 

# Create a request session 
s = requests.Session() 

# Set some headers for the request 
s.headers.update({ 'User-Agent': ua.chrome, 'Referrer': media }) 


# Make the request to get the image from the url 
response = s.get(mediaURL, allow_redirects=False) 


# The request was about to be redirected 
if response.status_code == 302: 

    # Get the next location that we would have been redirected to 
    location = response.headers['Location'] 

    # Set the previous page url as referer 
    s.headers.update({'referer': location}) 

    # Try the request again, this time with a referer 
    response = s.get(mediaURL, allow_redirects=False, cookies=response.cookies) 

    print(response.headers) 

allow_redirectsの使用を示唆するため@raratiruへの帽子先端。

はまた、画像のサーバーが意図的に自分の画像を見ると、一般的なスクレイパーを防ぐために、アクセスをブロックするかもしれないということである彼らの答えで指摘しました。わかりにくいですが、このソリューションは問題なく動作します。

1

Wheregoesによれば、画像のリンク:

  • http://www.supergrove.com/wp-content/uploads/2017/03/gif-images-22-1000-about-gif-on-pinterest.jpg

は、それを含むページに302リダイレクトを受け取る:

  • http://www.supergrove.com/gif-images/gif-images-22-1000-about-gif-on-pinterest/

したがって、あなたのコードは、イメージとしてWebページをダウンロードしようとしています。 I tried

r = requests.get(the_url, headers=headers, allow_redirects=False)

しかし、それはゼロコンテンツとstatus_code = 302を返します。

(確かにそれはそれは起こるはずは明らかだった...)

このサーバは、それがその要求を満たすことはありませんというように構成されています。

この制限をバイパスすると、が無効になります。は、私の限界のおそれのある知識のために難しいです。

+0

残念ながら、残念ながら画像ヘッダーはありません: '{'Server': 'nginx'、 'Date': 'Mon、29 May 2017 22:15:29 GMT'、 'C​​ontent-Type': 'text/html; 'Keep-Alive'、 'Keep-Alive': 'タイムアウト= 60'、 'X-Powered-By': 'PHP/5.6.30 '、'場所 ':' http://www.supergrove.com/gif-images/gif-images-22-1000-about-gif-on-pinterest/ '} ' – stwhite

+0

この時点で私は本当にわからない。私はリダイレクトをブロックし、クッキーをつかんで再度クッキーをリクエストしようとしましたが、それでもうまくいかないようです(私はクッキーがイメージにアクセスする必要があると仮定していました。 – stwhite

+0

@stwhite人々はイメージに直接アクセスしたくないことは明らかです。 'allow_redirect = False'はゼロの内容と' status_code = 302'を返します。私はそれがサーバーの設定に直接アクセスすることを要求せずにこの状況を回避することが可能であるとは確信していません! – raratiru