-
[Python/Web scraping] 네이버 증권 일별 시세 가져오기, iframe의 requests와 selenium webdriver에서의 처리코딩/Python 2023. 3. 30. 22:48728x90
네이버 증권의 종목별 일별 시세는 requests로는 가져올 수가 없다.
네이버 증권의 일별 또는 시간별 시세는 iframe을 이용해 다른 주소의 정보를 가져오는데, requests로는 일별시세의 iframe src 사이트에 접속하지 못한다.
실제로 개발자모드의 검사로 들어가서 확인한 iframe 사이트 주소와 webdriver를 이용해서 얻은 사이트 주소가 미세하게 달랐다.
개발자모드의 주소와 requests에서 얻은 것은 네이버의 앞 주소가 빠진 '/item/sise.naver?code=005930' 였고, webdriver에서 얻은 것은 'https://finance.naver.com/item/sise.naver?code=005930' 전체 주소였다.
'https://finance.naver.com/'를 붙여 수정한 주소로 request를 이용해 봤지만 역시 접속불가였다.
그래서 할 수 없이 selenium의 webdriver를 이용해 문제를 해결할 수 있었다.주소창에 직접 iframe URL을 입력하면 정상적으로 로드되는 이유는, 이 경우 브라우저가 직접 HTTP 요청을 보내기 때문이다.
브라우저는 HTTP 요청을 보내기 전에 자바스크립트를 실행하여 동적으로 웹 페이지를 로드하고, 그 결과로 iframe의 URL을 가져올 수 있다. 따라서, 주소창에 직접 iframe URL을 입력하면 브라우저가 이 URL을 직접 HTTP 요청으로 처리하며, iframe 내의 테이블 등의 컨텐츠를 정상적으로 가져올 수 있다.
반면에 Python의 requests 라이브러리는 자바스크립트를 실행하지 않기 때문에, HTML 소스 코드만을 가져와서 파싱한다. 따라서, HTTP 요청이 브라우저와 Python에서 다르게 처리될 수 있으며, 이로 인해 iframe의 URL이 올바르게 가져와지지 않을 수 있다.
위 경우의 해결 방법은 여러 가지가 있을 수 있다. 일반적으로는 브라우저와 Python의 HTTP 요청이 다르게 처리되는 문제를 해결하기 위해, Python에서 브라우저의 동작을 모방하는 것이 효과적이다. 이를 위해 다음과 같은 방법을 사용할 수 있다.
Selenium 라이브러리 사용: Selenium은 브라우저 자동화 라이브러리로, Python에서 웹 페이지를 브라우저와 같은 방식으로 제어할 수 있다. 이를 사용하여 브라우저와 동일한 방식으로 웹 페이지를 로드하고, iframe의 URL을 가져와 HTTP 요청을 보낼 수 있다.
브라우저 개발자 도구 사용: 브라우저 개발자 도구를 사용하여 iframe의 URL을 확인하고, Python에서 직접 이 URL을 사용하여 HTTP 요청을 보낼 수 있다.
모바일 브라우저 에뮬레이션: 모바일 브라우저 모드로 설정하여 Python에서 HTTP 요청을 보내면, 브라우저와 비슷한 방식으로 웹 페이지를 처리할 수 있다. 이를 위해서는 requests 라이브러리의 headers 매개변수를 사용하여 User-Agent를 모바일 브라우저의 User-Agent로 설정해야한다.
API 사용: 웹 페이지가 제공하는 API를 사용하여 데이터를 가져올 수 있다. 이 경우에는 iframe 내의 데이터를 직접 가져올 수 있는 API가 제공되어야한다.
728x90'코딩 > Python' 카테고리의 다른 글
[네이버주식] dataframe merge 오류 (0) 2023.04.11 [Python/unicodedata] 맥에서 한글파일이름 깨짐 현상 (0) 2023.03.30 Python/사용자 정의 함수의 툴팁 작성 (0) 2023.03.29 [Python] Tree demo (0) 2022.12.22 [Python/Module] RegEx (1) 2022.12.22