SOOJLE
수즐 커뮤니티
수즐 커뮤니티
  • SOOJLE Document
  • 프로젝트 요약
  • Untitled
  • 프로젝트 개요
    • 프로젝트 소개
    • 추진 배경 및 필요성
    • 프로젝트 내용
      • 기능적 요구사항
      • 비기능적 요구사항
    • 개발환경 및 팀 구성
    • 워크플로우
      • 계획 수립 & 설계
      • 데이터 수집 및 정규화
      • 인공지능 개발
      • 서비스 모듈 개발
      • 성능 평가 및 보고
    • 프로젝트 예산 내역
  • 사전조사 & 의사결정
    • 사전조사
      • 재학생 대상 사전조사
      • 수집 URL 대상 목록
        • 세종대학교 직할
        • 세종대학교 학과
        • 공식 공지사항
        • 세종대 평생교육원
        • 외부 웹사이트
      • 학습 모델 사전조사
        • LSA - 잠재 의미 분석
        • LDA - 잠재 디리클레 할당
        • Word2Vec - 워드투벡터
        • FastText - 패스트텍스트
    • 의사결정
      • 사용자 인증 방식 의사결정
      • 데이터베이스 의사결정
        • MySQL vs MongoDB 성능 분석
      • 토픽별 의사결정
      • 부가 기능 의사 결정
  • 프로젝트 설계
    • 시스템 구조 설계
    • 핵심 기능 설계
      • 데이터 크롤러 설계
      • 게시물 토픽 정의 및 분류
      • 사용자 관심분야 측정
      • 뉴스피드 설계
        • 사용자-문서 유사도(Recommendation Score)
        • FaS (관심 분야 및 유사도 측정 - 추가)
        • 토픽 뉴스피드 목록
      • 검색 알고리즘 설계
        • 검색 알고리즘 1차 설계
        • 검색 알고리즘 1차 개선안
        • 검색 알고리즘 2차 설계
    • 요구사항 목록
      • DB 요구사항
      • 기능 요구사항
      • 품질 요구사항
      • 관리 요구사항
  • DB
    • 구조 설계
    • 테이블 명세
  • 데이터 크롤러
    • 데이터 크롤러 개요
    • 크롤링 URL 선정
    • 크롤러 구현을 위한 사전조사
    • 크롤러 개발 과정
      • 크롤러 프로그램 설계
      • 크롤러 규격화
      • 크롤러 정규화
      • 데이터 정제 과정
      • 에러 핸들러 구현
      • 배포 환경 이식을 위한 Porting
    • Issue & Exception
    • 결과 보고
  • 인공지능 개발
    • 인공지능 개발 개요
    • NLP 스터디
      • Bag of Words(BoW)
      • Document Term Matrix(DTM)
      • TF-IDF(Term Frequency-Inverse Document Frequency)
      • 문서 유사도(Document Similarity)
    • 데이터 전처리 과정
    • 개발 과정
      • 토크나이저 구현
      • LDA 모델 학습 및 구현
    • LDA 학습 모델링
      • 1차 파라미터 튜닝 결과 (NUM_TOPICS)
      • 2차 파라미터 튜닝 결과 (NUM_TOPICS)
      • 3차 파라미터 튜닝 결과 (NUM_TOPICS)
      • NUM_TOPICS 파라미터 의사결정
      • 4차 파라미터 튜닝 결과 (PASESS, ITERATION)
      • 최종 학습 모델 명세
    • Word2Vec(FastText) 학습 모델링
    • Issue & Exception
    • 성능 분석 결과
  • BackEnd
    • 서버 구축 및 배포
      • SOOJLE 서버 구조
      • 상용 서버 (UWSGI + NGINX) 구축
      • HTTPS 서버 구현
    • API 문서 개요
    • API 목록
      • Analysis
      • Auth API
      • Newsfeed API
      • Post API
      • Search API
      • Admin API
    • 세종 Auth API
    • 통계 기능 설계
    • Issue & Exception
    • 성능 분석 결과
  • FRONTEND
    • 프론트엔드 설계 개요
    • 디자인 설계 의사결정
      • 디자인 컨셉 및 기능 정의
      • 컴포넌트 디자인
      • Logo Variation
    • 화면 흐름도
    • 페이지 UI 명세
      • Main Page
      • Header
      • Footer
      • Mobile Control Bar
      • Login Page
      • Timeline Page
      • Menu Page
      • Hyperlink Icons Page
      • Search Component & Mobile Search Modal
      • Search Page
      • Post Block
      • Snackbar
  • 프로그램 배포
    • 프로그램 개요
    • 시스템 아키텍쳐
    • 주요 기능 및 명세
    • 프로그램 테스트
    • 구현 결과물 배포
  • 마무리
    • References
  • SOOJLE AI
  • SEJONG AUTH
  • IML Tokenizer
  • SOOJLE Crawler
  • SOOJLE Frontend
  • SOOJLE Backend
Powered by GitBook
On this page
  • Robots.txt 및 서버 부하 방지
  • Request.get 으로 해당 URL을 가져올 때, amp; 접속 불가 문제
  • SSL 사이트 인증 문제
  • HTML 인코딩 및 디코딩 크롤링
  • html.parser VS lxml
  • 명시적 대기 및 암묵적 대기
  • Selenium 네트워크 속도차이 문제

Was this helpful?

  1. 데이터 크롤러

Issue & Exception

Robots.txt 및 서버 부하 방지

