웹 스크래핑 심화- BeautifulSoup 고급 기능 활용
앞서서 BeautifulSoup을 이용하여 네이버 날씨 정보를 스크래핑하는 기본적인 방법을 사용해 보았다. 이번에는 BeautifulSoup의 고급 기능을 활용하여 보다 복잡한 구조의 웹 페이지에서 원하는 정보를 효율적으로 추출하는 방법을 알아보자.
css 선택자의 활용BeautifulSoup은 CSS 선택자를 활용하여 HTML 요소를 찾는 강력한 기능을 제공한다. select() 메서드를 사용하면 CSS 선택자에 해당하는 모든 요소를 리스트 형태로 가져올 수 있으며, select_one() 메서드를 사용하면 첫 번째 요소만 가져올 수 있다.
예시: 특정 클래스를 가진 모든 링크 가져오기
1soup.select("a.link-class") # class가 link-class인 a 태그
예시: 특정 ID를 가진 테이블의 모든 행 가져오기
1soup.select("#table-id tr");
계층적인 구조 탐색BeautifulSoup는 parent ...
실제 웹 페이지 스크래핑- 영화 리뷰 데이터 수집
앞서 배운 BeautifulSoup을 이용한 텍스트 콘텐츠 추출 및 정제 방법을 바탕으로, 이번에는 실제 웹 페이지에서 데이터를 수집하는 실전을 해볼 것이다. 네이버 날씨에서 오늘의 서울 지역 날씨 정보를 스크래핑하는 실전을 진행할 것이다. 현재 온도, 날씨 상태, 강수 확률 등을 추출하고, 이를 깔끔하게 정리된 형태로 출력하는 과정을 다루고자 한다.
웹 페이지 분석 및 스크래핑 계획 수립네이버 날씨 페이지(https://search.naver.com/search.naver?query=날씨)를 예시로 스크래핑을 어떻게 할지 계획을 세워 보자.
HTML 구조 분석: 크롬 브라우저의 개발자 도구(F12)를 이용하면 날씨 정보가 담긴 영역을 찾을 수 있다.
현재 온도: <div class="temperature_text> 태그 아래 텍스트
날씨 상태: <span class="weather before_slash"> 태그
습도: <dd ...
텍스트 콘텐츠 추출하기- Navigable Strings 활용
앞서 BeautifulSoup를 이용하여 HTML 문서를 파싱하고 원하는 태그를 선택하는 방법을 알아봤다. 지금부터는 찾아낸 태그에서 텍스트를 추출하고 가공하는 방법을 정리해 보자.
NavigableString 객체: 텍스트 데이터 다루기BeautifulSoup은 태그 내부의 텍스트 콘텐츠를 나타내기 위해 NavigableString이라는 특별한 객체를 사용한다. NavigableString 객체는 마치 파이썬의 문자열처럼 다룰 수 있지만, BeautifulSoup의 일부 기능을 활용할 수 있다는 장점을 가지고 있다.
텍스트 콘텐츠 추출: string 속성과 get_text() 메서드string 속성을 사용하면 태그에서 텍스트 콘텐츠를 쉽게 추출할 수 있다. string 속성은 태그 내부의 첫 번째 텍스트 콘텐츠를 NavigableString 객체로 반환한다. 만약 태그 내부에 여러 텍스트 콘텐츠가 존재하거나, 자식 태그가 포함되어 있는 경우에는 get_text() 메서드를 사용하면 ...
BeautifulSoup로 HTML 파싱 하기- 데이터 추출의 마법
BeautifulSoup 라이브러리 소개: HTML/XML 문서 파싱 마법사웹 페이지에서 필요한 데이터를 추출하려면 복잡한 HTML 구조를 분석하고 원하는 정보를 찾아내야 한다. 마치 미로 속에서 보물을 찾는 것 같은 느낌이다. 하지만 BeautifulSoup이 튼튼한 조력자가 되어 줄 것이다.
BeautifulSoup는 HTML/XML 문서를 파싱 하여 파이썬 객체로 변환해 주는 강력한 라이브러리이다. 복잡한 HTML 구조를 사람이 이해하기 쉬운 트리 형태로 변환해 주기 때문에 파이썬 코드로 원하는 정보를 손쉽게 추출할 수 있다.
BeautifulSoup의 장점
사용하기 쉬운 직관적인 인터페이스: 복잡한 설정 없이 몇 줄의 코드만으로 HTML/XML 문서를 파싱하고 데이터를 추출할 수 있다.
다양한 파서 지원: 파이썬 내장 HTML 파서부터 빠르고 강력한 lxml, html5lib 파서까지 지원하여 필요에 따라 선택할 수 있다.
풍부한 기능: 특정 태그 ...
Requests로 웹 페이지 요청하기 - 데이터 수집의 시작
파이썬의 강력한 도구인 Requests 라이브러리를 사용하여 웹 페이지에 요청을 보내고 데이터를 수집하는 방법을 정리해 보자.
Requests 라이브러리는 웹 스크래핑을 위한 필수 도구이다. 간단하고 직관적인 인터페이스를 제공하여 웹 페이지 요청을 보내고, 응답 데이터를 처리하는 작업을 쉽게 수행할 수 있도록 돕는다.
Requests 라이브러리 소개Requests 라이브러리는 파이썬에서 웹 페이지에 요청을 보내고 데이터를 수집하는 데 가장 널리 사용되는 라이브러리이다. Requests 라이브러리는 HTTP 프로토콜을 기반으로 작동하며, GET, POST, PUT, DELETE 등 다양한 HTTP 메서드를 지원한다.
Requests 라이브러리의 장점
간편한 사용: 복잡한 HTTP 프로토콜 설정 없이 간편하게 웹 페이지 요청을 보낼 수 있다.
강력한 기능: GET, POST 요청뿐만 아니라, PUT, DELETE, HEAD, OPTIONS 등 다양한 HTTP 메서드를 지원한다.
데이터 ...
세그먼트 전달과 MIME 타입
오랜만에 다시 글을 쓰게 되었다. 회사 업무가 잘 풀리지 않아 글쓰기의 겨를이 없었다는 핑계는 핑계일 뿐…
클라이언트의 접속 요청이 왔을 때 초기화 프레그먼트를 전달해 주는 작업은 이미 구현을 했다. 이후에는 세그먼트가 생성될 때마다 넘겨주는 작업이 필요하다. index.js를 수정한다.
1234567891011121314151617io.on('connection', socket => { console.log("connection"); function start() { if (mp4frag.initialization) { socket.emit('segment', mp4frag.initialization); mp4frag.on('segment', emitSegment); } else { ...
video 원소와 미디어 소스
이젠 영상을 재생할 수 있는 video 원소를 추가할 때가 되었다. index.html에 id가 stream인 video 원소를 추가한다.
123456...<body> <h1>MSE-remind</h1> <video id="stream" muted></video></body>...
muted를 설정한 이유는 autoplay 정책으로 인해 muted 설정이 되어 있지 않으면 재생이 되지 않는 경우가 있다. 어차피 지금은 비디오만 재생하는 것에 초점을 맞추고 있기 때문에 muted로 기본 설정한다. 정책에 대한 내용은 다음 링크를 참조한다.
https://developer.chrome.com/blog/autoplay?hl=ko
이미지 썸네일 삭제
Chrome의 자동재생 정책 | Blog | Chrome for Developers
Chrome의 새로운 자동재생 정책을 통해 우수한 사용자 경험을 ...
프레그먼트 파싱
fmp4 포맷의 데이터는 프레그먼트 데이터를 도중의 아무 데이터를 보내더라도 그 시점으로부터 재생을 할 수 있다는 특징을 가지고 있다. 그러므로, 언제 요청이 들어오더라도 현재 시점부터 재생을 시작해야 하는 라이브 영상 재생에 적합한 포맷이라고 할 수 있다. 그러나, 재생을 하기 위해서는 데이터 프레그먼트가 들어오기 전에 항상 초기화 프레그먼트라는 것을 먼저 다운로드해서 초기화시켜줘야 한다. 아마도 파일 형식, 해상도, 오디오 코덱 등의 정보가 들어있지 않을까 한다. 이 정보를 통해서 재생하는 쪽에서도 어a떤 코덱을 써야 할지 어떤 방식으로 미디어 데이터를 디먹싱할 수 있는지 등을 결정할 수 있을 것이다.
ffmpeg을 통해서 스트림을 파이프로 수신하게 되면 이 데이터 역시 프레그먼트 단위로 보내긴 할 것이다. 그러나 파이프라인 수신 시에 내부적인 버퍼링 등의 작업을 통해 합쳐질 수도 있는 것이다. 재생을 위해서는 이 프레그먼트 단위로 분리해서 전송하는 기능이 필요하며, 또한 최초에 ...
pipe 출력을 가로채기
앞선 글에서 ffmpeg을 이용해서 fm4 형식의 스트림을 pipe:1을 통해 획득할 수 있게 되었다. 그렇다면 이것을 node.js에서 실제로 스트림으로 가로채려면 어떻게 해야 할까.
node.js에서는 child_process 모듈에서 프로세스를 처리하는 기능들을 제공하고 있으며, 그중에 spawn이라는 함수를 이용하면, 이 작업을 할 수 있다. spawn 함수는 자식 프로세스를 생성하고 실행하는 데 사용된다. 자식 프로세스는 별도의 프로세스로 실행되므로 부모 프로세스와 독립적으로 작동한다. 매개 변수는 주로 3개를 이용하게 되는데, 다음과 같다.
command: 실행할 명령어 또는 스크립트 경로
args (optional): 명령어에 전달할 인수 배열
options (optional): 자식 프로세스 생성 옵션 객체
command와 args는 직관적으로 파악할 수 있고, options는 여러 가지를 설정할 수 있는데, 여기에서 관심 있는 옵션은 stdio라는 옵션이다. 배열 ...
도커 컨테이너에서 도커 호스트의 서버로 접근
도커는 가상 네트워크를 만들어서, 내부에서 동작하는 컨테이너들 간에는 할당된 IP 혹은 컨테이너 이름으로 통신을 할 수 있다. 그런데, 만약에 컨테이너에서 도커 호스트에 있는 서버로 접근해야 할 상황이 있다면 어떻게 해야 할 것인가?
Networking features in Docker Desktop for Windows 문서를 살펴보면 I want to connect from a container to a service on the host 라는 제목의 섹션에서 그 답을 찾을 수 있다. 바로 host.docker.internal 으로 접근을 하면 된다는 결론을 얻을 수 있다. 즉, 컨테이너에서 도커 호스트의 서버로 접근하고자 할 때는 host.docker.internal 으로 접속을 요청하면 된다는 것이다.
도커 호스트에 서버로 서비스를 할 때, 외부에서의 접근을 막고, 도커 컨테이너의 요청에 대해서 처리하고자 한다면 어떤 IP로 바인딩해야 할 것인가. 의외로 쉬운 방법을 찾을 수 ...