# 파이썬 웹 크롤링


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

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

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


크롤링(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



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

# 파이썬 제어문



1. for문의 기본적인 사용법


for문은 while문과 같이 특정작업을 반복해야 할 때 사용합니다. while문과의 차이점이라면 특정 조건식이 참인 동안 동작하는 것이 아니라 in 키워드 뒤에오는 자료 구조에 대하여 원소단위로 순환하며 순환이 끝날때 까지 반복합니다.

즉 in 뒤에 오는 객체는 반드시 iterable 해야 합니다. 


1
2
for each in 시퀀스자료형 or iterable한 객체:
    print(each)
cs


for 키워드 다음에 오는 each는 for문이 iterable 객체에 접근하여 원소를 하나씩 순환하는 동안에 원소 하나하나가 저장되기 위한 변수입니다. 이름은 아무렇게나 정하셔도 무방합니다. 아래 그림을 보고 다시한번 이해해 보도록 하겠습니다.


for문이 자료구조의 요소 각각에 접근하면서 그 요소들은 임시적으로 each에 저장되고 다음 스텝에서 다른 값으로 대체 됩니다. 


요약하자면 for문은 이터러블 객체를 인자로 사용하는 것이 가능하고 해당 객체의 요소 각각에 접근하는 방식으로 동작합니다. 

그러면 간단하게 숫자를 하나씩 늘려가면서 반복할 수 있는 fot문은 없을까요? 답은 간단합니다. 숫자요소로 이루어진 iterable 객체를 만들어서 인자로 사용하면됩니다. 게다가 파이썬에서는 이 방식을 지원하고 있습니다.

range라는 내장함수는 숫자로 이루어진 이터러블 객체를 만들어냅니다. 


1
2
3
range(10# [0,1,2,3,4,5,6,7,8,9]
range(1,10# [1,2,3,4,5,6,7,8,9]
range(0,10,2# [0,2,4,6,8]
cs


range는 3개의 int형 데이터를 인자로 받습니다. 첫 번째 인자는 시작점인데 ~이상 으로 해석할 수 있고 두 번째는 종료점입니다. ~미만 으로 해석 가능합니다. 마지막 인자는 step으로 작동합니다. 만약 첫번째 인자가 빈칸이라면 인터프리터는 이를 0부터라고 해석합니다.


이를 for 문에 적용하면 아래와 같이 사용할 수 있습니다.


1
2
for i in range(10):
    print(i)
cs


# 파이썬 제어문



!!시퀀스 자료형은 추후에 배울 이터레이터, 제너레이터등을 위하여 필수적으로 알아야 하는 지식입니다!!


1. 시퀀스 자료형


시퀀스 자료형은 원소들을 가지고 있는 데이터 구조이며 멤버쉽 테스트를 지원하는 자료형입니다. 이는 메모리에 상주하는 데이터 구조로써, 보통 모든 원소 값을 메모리에 저장합니다. 파이썬에서 지원하는 시퀀스 자료형은 아래와 같습니다.


- list

- dictionary

- set

- tuple

- string


특정한 자료구조가 원소를 포함하고 있는지 판단 가능하면 시퀀스자료형이라고 생각하시면 됩니다. set, list, dictionary, tuple 등은 간단히 생각해도 원소를 담고 있는데 string은 이해가 쉽지 않죠?

C언어에서 string을 생각해보면 간단합니다. C 언어에서는 char* string = "my name is Rekt77"과 같은 형태로 문자열을 선언하고 각각 문자에대해 인덱스로 접근하는것이 가능합니다.

파이썬에서도 마찬가지 입니다. string은 연속적인 문자의 집합입니다. 고로 인덱스로 접근하는 것이 가능하고 각각의 문자로 분리가능하기 때문에 한 자료구조안에 원소를 담고 있다고 볼 수 있습니다.


1
2
3
4
5
assert 1 in [1,2,3# list
assert 1 in (1,2,3# tuple
assert 1 in {1,2,3# set
assert 1 in {1:"a",2:"b",3:"c"#dictionary
assert "1" in "123" # string
cs


위의 코드는 시퀀스 자료형의 멤버쉽 테스트입니다. assert 문은 시퀀스 자료형의 멤버쉽 테스트를 위해 쓰이는 명령어입니다. 조건이 맞지 않을 경우에는 Assertion Error를 출력하여 자료구조 테스트로 자주 사용됩니다.



2. 이터러블(iterable)


이터러블하다의 의미는 사전적 정의로 '개별 원소를 반복적으로 셀 수 있는' 이라는 뜻을 가지고 있습니다. 이는 파이썬에서 상당히 중요한 의미를 지니는데, 반복문의 사용시 자료구조 내에 포함되어 있는 원소 하나하나에 접근할 수 있는 객체를 뜻합니다. 앞서 말씀드린 시퀀스 자료형들은 전부 이터러블한 객체입니다. 즉 인덱스나 키를 이용하여 접근할 수 있습니다. 

앞으로 for문 같은 반복문에서 자주 보게될 형태이므로 반드시 기억해 놓으셔야 합니다.


+ Recent posts