DrissionPage를 활용한 Xiaohongshu의 효율적인 데이터 수집
1. 프로젝트 배경 및 목적
현대 디지털 시대에서 여행 정보는 주로 소셜 미디어 플랫폼을 통해 얻어집니다. 그러나 이러한 플랫폼에서 얻은 정보들은 종종 비구조화되어 있어, 이를 이용해 실질적인 여행 계획을 세우는 것은 어려움이 있습니다. 이 문제를 해결하기 위해 "TripGuide: 스마트 여행 일정 도우미"라는 웹 애플리케이션을 개발하였습니다.2. 기술 선택과 도전 과제
2.1 직면한 문제들
Xiaohongshu 웹사이트 분석 시 다음과 같은 기술적 난관이 있었습니다: - SSR(Server-Side Rendering) 사용으로 인한 데이터 추출의 복잡성 - 동적으로 로드되는 댓글 데이터 처리 필요 - 비구조화된 노이즈 데이터(예: 이모티콘, 광고 태그)의 제거 요구2.2 DrissionPage를 통한 해결 방안
Selenium 대신 DrissionPage 프레임워크를 선택하여 페이지 구조 변경에 따른 파싱 실패를 줄이고, 성능을 향상시켰습니다.3. 핵심 코드 구현
3.1 초기화와 데이터 스트림 리스닝
코드 보기
def search_notes(self, keyword, limit):
print(f"키워드 검색: {keyword}")
self.dp.listen.start('search/notes')
self.dp.get(url)
# 스크롤 다운 시뮬레이션 ...
resp = self.dp.listen.wait(timeout=10)
items = resp['response']['body'].get('data', {}).get('items', [])
3.2 SSR 및 동적 로딩 처리
코드 보기
def fill_details(self, note):
html = self.dp.html
content = self._extract_str(html, 'noteContent":"', '","serverInfo"')
self.dp.scroll.bottom()
comments = self.dp.listen.wait(timeout=5)
3.3 AI를 활용한 ETL 프로세스
코드 보기
def ai_summary(self, raw_text, location_name):
prompt = f"""
당신은 여행 데이터 전문가입니다. 다음 관광지 "{location_name}"에 대한 노트에서:
1. 이모티콘 및 광고를 제거하고 150자 요약을 제공하세요.
2. 관광지의 주요 카테고리를 결정하세요 (자연 경관/역사 유적/음식 등).
【내용】: {raw_text[:4000]}
"""
response = dashscope.Generation.call(model='qwen-turbo', prompt=prompt)
return response['output']['text']