Pythonを使用してWebサイトから画像をダウンロードする4つの方法

最近、サイトから画像をダウンロードする単純なパーサーをPythonで記述し(理論的には、同じパーサーは画像だけでなく他の形式のファイルもダウンロードできます)、ディスクに保存する必要がありました。 合計で、インターネット上で4つの方法を見つけました。 この記事では、それらをすべてまとめて収集することにしました。



これらの方法は次のとおりです。



第一の方法


最初の方法は、urllibモジュール(またはurllib2)を使用します。 画像imgへのリンクがあります。 メソッドは次のとおりです。



import urllib resource = urllib.urlopen(img) out = open("...\img.jpg", 'wb') out.write(resource.read()) out.close()
      
      







ここでは、画像の記録モードが「w」ではなく「wb」(バイナリ)であることに注意する必要があります。



第二の方法


2番目の方法は、同じurllibを使用します。 将来的には、この方法は最初の方法よりもわずかに遅いことが示されます(構文解析速度係数の負の意味合いはあいまいです)が、簡潔であるため注意する価値があります。



 import urllib urllib.urlretrieve(img, "...\img.jpg")
      
      







さらに、urllib2ライブラリのurlretrieve関数が、私には未知の理由で(誰かが何を教えてくれますか)欠落していることに注意する価値があります。



第三の方法


3番目の方法では、requestsモジュールを使用します。 このメソッドは、最初の2つのメソッドと同じ順序で画像をアップロードします。



 import requests p = requests.get(img) out = open("...\img.jpg", "wb") out.write(p.content) out.close()
      
      





同時に、PythonでWebを操作するときは、その簡潔さと扱いやすさから、urllibおよびhttplibファミリの代わりに正確にリクエストを使用することをお勧めします。



4番目の方法


4番目の方法は、以前の方法と速度が根本的に異なります(全順序)。 httplib2モジュールの使用に基づきます。 次のようになります。



 import httplib2 h = httplib2.Http('.cache') response, content = h.request(img) out = open('...\img.jpg', 'wb') out.write(content) out.close()
      
      







ここではキャッシュが明示的に使用されます。 キャッシュなし(h = httplib2.Http())の場合、このメソッドは以前のメソッドよりも6〜9倍遅くなります。



lenta.ruニュースフィードのサイトから拡張子が* .jpgの画像をダウンロードする例で、速度テストを実施しました。 この基準に適合する画像の選択とプログラムの実行時間の測定は、次のように行われました。



 import re, time, urllib2 url = "http://lenta.ru/" content = urllib2.urlopen(url).read() imgUrls = re.findall('img .*?src="(.*?)"', ontent) start = time.time() for img in imgUrls: if img.endswith(".jpg"): """      url""" print time.time()-start
      
      







サイトの写真を絶えず変更しても、測定の純度には影響しませんでした。メソッドが次々に機能するためです。 得られた結果は次のとおりです。



メソッド速度比較表
方法1、s 方法2、s 方法3、s 方法4、s(キャッシングなし、s)
0.823 0.908 0.874 0.089(7.625)


データは、7回の測定結果を平均した結果として表示されます。

Grabライブラリー(およびその他)を扱った人に、このライブラリーや他のライブラリーを使用して画像をダウンロードするための同様の方法をコメントに書き込むように依頼してください。



All Articles