나의 공부 일기

프로젝트) 크롤링/스크랩핑 프로젝트 1일차 본문

프로젝트

프로젝트) 크롤링/스크랩핑 프로젝트 1일차

곽병권 2023. 12. 4. 11:16
728x90

같이 프로젝트를 진행한 팀원: https://jihoon44-it.tistory.com/

 

 

 

 

저는 지금 파이썬 개발자와 데이터분석에 관한 국비지원을 받고 있습니다.
2주간 글을 작성하지 안했던것은 이 국비지원을 하며 진행하는 프로젝트에 더 집중하기 위해서였습니다. 

 

 

먼저 크롤링이란 프로그램이 웹 사이트를 정기적으로 돌며 정보를 추출하는 기술을 말합니다.

이런 프로그램은 우리는 크롤러(Crawler) 또는 스파이터(Spider)라고 불립니다.

 

크롤러의 예로는 우리가 자주 사용하는 네이버의 검색엔진이 해당합니다.

웹 사이트의 링크를 타고 다니면서 웹 사이트들의 데이터를 긁어와 데이터베이스에 저장하며 정기적으로 동작하여 최선정보를 유지하는것이지요.

 

저희는 3개월정도 공부를하였기에 네이버처럼 완벽하지는 않지만 할 수 있는 선에서는 최선을 다해보았습니다.

먼저 크롤링은 아직 3개월밖에 배우지않은 초보자들이 능수능란하게 하기에는 어려운 부분이 있어 스크래핑하는 방식을 주로 이용하였습니다.

 

 

지금부터 어떤 프로젝트였고 진행과정은 어땠는지 천천히 정리해보도록 하겠습니다.


이 프로젝트는 데이터 수집 프로젝트이며
시작하기전에 데이터를 분석하려는 목적을 설정하고, 목적에 부합하는 데이터를 제공하는 사이트를 조사를하고

이거에 적합한 사이트를 정하고 주제를 선정하였습니다.

 

이 프로젝트는 Selenium이라는 웹 애플리케이션 UI테스트 프레임워크를 사용하였습니다.

 

 

저희는 서울시에 각 자치구별 카페들을 수집하는것을 주제로 선정하였고, 사이트는 네이버 플레이스를 이용하였습니다.

추가로 데이터 수집을 위한 설계로 

카페데이터에서 카페이름, 주소, 리뷰개수, 리뷰중에 어떤게 가장 많았는지, 메뉴 4개정도 를  수집할 데이터로 정했습니다.

 

이를 csv파일로 저장하기위해 Pandas를 사용하였습니다.

 

이렇게 대략적으로 잡아놓고 프로젝트를 시작했으나, 너무 막막해서 일단 구를 하나 지정해서 테스트를 실시하였습니다.

 

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from urllib.parse import quote
 
# iframe 이란것때문에 스위치를 바꿔줍니다.
def switch_frame(frame):
    browser.switch_to.default_content()  # frame 초기화
    browser.switch_to.frame(frame)  # frame 변경
 
# 브라우저 열기
keyword = quote('송파구 카페')
browser = webdriver.Chrome()
browser.get(url)
time.sleep(2)

# 스위치 변경
switch_frame("searchIframe")
time.sleep(2)

#body부분을 잡기 위해 쓸데없는 곳을 클릭해줌
browser.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]').click()

#검색결과가 모두 보이지 않기 때문에 page down을 눌러 끝까지 펼쳐준다.
for scroll in range(0,30):
    browser.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(0.2)

resp = browser.page_source
soup = BeautifulSoup(resp, 'html.parser')
cafe_name_list = []

length = len(soup.select('#_pcmap_list_scroll_container > ul > li'))

for i in range(1, length):
    cafe_name_list.append(soup.select(f'#_pcmap_list_scroll_container > ul > li:nth-child({i}) > div.CHC5F > a.tzwk0 > div > div > span.TYaxT')[0].text)

time.sleep(1)

print(cafe_name_list)

이게 제가 처음 작성해본 코드입니다.

 

webdriver.Chrome()으로 내가 브라우저를 열 때 크롬으로 열겠다 라는 설정을 해준뒤,

quote를하여 한글로 되어있는 문자를 컴퓨터가 읽기 쉬운 용어로 바꿔주었으며,

그 브라우저를 열때 url을 내가 찾고자하는 url을 열도록 설정해주었습니다.

 

 

이 코드를 작성할때 정말 어려웠습니다.

코드를 작성할때 iframe이 무엇인지 모르고 시도하였기 때문에,

코드는 맞는데 자꾸 클릭을 안하고 오류가 나길래

 

우리 모두의 선생님인 챗gpt에게도 물어보고 열심히 구글링을하여 알아본 결과
이 iframe을 바꿔줘야 그 iframe에 해당하는 html코드들을 컴퓨터가 알 수 있다고 하더군요.

 

 

그래서 저희는 이 ifrmae코드를 바꿔주는 함수를 생성하였고,

필요할때마다 iframe을 바꿔주며 원하는 데이터들을 성공적으로 수집할 수 있었습니다.

 

 

find_element는 element를 찾아주는 역할을 해줍니다.

element는 여기서 html의 각 요소들을 말합니다.

저는 XPATH를 찾는것을 사용했고,

 

XPATH란 요소의 경로를 찾기 위한 방식이며,

W3C의 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하는 방법을 기술하는 언어입니다.

 

또한

우리가 흔히 알고있는 XML표현보다 더 쉽고 약어로 되어 있으며, XSL변환과 XML 지시자 언어에 쓰이는 언어입니다.

F12를 눌러 개발자도구를 누른 후 element(요소)부분을 누르고 내가 원하는 부분에서 마우스 오른쪽을 누르고 복사에서 보시면 내가 원하는것을 복사할 수 있습니다.

 

이제 데이터를 모으기전에 네이버 플레이스에서 스크롤을 하다보면 계속 어느 한정선까지 카페들이 추가적으로 보여지는것을 알 수 있습니다.

 

스크롤을 해야만 그 html코드들도 하나씩 하나씩 추가되기 때문에, 먼저 스크롤을 끝까지 해줘야 했습니다. 

스크롤을 해주려면 iframe을 바꿔준 뒤 그 iframe 내에서 눌러도 아무 상관이 없는 부분을 잡아주고 스크롤을 끝까지 내리도록 코드를 작성하였습니다.

 

저는 그냥 body부분을 클릭하고 스크롤을 끝까지 내려주었습니다.

 

이렇게 더이상 내려가지 않을때까지 끝까지 내려준 뒤 데이터를 수집해보았습니다.

 

아직 첫번째 테스트용 코드이기 때문에 값이 저장되는지만 빠르게 확인하기 위하여 카페의 이름들만 가져오도록 코드를 작성했습니다.

 

1일차의 기능으로는 여기까지 구현해보았습니다.

 

다음 포스팅에서 더 발전된 코드들로 설명해보도록 하겠습니다.

 

 


감사합니다.

 

728x90