crawling-hotels / api-server

0 stars 0 forks source link

search domain 크롤링 성능 개선 #23

Open bakseoyong opened 1 year ago

bakseoyong commented 1 year ago

[selenium headless 설정 시도] : headless로 요청날리면 스크립트 요청인걸 확인한 사이트에서 응답데이터를 제공하지 않습니다.

bakseoyong commented 1 year ago

[selenium headless user-agent 설정 시도] : 제대로 동작하나 속도가 더 느려졌습니다. 구글 바드 : Selenium headless를 활성화하면 속도가 느려질 수 있습니다. 이는 headless 모드가 렌더링된 브라우저보다 웹 페이지를 로드하고 상호 작용하는 데 더 많은 시간이 걸리기 때문입니다. 또한 headless 모드는 웹 페이지의 동적 데이터를 파싱할 수 없기 때문에, 이러한 데이터를 파싱해야 하는 경우 속도가 더욱 느려질 수 있습니다.

headless 옵션은 메모리의 사용량을 크게 줄이는 효과가 있습니다. 따라서 요청하는 스레드를 더 늘리는 방식으로 성능 개선을 할 수 있을것 같습니다.

bakseoyong commented 1 year ago

지금의 응답데이터는 여러 과정을 거쳐 진행되는데 각각의 과정의 시간측정을 하는 코드가 존재하지 않아 명확한 측정을 하지 못하는 상태입니다. 각 단계마다 시간을 측정하는 코드를 우선으로 추가해야 합니다.

bakseoyong commented 1 year ago

시간 측정 결과 드라이버 연결까지 8초, 웹 크롤링 1회에 8초정도 소요되었습니다. 드라이버 연결시간을 줄이기 위한 SeleniumDriverPool 생성을 고려해야 합니다.

[61]요청까지 걸린시간 : 8925 [63]요청까지 걸린시간 : 8925 [61] 크롤링 종료시간 : 16615 [63] 크롤링 종료시간 : 16822

bakseoyong commented 1 year ago

CrawlingQueue + WebDriverPool을 이용해 야놀자, 여기어때 각각에서 다중요청에 대해 대응할 수 있도록 변경하고 이를 병합하는 메서드에서 @Async를 통한 비동기 처리를 진행할 예정입니다.

bakseoyong commented 1 year ago

크롤링 알고리즘 동작 방식을 변경해야 합니다. 기존 방식

  1. 입력받은 날짜를 스레드 개수에 맞게 분리합니다.
  2. 분리하여 일자를 변경하며 요청을 날립니다. 문제점
  3. 2명 이상의 이용자가 동시에 요청을 날리게 되면 IP차단 될 확률이 높습니다.

해결책

  1. 상수 파일 만들어서 상수 정리하기 ( 너무 복잡하다 - 작업 분리 상수, 블로킹 큐 상수, 드라이버 풀 상수)
  2. merge 클래스에서 블로킹 큐에 집어넣기
  3. future 이용해서 비동기로 yanolja, goodchoice의 search메서드 실행시키기