이번 포스팅도 간단한 내용이다.

 

BeautifulSoup4 모듈을 다운로드 받아서 간단한 웹스크래이핑을 해본다.

 

설치는 명령 프롬프트에서 pip install bs4를 입력한다.

 

인스톨 되었다면 위와 같은 내용이 출력된다.

 

이번 예제에서 사용하는 requests 와 pyperclip 도 pip 명령어로 설치가능하다.

 

import bs4,pyperclip,requests

search = pyperclip.paste()
google = "https://www.google.com"

print("구글 검색 개시...")
res = requests.get(google + '/search?q=' + search)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,"html.parser")
elem1 = soup.find_all(['h3'])

for i in range(len(elem1)):
    print(i , " : " , elem1[i].getText())

클립보드에 복사한 문자열로 구글에 검색을 하는 코드이다.

 

우선 pyperclip.paste()로 클립보드에 복사한다. 예를 들어 손흥민이란 키워드를 복사한다. Ctrl+C

 

이 상태에서 코드를 실행시키면 클립보드의 내용을 search 변수에 가져온다.

 

구글 서버에 request를 보내서 검색 한 후 결과를 res 변수에 가져온다. 가져온 res 객체를 html 파서로 soup 객체로 만든다. 이제 soup 객체로 가져온 웹페이지의 요소들을 분해할 수 있다.

 

원리는 간단하다. 계속 가져오는 연속이다.

 

html 파서는 크롬같은 웹브라우저에 달려있는 기능이다. html 파일을 자체적으로 해석해서 브라우저에 보여줄 수 있다.

 

당연히 웹브라우저 처럼 보여주지 않는다. find 메서드를 이용해 조건을 주고 찾아야 한다.

 

위의 코드에서는 h3 를 가져와서 출력한다. 출력결과는...

 

구글 검색 첫페이지의 제목을 내용을 가져온다.

 

구글 검색엔진은 get 방식이기 때문에 웹페이지 요청시 검색어를 같이 보냈기 때문에 받을 수 있었다. 또 다른 키워드를 사용해보자. 이번엔 두 단어를 사용한다.

 

카카오 티스토리 검색결과 1페이지의 제목들을 가져왔다.

 

find 메서드로 태그를 검색하거나  select 선택자 메서드로 CSS 처럼 선택하는 것이 가능하다. 이 부분은 BS4 웹문서를 활용할 수 있다. 한국어 번역도 있다.

 

 

Beautiful Soup Documentation — Beautiful Soup 4.9.0 documentation

Non-pretty printing If you just want a string, with no fancy formatting, you can call str() on a BeautifulSoup object (unicode() in Python 2), or on a Tag within it: str(soup) # ' I linked to example.com ' str(soup.a) # ' I linked to example.com ' The str(

www.crummy.com

자신이 원하는 내용만 추출해 내는 것은 시간이 걸릴 것이다. 원하는 웹페이지에 들어가서 마우스 우클릭 -> 검사를 클릭하면 페이지의 소스가 나온다. 매우 복잡한 웹파일의 구조가 보일 것이다. 여기서 패턴과 태그를 찾아야 한다. 웹페이지를 만든 사람마다 다 다를 것이다. 패턴을 찾는 것은 약간의 노가다가 필요하다.

 

그러나 웹크롤링 프로그램의 기초는 간단하다. 첫째 웹페이지에 접속해서 다운로드 한다. html 파일을 파서로 분석하여 하이퍼링크를 추출하고 그 하이퍼 링크에 다시 접속한다. 이 과정이 사람이 하는 것이 아니라 컴퓨터가 하는 것이다. 잘 만들어진 스크레이퍼는 순식간에 수십, 수백개의 웹페이지에 접속해서 파일을 다운로드 받을 수 있다. 시작은 위의 코드에서 한다. 로직을 어떻게 그려넣는가가 중요하다.

 

이 포스팅에서 모든 내용을 다루지는 않겠다. BeautifulSoup '비우리풀 스프' 정도로 읽는다. 가 무엇인지 앞으로 헷갈릴 필요는 없을 것이다. BeautifulSoup 는 웹페이지를 분석하기 위한 파서이다. 예를 들어 페이지 안의 모든 하이퍼링크 a태그에서 주소만 추출하기 위해서는 아래와 같이 사용한다.

for aTag in soup.find_all('a'):
    print(google,aTag.get('href'),sep='')

구글 검색결과에서 href (즉 주소) 부분만 뽑아낸다. 이 주소를 사용하여 자동으로 웹페이지에 접속하게 만들 수도 있다. 이런 식으로 꼬리에 꼬리를 물고 들어가다 보면 무한 반복할 수도 있다. 크롤링은 생각보다 무서운 기술이다. 끓임없이 접속하여 트래픽을 유발하는 것은 해킹이나 공격으로 오해받을 수 있으므로 항상 크롤링을 사용할 때는 주의해야 한다.

 

일반적으로 학습용 자료를 추출하기 위한 정도로는 괜찮은 것 같다. 인터넷의 데이터를 끌어모아서 상업용 소프트웨어를 만들시에는 관련 라이센스와 허가사항을 제대로 알고 있어야 한다.

 

구글의 검색페이지는 복잡한 구조로 되어있다. id나 class를 보면 특수한 암호처럼 보인다. 하위 태그의 추출이 생각보다 쉽지 않을 것이다. 구글이 아무나 마음대로 스크레이필 할 정도로 허술하지는 않지만 공부를 한다면 많은 도움이 될 것이다. 

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band