Python WebスクレイピングフレームワークScrapyでプロキシサポートをどのように利用しますか?
9 に答える
Scrapy FAQから、
ScrapyはHTTPプロキシで動作しますか?
はい。HTTPプロキシのサポートは、HTTPプロキシダウンローダーミドルウェアを介して提供されます(Scrapy 0.8以降)。を参照してください
HttpProxyMiddleware
。
プロキシを使用する最も簡単な方法は、環境変数を設定することですhttp_proxy
。これがどのように行われるかは、シェルによって異なります。
C:\> set http_proxy = http:// proxy:port csh%setenv http_proxy http:// proxy:port sh $ export http_proxy = http:// proxy:port
httpsプロキシを使用してhttpsWebにアクセスする場合、環境変数を設定するにはhttp_proxy
、以下に従う必要があります。
C:\> set https_proxy = https:// proxy:port csh%setenv https_proxy https:// proxy:port sh $ export https_proxy = https:// proxy:port
単一プロキシ
次のように、で有効
HttpProxyMiddleware
にします。settings.py
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1 }
プロキシを渡してリクエストし
request.meta
ます:request = Request(url="http://example.com") request.meta['proxy'] = "host:port" yield request
アドレスプールがある場合は、プロキシアドレスをランダムに選択することもできます。このような:
複数のプロキシ
class MySpider(BaseSpider):
name = "my_spider"
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.proxy_pool = ['proxy_address1', 'proxy_address2', ..., 'proxy_addressN']
def parse(self, response):
...parse code...
if something:
yield self.get_request(url)
def get_request(self, url):
req = Request(url=url)
if self.proxy_pool:
req.meta['proxy'] = random.choice(self.proxy_pool)
return req
1-「middlewares.py」という名前の新しいファイルを作成し、それをScrapyプロジェクトに保存して、次のコードを追加します。
import base64
class ProxyMiddleware(object):
# overwrite process request
def process_request(self, request, spider):
# Set the location of the proxy
request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT"
# Use the following lines if your proxy requires authentication
proxy_user_pass = "USERNAME:PASSWORD"
# setup basic authentication for the proxy
encoded_user_pass = base64.encodestring(proxy_user_pass)
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
2 –プロジェクトの構成ファイル(./project_name/settings.py)を開き、次のコードを追加します
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
'project_name.middlewares.ProxyMiddleware': 100,
}
これで、リクエストはこのプロキシによって渡されるはずです。簡単ですね。
それは次のようになります:
エクスポートhttp_proxy=http:// user:password @ proxy:port
/ etc / environmentに環境を設定するのに問題があったので、スパイダー(Python)に入れたものは次のとおりです。
os.environ["http_proxy"] = "http://localhost:12345"
誰かが書いた素敵なミドルウェアがあります[1]:https ://github.com/aivarsk/scrapy-proxies 「Scrapyプロキシミドルウェア」
Windowsでは、以前のいくつかの回答をまとめましたが、うまくいきました。私は単にしました:
C:> set http_proxy = http://username:password@proxy:port
それから私は自分のプログラムを立ち上げました:
C:/.../RightFolder> scrapy crawl dmoz
ここで、「dmzo」はプログラム名です(インターネット上のチュートリアルで見つけたものであり、ここにいる場合はおそらくチュートリアルから始めているので、私はそれを書いています)。
Scrapyプロキシなどのミドルウェアを使用することをお勧めします。プロキシをローテーションしたり、不良プロキシをフィルタリングしたり、すべてのリクエストに単一のプロキシを使用したりできます。また、ミドルウェアを使用すると、実行のたびにプロキシを設定する手間を省くことができます。
これはGitHubREADMEから直接のものです。
Scrapy-rotating-proxyライブラリをインストールします
pip install scrapy_proxies
settings.pyに次の設定を追加します
# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
'scrapy_proxies.RandomProxy': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
# Proxy list containing entries like
# http://host1:port
# http://username:password@host2:port
# http://host3:port
# ...
PROXY_LIST = '/path/to/proxy/list.txt'
# Proxy mode
# 0 = Every requests have different proxy
# 1 = Take only one proxy from the list and assign it to every requests
# 2 = Put a custom proxy to use in the settings
PROXY_MODE = 0
# If proxy mode is 2 uncomment this sentence :
#CUSTOM_PROXY = "http://host1:port"
ここでは、再試行時間を変更したり、単一またはローテーションプロキシを設定したりできます
- 次に、プロキシを次のようにlist.txtファイルに追加します
http://host1:port
http://username:password@host2:port
http://host3:port
この後、そのプロジェクトに対するすべてのリクエストはプロキシ経由で送信されます。プロキシは、リクエストごとにランダムにローテーションされます。同時実行には影響しません。
注:プロキシを使用したくない場合。あなたは単にscrapy_proxyミドルウェア行にコメントすることができます。
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
# 'scrapy_proxies.RandomProxy': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
ハッピークロール!!!
これが私がすることです
方法1:
このようなダウンロードミドルウェアを作成します
class ProxiesDownloaderMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = 'user:pass@host:port'
でそれを有効にしますsettings.py
DOWNLOADER_MIDDLEWARES: {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
'my_scrapy_project_directory.middlewares.ProxiesDownloaderMiddleware': 600,
},
これで、すべてのリクエストにプロキシが適用されます
方法2:
有効HttpProxyMiddleware
にしsettings.py
て、リクエストごとにこれを実行するだけです
yield Request(url=..., meta={'proxy': 'user:pass@host:port'})