python web-scraping framework Scrapyでプロキシサポートをどのように利用しますか?
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 :港
httpsプロキシを使用してhttps webにアクセスする場合は、環境変数http_proxy
以下に従う必要があります。
C:\> set https_proxy = https:// proxy:port csh%setenv https_proxy https:// proxy:port sh $ export https_proxy = https:// proxy :港
単一プロキシ
次のように、settings.py
でHttpProxyMiddleware
を有効にします。
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」という名前の新しいファイルを作成し、スクレイピープロジェクトに保存し、次のコードを追加します。
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,
}
これで、リクエストはこのプロキシによって渡されるはずです。簡単ですね。
それは:
export http_proxy = http:// user:password @ proxy:port
誰かによって書かれた素敵なミドルウェアがあります[1]: https://github.com/aivarsk/scrapy-proxies "Scrapy proxy middleware"
Windowsでは、以前の回答をいくつかまとめましたが、うまくいきました。私は単にやった:
C:> set http_proxy = http://username:password@proxy:port
その後、プログラムを開始しました。
C:/.../RightFolder> scrapy crawl dmoz
ここで、「dmzo」はプログラム名です(インターネット上のチュートリアルで見つけたもので、ここにいる場合はおそらくチュートリアルから始めたので、私が書いています)。
/ etc/environmentで環境を設定することで問題が発生したため、ここにスパイダー(Python)に入れたものを示します。
os.environ["http_proxy"] = "http://localhost:12345"
scrapy-proxies などのミドルウェアを使用することをお勧めします。プロキシを回転したり、不良プロキシをフィルタリングしたり、すべてのリクエストに対して単一のプロキシを使用したりできます。また、ミドルウェアを使用すると、実行のたびにプロキシを設定する手間が省けます。
これはGitHubのREADMEから直接です。
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"
ここで、再試行回数を変更し、単一または回転プロキシを設定できます
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,
}
ハッピークロール!!!