본문 바로가기
개발적인/대외활동

[대외활동] 코뮤니티 파이썬 크롤링 과정

by klm hyeon woo 2021. 9. 17.

썸네일은 감성있게 엣지있게 열정있게!

어느 날이 좋은 날 생각을 했다, 마스크를 벗고 코딩하는 세상이 올까..

 

9월도 역시나, 무료한 삶을 보내지 않기위해 코뮤니티에서 대외활동을 신청했다.

맛있는 파이썬 과정은, 파이썬을 배운지 오랜 시간이 지나서 가물가물 문법에 따라 1일차, 2일차 하루하루 정리를 했는데

크롤링 부분은 웹 관련쪽이기때문에 하루하루 정리하기 보다는 엑기스 위주로 포스팅을 하려고 한다.

아마, 차근차근 정리를 해가면서 이 게시물도 완성이 되지 않을까 싶다.

 

 

 

 

그러면, 시작한다 크롤링의 세계로-!

 

 

 

 

 

먼저, 파이썬 크롤링은 라이브러리를 기본적으로 이용하여 웹 사이트의 부분적인 내용을 가져온다고 생각을 하면 된다.

이 라이브러리는 파이썬 기초문법 초기에, 파이썬을 로컬로 인스톨해주었던 것처럼 라이브러리도 로컬환경으로 설치를 해주면 된다.

여기서, 정적 크롤링과 동적 크롤링이 필요한 라이브러리는 다른 점을 가지고 있는데 먼저 정적과 동적인 부분에 대해서 알아보자.

 

동적 크롤링 :

웹 상에서 페이지 안에 원하는 정보가 숨겨져 끌어오거나, 페이지 이동이 필요한 경우 웹에서

한 눈에 볼 수 있는 정보만을 다룬  정적 크롤링과는 다르게 세부내용까지 볼 수 있다.

 

정적 크롤링 : 

웹 상에서 한 눈에 볼 수 있는 정보만을 끌어다온 형태, 새로고침을 하지 않는 이상 고정되어 변하지 않는 데이터 값을 나타내는 웹이다.

세부내용까지 접할 수 있는 동적 크롤링과는 달리 세부 내용으로는 들어가지 못하는 껍데기 정보 느낌

 

여기서 동적 크롤링과 정적 크롤링을 비교해보았을 때 동적 크롤링은 쉽게 말해, 정적 크롤링의 상위호환 느낌이라고 생각을 하면 조금 이해가 쉽다.

(그렇지만, 동적 크롤링은 수집속도에서 받아오는 정보가 많이 때문에 동적 크롤링에 비해 수집속도가 현저히 늦다)

 

 

정적 크롤링과 동적 크롤링은 다음과 같은 라이브러리를 요구한다.

 

정적 크롤링 

- requests

- BeautifulSoup

동적 크롤링

- Selenium

- Chromedriver.exe (크롬에서 제공해주는 파일)

 

 

라이브러리를 가지고 동적 크롤링을 돌리기 위해서는 먼저 정적 크롤링부터 기초적으로 살펴보아야한다.

import requests

lotto_url = 'https://dhlottery.co.kr/gameResult.do?method=byWin'
raw = requests.get(lotto_url) // 설정해준 url의 html을 내부적으로 불러오는 역할을 한다.
print(raw.text) // url의 html 파일을 text 형태로 변환해준다.

다음은 크롤링에서 제일 많이 볼 수 있는 로또번호를 뽑아오는 크롤링 예시이다.

import문을 통해 라이브러리를 불러왔고, 위의 코드를 통해 성공적으로 로또번호가 담긴 전체적인 html 파일을 불러올 수 있다.

하지만, 위는 겉모습만 담긴 html 파일을 불러온 것이고 진짜 데이터 값이 담긴 html 데이터를 불러와야한다.

이와 같은 겉모습만 텍스트인 html 파일을 해석하기 위해 존재하는 라이브러리가 BeautifulSoup 라이브러리이다.

from bs4 import BeautifulSoup

#코드 해석
bs4 라이브러리에서 BeautifulSoup 메소드만 가져와서 사용한다.

#기본 코드
from 라이브러리 import 메소드 : 해당 라이브러리에 특정 메소드를 가져온다.

BeautifulSoup 라이브러리의 선언은 다음과 같이 할 수 있다. 필자는 현재 BeautifulSoup4버젼을 사용하고 있기 때문에 bs4라는 코드를 입력해주었다.

BeautifulSoup(문자열, 'html.parser')

그리고 밑에 다음과 같은 코드를 입력해준다, 위의 코드에서 의미하는 문자열에서는 문자화된 html 코드를 의미한다.

이 코드는 텍스트화된 html을 해석해서, 데이터화된 html로 변경을 해주겠다라는 의미를 가지고 있다.

 

