# 파이썬 웹 크롤링


안녕하세요 코드사기꾼입니다.

오늘부터 웹 크롤링을 주제로 글을 작성해보도록 하겠습니다.

그럼 먼저 개념에 대해서 알고 시작해야겠죠? 크롤링이란 무엇일까요?


크롤링(Crawling)은  사전적으로 기어다니는 것을 뜻합니다. IT쪽에서는 웹페이지를 순회하면서 정보를 수집하는 행위를 말합니다. 크롤링은 스크래핑(Scraping) 또는 데이터 긁기등 다양한 단어로 불리우고 있고, 원하시는 용어를 사용하시면 됩니다.


1. BeautifulSoup


BeautifulSoup는 우리의 크롤링을 도와줄 파이썬 오픈소스 라이브러리 입니다. 정규표현식을 사용해서 크롤링한 데이터(html, xml등)내에서 원하는 부분을 추출할 수 있도록 도와줍니다.


공식사이트 링크:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-keyword-arguments



2. BeautifulSoup 설치


이 글은 파이썬 3.x 버전으로 진행하도록 하겠습니다. pip이 설치되어 있다는 가정하에 커맨드라인 프롬프트(cmd)에 아래와 같이 입력합니다.


1
pip install bs4
c
s



3. HTTP Request/Response


먼저 데이터를 크롤링하기 위해서는 웹소켓을 이용하여 원하는 웹사이트에 연결요청을 진행하여야 합니다. 연결요청을 하면 그에 대한 응답으로 웹서버는 Response를 보내는데요 이 데이터는 일반적으로 html이나 json형식을 띄고 있습니다. 이렇게 받아온 html, json데이터를 Beautiful Soup로 파싱 하는것을 크롤링이라고 하는것 입니다.


웹소켓에 대한 대표적인 라이브러리로는 requests, urllib이 있으며 제 블로그에서 일전에 requests에 관한 글을 작성해 놓았던게 있기 때문에 이번에는 urllib으로 진행하도록 하겠습니다.

urllib은 파이썬 기본 라이브러리입니다. 파이썬 2.x버전에서는 urllib, urllib2로 나누어져 있었는데 이것이 3.x버전에 들어서면서 통합되고 코드가 개선되었습니다.


1
2
3
4
5
6
# urllib을 사용한 Request 보내기
import urllib.request
 
url = "http://www.naver.com/"
req = urllib.request.urlopen(url) # url에 대한 연결요청
res = req.read() # 연결요청에 대한 응답
cs







4. 데이터 크롤링


지금 부터 본격적으로 데이터를 크롤링 해보도록 하겠습니다.

아까 설치한 bs4를 코드 최상단에 import하고 response로 받아온 html파일을 태그(tag)기준으로 크롤링 하겠습니다.

네이버 인기검색어를 크롤링 하도록 할텐데 먼저 어떤 태그안에 인기검색어가 저장되어있는지, 또 그 태그는 어떤 클래스로 정의되어 있는지를 파악해야 합니다. 그러기 위하여 크롬(Chrome)브라우저의 개발자도구를 이용하도록 하겠습니다.(f12를 누르면 개발자도구에 진입합니다.)




인기급상승 검색어는 sapn태그에 ah_k클래스를 사용하고 있다는 것을 확인하였습니다. 그러면 본격적으로 소스코드를 작성해 보겠습니다.(2번째 사진에서 빨간색 박스부분을 클릭한 후 원하는 곳을 클릭하면 해당 태그를 찾아줍니다. )


1
2
3
4
5
6
7
8
9
10
import urllib.request
from bs4 import BeautifulSoup
 
url = "https://www.naver.com/"
req = urllib.request.urlopen(url)
res = req.read()
 
soup = BeautifulSoup(res,'html.parser'# BeautifulSoup 객체생성
keywords = soup.find_all('span',class_='ah_k'# 데이터에서 태그와 클래스를 찾는 함수
print(keywords)
cs




크롤링해온 데이터는 html 태그에 쌓여진 리스트 형태로 리턴된다는 것을 알았습니다. 이번에는 코드에 함수하나를 추가해서 각 태그의 텍스트만 뽑아오도록 변경해 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import urllib.request
from bs4 import BeautifulSoup
 
#여기에 함수를 구현해봅시다.
url = "https://www.naver.com/"
req = urllib.request.urlopen(url)
res = req.read()
 
soup = BeautifulSoup(res,'html.parser')
keywords = soup.find_all('span',class_='ah_k')
#get_text() == 데이터에서 문자열만 추출
#strip() == 데이터의 양옆 공백제거
#[:20]의 이유? 인기검색어의 중복을 막고 20위까지만 출력하기 위함
keywords = [each_line.get_text().strip() for each_line in keywords[:20]]
print(keywords)
cs



결과를 보시면 깔끔하게 검색어가 뽑혀있는것을 확인할 수 있습니다.

+ Recent posts