私のデータ取得スクリプトはすべて、サーバーの負荷を最小限に抑えるためにキャッシュを使用しています。「If-Modified-Since」、「If-None-Match」、「Accept-Encoding:gzip」などのHTTPツールを必ず使用してください。
また、リクエストを並行して実行できるように、マルチプロセッシングモジュールの使用を検討してください。
これが私のダウンローダースクリプトからの抜粋です:
def urlretrieve(url, filename, cache, lock=threading.Lock()):
'Read contents of an open url, use etags and decompress if needed'
request = urllib2.Request(url)
request.add_header('Accept-Encoding', 'gzip')
with lock:
if ('etag ' + url) in cache:
request.add_header('If-None-Match', cache['etag ' + url])
if ('date ' + url) in cache:
request.add_header('If-Modified-Since', cache['date ' + url])
try:
u = urllib2.urlopen(request)
except urllib2.HTTPError as e:
return Response(e.code, e.msg, False, False)
content = u.read()
u.close()
compressed = u.info().getheader('Content-Encoding') == 'gzip'
if compressed:
content = gzip.GzipFile(fileobj=StringIO.StringIO(content), mode='rb').read()
written = writefile(filename, content)
with lock:
etag = u.info().getheader('Etag')
if etag:
cache['etag ' + url] = etag
timestamp = u.info().getheader('Date')
if timestamp:
cache['date ' + url] = timestamp
return Response(u.code, u.msg, compressed, written)
キャッシュは、永続的な辞書であるshelveのインスタンスです。
ダウンローダーの呼び出しは、マルチプロセッシングプールインスタンスでimap_unordered()と並列化されます。