私は実行中のscrapyプロジェクトを持っていますが、多くのバイナリファイル(zip、tar、mp3、.. etc)をダウンロードしようとするため、帯域幅を大量に消費します。
最善の解決策は、mimetype(Content-Type:)HTTPヘッダーに基づいてリクエストをフィルタリングすることだと思います。私はスクレイプコードを見て、この設定を見つけました:
DOWNLOADER_HTTPCLIENTFACTORY = 'scrapy.core.downloader.webclient.ScrapyHTTPClientFactory'
私はそれを次のように変更しました:DOWNLOADER_HTTPCLIENTFACTORY ='myproject.webclients.ScrapyHTTPClientFactory'
そして、で少し遊んだScrapyHTTPPageGetter
、ここにハイライトされた編集があります:
class ScrapyHTTPPageGetter(HTTPClient):
# this is my edit
def handleEndHeaders(self):
if 'Content-Type' in self.headers.keys():
mimetype = str(self.headers['Content-Type'])
# Actually I need only the html, but just in
# case I've preserved all the text
if mimetype.find('text/') > -1:
# Good, this page is needed
self.factory.gotHeaders(self.headers)
else:
self.factory.noPage(Exception('Incorrect Content-Type'))
これは間違っていると思います。不要なmimetypeであると判断した直後に、リクエストをキャンセル/ドロップするためのよりスクレイプな方法が必要です。データ全体がダウンロードされるのを待つ代わりに。
編集:
私は特にこの部分を求めself.factory.noPage(Exception('Incorrect Content-Type'))
ていますが、それはリクエストをキャンセルする正しい方法です。
アップデート1:
現在のセットアップでScrapyサーバーがクラッシュしたため、問題を解決するために上記と同じコードを使用しないでください。
更新2:
次の構造を使用してテストするためにApacheベースのWebサイトをセットアップしました。
/var/www/scrapper-test/Zend -> /var/www/scrapper-test/Zend.zip (symlink)
/var/www/scrapper-test/Zend.zip
Scrapyは.zip
拡張子の付いたものを破棄しますが、.zipのないものは単なるシンボリックリンクであるにもかかわらず、破棄することに気づきました。