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)과 같이 기다려주 어 문제를 해결한다.
Last updated