다른 해결책은 다운로드 핸들러 또는 다운로드 핸들러 미들웨어를 구현하는 것입니다. ( 다운로더 미들웨어에 대한 자세한 내용 은 스크랩 문서 를 참조하십시오.) 다음은 헤드리스 팬텀 스 웹 드라이버와 함께 셀레늄을 사용하는 예제 클래스입니다.
1)middlewares.py
스크립트 내에서 클래스를 정의하십시오 .
from selenium import webdriver
from scrapy.http import HtmlResponse
class JsDownload(object):
@check_spider_middleware
def process_request(self, request, spider):
driver = webdriver.PhantomJS(executable_path='D:\phantomjs.exe')
driver.get(request.url)
return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.encode('utf-8'))
2) 추가 JsDownload()
변수에 클래스를 DOWNLOADER_MIDDLEWARE
내 settings.py
:
DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500}
3) 통합 HTMLResponse
내에 your_spider.py
. 응답 본문을 디코딩하면 원하는 출력을 얻을 수 있습니다.
class Spider(CrawlSpider):
# define unique name of spider
name = "spider"
start_urls = ["https://www.url.de"]
def parse(self, response):
# initialize items
item = CrawlerItem()
# store data as items
item["js_enabled"] = response.body.decode("utf-8")
선택적 애드온 :
다른 스파이더에게 사용할 미들웨어를 알려주는 기능을 원했기 때문에이 래퍼를 구현했습니다.
def check_spider_middleware(method):
@functools.wraps(method)
def wrapper(self, request, spider):
msg = '%%s %s middleware step' % (self.__class__.__name__,)
if self.__class__ in spider.middleware:
spider.log(msg % 'executing', level=log.DEBUG)
return method(self, request, spider)
else:
spider.log(msg % 'skipping', level=log.DEBUG)
return None
return wrapper
래퍼가 작동하려면 모든 스파이더가 최소한 있어야합니다.
middleware = set([])
미들웨어를 포함하려면 다음을 수행하십시오.
middleware = set([MyProj.middleware.ModuleName.ClassName])
이점 :
스파이더가 아닌 이러한 방식으로 구현할 때의 주요 이점은 하나의 요청 만 작성한다는 것입니다. 예를 들어 AT의 솔루션에서 : 다운로드 핸들러는 요청을 처리 한 다음 스파이더에 대한 응답을 전달합니다. 그러면 스파이더는 parse_page 함수에서 새로운 요청을합니다. 이는 동일한 콘텐츠에 대한 두 가지 요청입니다.