は、同様の問題が、私はいくつかのチェックをしたい最初の数項目のためのクモ中(デシベルコールが含まれます)と、チェックが渡された場合(クロールを停止私は、ほんの少しのリクエストがある場合、DB接続をブロックすることでそれらを行うことができると思います。
私は心配しています。もし、スパイダースパイダーが、私たちが掻き集めたサイトへのHTTPリクエストをうまく行っているなら、同じメカニズムを使って非同期dbリクエストをしましょう。 elasticsearchのように、REST APIを持つデータベースに実装するのは簡単でなければなりません。これは私がAWS S3のために作られたものです
:
from types import MethodType
import botocore.session
import treq
from scrapy import Request
class BotocoreRequest(Exception):
def __init__(self, request, *args, **kwargs):
super(BotocoreRequest, self).__init__(*args, **kwargs)
self.method = request.method
# https://github.com/twisted/treq/issues/185
self.url = request.url.replace('https://', 'http://')
self.headers = dict(request.headers)
self.body = request.body and request.body.read()
def _send_request(self, request_dict, operation_model):
request = self.create_request(request_dict, operation_model)
raise BotocoreRequest(request=request)
class ScrapyAWSClient(object):
def __init__(self, service, access_key, secret_key, region, timeout=30):
session = botocore.session.get_session()
session.set_credentials(
access_key=access_key,
secret_key=secret_key
)
self.client = session.create_client(service, region_name=region)
endpoint = self.client._endpoint
endpoint._send_request = MethodType(_send_request, endpoint)
self.timeout = timeout
def request(self, method, callback, meta, **kwargs):
try:
getattr(self.client, method)(**kwargs)
except BotocoreRequest as e:
return Request(
method=e.method,
url=e.url,
body=e.body,
headers=e.headers,
meta=meta,
callback=callback,
dont_filter=True
)
スパイダー:
class MySpider(Spider):
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.client = ScrapyAWSClient(
service='s3',
access_key='',
secret_key='',
region='your-region'
)
def parse(self, response):
...
yield self.client.request(
method='get_object',
Bucket='my-s3-bucket',
Key='my-key',
callback=self.my_parser,
meta={
'handle_httpstatus_list': [200, 403]
}
)
は、この問題はすでに私が知っている他の例では、パイプラインを使用して解決されます。 db lagの問題がまだ残っている場合は、動的なローカル索引を作成して、解析した後に更新することができます(サーバーにメモリーの問題がないため)。ミドルウェアは静かなdbデータの可用性によっても影響を受けます。 – Kruser