대다수의 Web 사이트에서는 Robots.txt 라는 파일을 Web Server에 가지고 있다. 이 Robots.txt 파일에는 해당 웹 사이트에 로봇이 접근하는 것을 방지하기 위한 접근 제한에 대한 설명을 기술하고 있다.

본 프로젝트에서의 크롤링 프로그램에서는 프로젝트를 진행할 때, Robots.txt 파일을 준수하며 크롤링 프로그램으로 인한 요청으로 해당 Web Server에 부하가 가지않도록 하기 위해서, 요청 속도를 고의적으로 낮추었으며, 필요한 정보 수집 이외의 목적으로 정보를 수집하지 않도록 프로그램을 구현하도록 지향한다.

Request.get 으로 해당 URL을 가져올 때, amp; 접속 불가 문제

amp;가 크롤링 URL에 포함될 경우에는 직접 Web에서 접속할 때에는 문제가 발생하지 않지만, Python의 Request를 통해서 접속할 때에는 접속이 되지 않는 문제가 발생하므로 새롭게 파싱 한 URL은 .replace(“amp;”, “”) 구문을 통해서 없애주어서 문제를 해결한다

SSL 사이트 인증 문제

일반 Requests로 HTML 사이트에 접근하기 위해서는 HTTP 통신 규약에 의해 서 접속을 하게 되는데, 대상 사이트에 접근을 하기 위해서는 클라이언트의 정보도 같이 요청이 가게 된다. 이 때, https:// 로 시작하는 URL은 해당 크롤러가 인증이 되지 않았으므로, 접근 오류가 발생하게 된다. 그러므로 URL 파싱을 하 는 부분에 verfiy라는 파라미터를 False를 설정하여, 접근 오류 문제를 해결해준다.

HTML 인코딩 및 디코딩 크롤링

모든 HTML문서는 해당 html 태그 속에 lang 속성을 EUC-KR 또는 UTF-8을 대 표적으로 사용한다. 하지만 몇몇의 사이트에서 이 웹 규약을 지키지않아서 크 롤러로 HTML 문서를 파싱하였을 때, 인코딩이 되지 않은 데이터가 파싱되는 경우가 발생하였다.

이 때, 인코딩이 되지않은 데이터를 파싱하기 위해서 Text 를 추출하기 전에 EUC-KR 또는 UTF-8로 인코딩과정을 거친 후에 text를 추출 해준다.

html.parser VS lxml

Request의 파싱방법에는 대표적으로 두 가지가 존재한다. Html.parser을 사용하 는 방식과 lxml 방식이 있다. 이 두 방식의 차이는 이렇게 정의된다. Html.parser는 적당한 속도에 따로 라이브러리를 설치할 필요가 없다는 점이다.

하지만 lxml은 html.parser과는 다르게 추가 라이브러리를 설치 필요성을 가지 고 있다. 하지만 파싱 하는 속도는 lxml이 매우 빠르다. 하지만 이 외에 다른 차 이점을 가지고 있다. 바로 html.parser로 해당 HTML 문서를 파싱을 할 경우, 그 html 코드를 이전 코드 파일을 그대로 가져온다는 점이다.

그러므로 만약 해 당 사이트의 개발자가 HTML 태그 규약을 지키지 않더라도 HTML 상에서는 자 동적으로 태그를 넣어서 보여주지만, html.parser은 태그 규약이 지켜지지 않은 코드를 파싱 하므로 이 후에 크롤러에서 태그 기반으로 검색을 하였을 때, 문제 가 발생하게 된다. 그러므로 lxml 파싱방법을 사용하여서, 불완전한 태그들을 모두 생성된 HTML 파일을 가져와서 데이터를 파싱한다.

명시적 대기 및 암묵적 대기

Ajax 또는 그 외의 동적으로 페이지를 구성하는 사이트에서 크롤링할 때에는 웹이 동적으로 필요한 데이터를 구성할 때까지 기다릴 필요가 있다. 하지만 time.sleep(5)와 같이 정적으로 기다리기에는 낭비되는 시간이 생성된다. 이 문 제를 해결하기 위해서 Implicitly Wait(암묵적 대기)와 Explicitly Wait(명시적 대 기)라는 개념을 사용해준다.

암묵적 대기는 위 사진과 같이 태그가 나올 때까지 3초를 기다려주겠다는 말 이다. 즉 동적 웹구성이 3초내에 완료되면, 해당 태그는 정상적으로 할당되게 된다.

명시적 대기는 위 사진과 같이 태그를 100초 안에 찾을 때까지 기다린다는 말이다. 만약 그 태그를 발견 시, 그 시점에서 바로 값을 반환하게 된다.

Selenium 네트워크 속도차이 문제

Selenium으로 로그인을 할 때, 위 사진과 같은 방식을 이용한다. Selenium 기 능으로 로그인 버튼을 누르고 그 driver을 반환하는 함수에서 해당 driver이 로 그인한 페이지의 driver을 반환해주어야 하는데, 클라이언트와 서버간의 로그인 통신 작업 끝나지 않은 상태로 driver이 반환되어 버린다.

Selenium 안에서 implicitlywait 또는 WebdriverWait과 같은 암묵적, 명시적 기다림은 기 다리는 대상이 명확하지 않기 때문에, 정적으로 time.sleep(3)과 같이 기다려주 어 문제를 해결한다.

Previous배포 환경 이식을 위한 PortingNext결과 보고

Last updated 5 years ago

Was this helpful?