본문 바로가기

Programming/Python Web Crawler for intermediate learners

Web Crawler 004 - Accelerate Crawling by avoiding repetition - 중복을 회피하여 크롤링 속도 개선하기.


이전 시간까지는 기본적으로 어떤 웹 사이트를 크롤링하기 위해서 기초작업을 하였습니다. 프로젝트 생성, 링크를 저장할 파일 만들기, 파일 내용 삭제하기 등등. 이번에는 웹 크롤링을 할 때, 어떤 페이지를 타고 들어간다고 생각해보세요. 거기서 링크를 파일로 저장을 하였는데, 다른 곳에서도 같은 링크를 찾을 경우가 많을 것입니다. 이렇게 서로 중복되는 링크들을 크롤링을 하게 된다면, 시간이 꽤 걸릴 것입니다. 물론 몇 페이지가 안된다면, 체감할 정도는 아닐 것입니다. 그러나 크롤링 할 페이지가 1만 혹은 그 이상이 된다고 한다면, 상당한 시간을 중복된 링크를 크롤링하는데 소요하게 될 것입니다. 그래서 이번에는 이러한 중복 자체를 크롤링 하기 이전에 제거하는 코딩을 해 보려고 합니다.

파이썬에서는 여러개가 중복이 될 때 하나만 받아 처리하는 메소드가 이미 있습니다. set() 이라고 하는 것입니다. 

가령 크롤링 할 URL 을 담은 파일이 있는데, 이곳에 아래와 같이
1. LINK 1
2. LINK 2
3. LINK 3
4. LINK 2
5. LINK 2
6. LINK 1
이런 식의 URL 값이 저장이 되어 있다고 가정을 해 보겠습니다. 그러면 딱 봐도 같은 URL을 크롤링하게 되겠죠? 그래서 이렇게 저장된 파일에서 중복되는 값을 처리하는 함수를 만들어 중복을 먼저 제거하고, 그 이후에 크롤링을 하도록 한다면 훨씬 시간이 단축될 것입니다.

 
아래 코드를 먼저 보겠습니다.

1. 파일에 저장되어 있는 값을 set()을 이용하여 유니크한 값만 남게 하려고 함수를 만들어 주겠습니다.
2. 비어있는 set() 을 만들어 변수 results 에 할당을 하겠습니다.
3. 파일안의 값들을 읽어 한줄씩 처리하도록 하겠습니다.
아래에서 'rt'는 read textfile 의 의미입니다. 그리고 그것을 file이라는 이름으로 명명하였습니다.
4. loop을 돌려서 각각의 라인을 results 라는 set에 각각의 라인을 넣어 주는 것입니다. 여기서 주의할 점은 이전 시간에 human readable 파일로 만들어 주기 위해서 '\n' 인 개행문자를 넣어 주었는데, 이를 '' 으로 대체하여 준다는 것입니다. 컴퓨터는 인간이 보는 것처럼 깔끔하게 보여주지 않아도 일을 잘 하니까요^^.
5. 그리고 그 결과를 리턴하게 합니다.

아래 코드는 set된 링크들을 다시 파일에 넣어주는 함수입니다. 즉, 지저분하게 이것저것 중복되어 있는 URL을 깔끔하게 정리한 이후에 다시 파일에 순서대로 쭈~욱 나열해서 저장을 하게 하는 코드입니다.


1. 함수명을 아래와 같이 정의하고 2개의 파라미터, links , file 을 받습니다. 

2. file 의 내용을 지웁니다.

3. links 를 정렬해서 각각의 라인을 link 이라 하고, 이 link 를 file 에 저장을 하게 합니다.

간략하게 정리를 하자면, 중복되는 URL을 피함으로서 크롤링의 속도를 높여주려고 한다. 

그러자면 중북되는 링크들을 찾아서 set()를 적용시키면, 하나의 link 만 남는다.

이를 다시 파일에 저장을 한다.

나중에는 set() 처리되고 정렬된 URL을 크롤러가 크롤링하게 하면 된다.


이렇게 정리가 되겠네요. 수고하셨습니다.