スパイダーは scrapy crawl の下では期待どおりのプロキシを使えますが、Pythonスクリプトから起動すると直接接続してしまいます。プロキシサーバーを変更する前に、そのスクリプトが設定をどう組み立てているかを確認してください。

既存のScrapyプロジェクトと登録済みのスパイダーの場合:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()
process = CrawlerProcess(settings=settings)
process.crawl('catalog')
process.start()

catalog をプロジェクトのスパイダー名に置き換えます。プロジェクトは scrapy.cfg から、またはインポート可能な設定モジュールを指す正しく設定された SCRAPY_SETTINGS_MODULE から発見できる必要があります。

CrawlerProcess() だけを構築しても、スクリプトがスパイダークラスもインポートしているという理由だけではプロジェクトの設定ファイルはインポートされません。そのため DOWNLOADER_MIDDLEWARES で有効にしたカスタムミドルウェアがその実行から欠落することがあります。

設定を読み込むと構成済みのコンポーネントが供給されますが、プロキシアドレスを勝手に作るわけではありません。ScrapyのHTTPプロキシミドルウェアは依然として通常の環境プロキシか明示的な request.meta['proxy'] の値が必要です。HTTPPROXY_ENABLED がそれを無効にしていないか確認してください。許可された公開ページのクロールでは、HTTPプロキシ一覧が、そのメタデータや環境で渡すHTTPプロキシ値の候補を提供します。

起動スクリプトが読み込んだ設定と有効なミドルウェアを、コマンドラインでの実行と比較してください。一致していれば、選択したリクエストのプロキシメタデータと実際の転送エラーで調査を続けます。

関連記事