이제, 텍스트된 html 문제를 코드화 시켜주었다면 코드화된 html 파일에서 자신이 필요한 부분을 꺼내와야한다.

필요한 부분은 태그의 한 부분을 가져올 수 있는 find 함수와 필요한 태그의 모든 부분을 가져올 수 있는 find_all 함수가 있다.

원하는 부분의 태그 1개: <div id="example1">

// 원하는 부분이 1개일 때

사용법 1. 태그 이름 사용 
(실제 HTML 코드).find_all('div')

사용법 2. 선택자 정보 사용 
(실제 HTML 코드).find_all(id = 'example1')

원하는 부분의 태그 2개: <div id="example1">, <span class="example2">

// 원하는 부분이 2개일 때

사용법 1. 태그 이름 사용 
(실제 HTML 코드).find_all(['div', 'span'])

사용법 2. 선택자 정보 사용
(실제 HTML 코드).find_all(attrs = {'id':'example1','class':'example2'})

위의 예시 코드는, 필요한 태그의 모든 부분들을 가져올 수 있는 find_all 함수의 예시이다.

위처럼, 태그 이름을 사용할 수 있고, 선택자의 이름을 사용할 수 있다.

원하는 부분의 태그: <div id="example1">

사용법 1. 태그 이름 사용 
(실제 HTML 코드).find('div')

사용법 2. 선택자 정보 사용 
(실제 HTML 코드).find(id = 'example1')
(실제 HTML 코드).find(attrs = {'id':'example1'})

사용법 3. 태그 이름과 선택자 정보 모두 사용
(실제 HTML 코드).find('div', {'id' : 'example1'})

위의 코드는 find 함수이다, 기본적으로 이 함수를 먼저 사용하여 필요한 부분을 간추린다음 find_all 함수를 통해 필요한 태그들을 여럿 추출해온다.

from bs4 import BeautifulSoup
import requests

lotto_url = 'https://dhlottery.co.kr/gameResult.do?method=byWin'
raw = requests.get(lotto_url)

soup = BeautifulSoup(raw.text, 'html.parser')

box = soup.find('div', {'class' : 'nums'})
numbers = box.find_all('span')

for number in numbers:
    print(number.text)

위는 예시 크롤링 코드이다, 처음에 올렸던 로또 예시코드와는 확실히 변화된 모습을 확인할 수 있다.

box 라는 변수에 div 클래스가 nums 지정된 부분을 box에 넣어주면서 추출해올 부분을 간략화시켰고, numbers를 통해 그 안에 로또번호가 저장되어있는 span태그를 모두 불러올 수 있게 하였다. (ㅅ,, 신기하다,, 엄청 접근성 쉬운 파이썬 크롤링 짱짱맨,,)

 

마지막으로 내가 파이썬 for문에 대해 잘못알고 있었는데.. 아니, 까먹은 사실이라고 해야할까?

range는 파이썬 i(임의로 정한 변수)를 (x,y) x부터 y까지 범위를 정해주는 함수이고, for number in numbers는 numbers를 number에 대입하여 처음 차순부터 끝차순까지 한번정도 반복을 해주는 것이었다, C언어를 계속 복습하고 복습하다보니까 생기는 오차.. 그래서 부랴부랴 이렇게 정리를 시작했다,

지금에서라도 이렇게 깨닫고 정리를 해서 너무너무 다행이다.. ٩( ᐛ )و 

 

아, 그리고 추가로 내가 개인적으로 패션에 관심이 많아서 무신사 홈페이지를 크롤링해보려고 했는데

response = requests.get(문자열, headers={"User-Agent": "Mozilla/5.0"})

해당 웹페이지에서 사용자들 봇으로 착각하고 차단을 해버리는 경우가 있다고 한다,

이럴때는 위와 같은 헤더 속성을 부여해주면서, 크롤링을 시도하면 된다.

from bs4 import BeautifulSoup
import requests



Ex01_url = 'https://search.musinsa.com/ranking/keyword'
response = requests.get(Ex01_url, headers={"User-Agent": "Mozilla/5.0"})


soup = BeautifulSoup(response.text,'html.parser')

box = soup.find('div', {'class' :'search_inner'})
rank = box.find_all('p', {'class' : 'p_srank'})

print("무신사 실시간 랭킹")
for i in rank:
    print(i.text)

바로 실습을 통해, 크롤링에 익숙해지고자 노력했다-!

 

요로콤 무신사 랭킹도 크롤링 성공-!

ㅇ,, 일단 정적 크롤링의 일부분은 어느정도 잘 따라왔다.

부분부분 세세하게 볼 수도 있는 동적 크롤링도 이렇게 신기하겠지?

크롤링 너무 신기하다 ᕕ( ᐛ )ᕗ 

댓글