여자친구가 Umano로 공부를 하고 있는데, Umano 개발팀이 드랍박스로 합류하게 되어 Umano 서비스가 종료되는 바람에 Umano MP3를 다운로드하고, Umano 포스트의 원문 기사의 내용을 텍스트로 추출하는 작업을 진행했다.
mp3 파일로부터 음성인식을 통해 텍스트를 추출하려고 조사를 하다보니 100% 정확하게 음성을 인식할 수도 없고, 라이브러리 차원에서 해결하기도 어려운 문제인지라 원문 기사 링크에서 기사 본문을 추출하는 방향으로 진행하기로 했다. 또한 음성인식을 통해 텍스트를 추출한다면 처리량이 쓸데 없이 많아지기도 했다.
HTML로부터 추출한 기사에는 본문 내용만이 포함되어야 하고(웹 페이지를 구성하는 기타 내용을 제외한) 텍스트로 출력될 수 있어야 했다. 즉 에버노트 크롬 확장인 Clearly와 같은 기능을 원했다.
extract contents from web page를 키워드로 찾아보니 딱 원하는 기능을 제공하는 Boilerpipe라는 자바로 작성된 라이브러리를 찾을 수 있었다.
| 기사 추출
먼저 Boilerpipe의 다운로드 페이지에서 라이브러리 파일을 받은 후 클래스패스에 추가한다. 아쉽게도 메이븐 중앙 저장소에는 없다. 2011년 7월을 끝으로 더 개발이 진행되진 않는 것 같지만 쓰고자 하는 기능상으로는 문제가 없는 듯하다.
사용 방법은 간단하다. 아래와 같이 사용한다.
| User-Agent 헤더로 인한 403 응답
Umano는 여러 뉴스 제공사의 기사를 라디오 뉴스처럼 제공하기 때문에 일부 뉴스에서는 요청 파라미터나 헤더 없이도 기사 내용을 잘 가져오지만, 일부는 403이나 OK이 외의 다른 응답과 함께 페이지 내용을 받을 수 없다.
Bolierpipe에서 HTTP 요청에 대한 커스터마이징을 제공하지 않기 때문에 OkHTTP 라이브러리를 통해 먼저 HTML 페이지의 내용을 문자열로 받은 후 ArticleExtractor의 getText(String) 메서드를 호출하여 다시 본문 내용을 추출하는 쪽으로 했다.
User-Agent는 구글 크롬에서 요청 시 사용하는 User-Agent 값을 그냥 복사하여 넣어주었다.
또한 SSL 인증서를 검증하는 과정에서 유효기간이 지난 SSL 인증서를 사용하거나 Self-signed 인증서 역시 예외를 발생시키므로 이 과정을 무시하도록 하기 위해 OkHttpClient에 SSL Context 설정한다.
※ 참고 자료
https://code.google.com/p/boilerpipe/wiki/JavaDoc
http://stackoverflow.com/questions/2529682/setting-user-agent-of-a-java-urlconnection
http://stackoverflow.com/questions/25509296/trusting-all-certificates-with-okhttp
http://www.snip2code.com/Snippet/25364/Get-OkHttpClient-which-ignores-all-SSL-e
'밤을 지새다 > 배운 것을 기록하라' 카테고리의 다른 글
콘솔 출력을 JSON 포맷의 Pretty Print 적용하기 (0) | 2014.09.23 |
---|---|
Spring @MVC 이미지 업로드 (4) | 2013.12.01 |
RSA 비대칭키 암호화 알고리즘 (0) | 2013.10.09 |