유사 문제, 나는 몇 가지 검사를 수행 할 첫 번째 몇 가지 항목에 대한 거미 (DB 호출 포함)와 검사가 통과하는 경우 (크롤링 중지 난 단지 몇 가지 요청이 있다면, 우리는 그들을 차단 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