github.com/scrapy-plugins/scrapy-splash
Scrapy는 lxml을 기반으로 만들어져 있어서 자바스크립트를 읽고 실행하지 못한다.
따라서 자바스크립트를 처리하기 위해 Selenium과 PhantomJS를 주로 사용하는데, Scrapy에서도 Splash를 사용하면 자바스크립트를 처리할 수 있다.
Splash는 웹킷을 기반으로 만들들어진 헤드리스 브라우저를 사용한 서버다.
Splash는 클라이언트와 서버의 중간에서 양쪽을 중계하며, 페이지 내부의 자바스크립트를 실행해 자바스크립트의 onload 이벤트가 발생한 시점의 DOM 트리를 HTML로 응답한다.
동작 과정
1. 클라이언트 -> Splash : 요청 전송
2. Splash -> 서버: 요청 전송
3. 서버 -> Splash: HTML 응답
4. Splash: 페이지 내부의 자바스크립트 실행
5. Splash -> 클라이언트: 자바스크립트 실행 후의 HTML 응답
설치 방법
$ pip install scrapy-splash
또는
$ docker run -p 8050:8050 scrapinghub/splash
사용 방법
1. splash 서버 실행
2. 프로젝트의 settings.py에 splash 관련 설정 추가
3. 사용
(1) Splash로 요청을 렌더링하는 가장 쉬운 방법은 scrapy_splash.SplashRequest를 사용하는 거다
yield SplashRequest(url, self.parse_result,
args={
# optional; parameters passed to Splash HTTP API
'wait': 0.5,
# 'url' is prefilled from request url
# 'http_method' is set to 'POST' for POST requests
# 'body' is set to request body for POST requests
},
endpoint='render.json', # optional; default is render.html
splash_url='<url>', # optional; overrides SPLASH_URL
slot_policy=scrapy_splash.SlotPolicy.PER_DOMAIN, # optional
)
(2) 또는 일반 scrapy.Request 및 'splash'요청 meta 키를 사용할 수 있다
yield scrapy.Request(url, self.parse_result, meta={
'splash': {
'args': {
# set rendering arguments here
'html': 1,
'png': 1,
# 'url' is prefilled from request url
# 'http_method' is set to 'POST' for POST requests
# 'body' is set to request body for POST requests
},
# optional parameters
'endpoint': 'render.json', # optional; default is render.json
'splash_url': '<url>', # optional; overrides SPLASH_URL
'slot_policy': scrapy_splash.SlotPolicy.PER_DOMAIN,
'splash_headers': {}, # optional; a dict with headers sent to Splash
'dont_process_response': True, # optional, default is False
'dont_send_headers': True, # optional, default is False
'magic_response': False, # optional, default is True
}
})
자세한 내용은 링크에 나와있다.
* Downloader Middleware란?
Downloader Middleware는 인터페이스이며, process_requests(self, request, spider)/process_response(self, request, response, spider)/process_exception(self, request, exception, spider)의 메서드 중 1개 이상을 가진 클래스의 객체를 의미한다.
'Crawling' 카테고리의 다른 글
[크롤링/16]메시지 큐(파이썬 Redis) (0) | 2021.03.26 |
---|---|
[크롤링/15] 크롤러 서버에서 운용하기(Windows/Ubuntu) (0) | 2021.03.26 |
[크롤링/13]Scrapy 오류 처리 설정 (0) | 2021.03.25 |
[크롤링/12]Scrapy HTTP 요청/캐시 설정 (0) | 2021.03.25 |
[크롤링/11]Scrapy 병렬 처리 설정 (2) | 2021.03.25 |