크롤링이란?
크롤링(crawling)
혹은 스크레이핑(scraping)
은 웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위다. 크롤링하는 소프트웨어는 크롤러(crawler)
라고 부른다.
위코드 11기 사전스터디팀 '슬기로운 개발자 생활'의 3주차 과제는 파이썬을 이용한 크롤링을 만드는 과정이였다. 5주차에 넘어간 시점에서 이걸 올리는 내 게으름과 미숙함에 반성을 하는 바이다.
이번 코딩에는 csv, urllib.request, urllib.parse, BeautifulSoup 까지 총 네 개의 모듈을 import 했다. 사전스터디 이전에는 간단한 함수(while이나 for반복문, if문 등)수준을 독학으로 배우고 코딩해본게 전부였기 때문에, 크롤링을 할 수 있을까 걱정이 되기도 했지만 유튜브와 구글을 통해 코딩을 해놓으니 생각보다 어렵지 않았고(시간이 걸렸을 뿐), 충분히 할 수 있다는 자신감을 얻게 되었다. 모듈과 클래스, 메서드라는 개념에 대해 공부할 기회를 얻은 것도 또 하나의 메리트라면 메리트?!
이 글을 빌어서 크롤링 과제라는 좋은 제안을 해주신 팀원인 '영섭' 님에게 고마움을 전한다. 🙇♂️
<코드를 입력하세요>
import csv
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
PlusUrl = urllib.parse.quote_plus(input('검색어를 입력하세요 : '))
PageNum = 1
count = 1
i = input('몇 페이지를 크롤링 하시겠습니까? : ')
lastPage = int(i) * 10 - 9
searchList = []
while PageNum < lastPage + 1 :
url = 'https://search.naver.com/search.naver?date_from=&date_option=0&date_to=&dup_remove=1&nso=&post_blogurl=&post_blogurl_without=&query={}&sm=tab_pge&srchby=all&st=sim&where=post&start={}'.format(PlusUrl,PageNum)
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all(class_='sh_blog_title')
print('============ {}페이지 결과입니다 =========='.format(count))
print()
for i in title :
print(i.attrs['title'])
print(i.attrs['href'])
temp = []
temp.append(i.attrs['title'])
temp.append(i.attrs['href'])
searchList.append(temp)
print()
PageNum = PageNum + 10
count += 1
print()
print('=============================================')
print('숫자 1을 입력 = 실행')
print('다른숫자 입력 = 실행하지않음')
print('=============================================')
o = int(input('엑셀저장을 실행하시겠습니까? '))
if o == 1 :
f = open('SEARCH RESULT.csv', 'w', encoding='utf-8', newline='')
csvWriter = csv.writer(f)
for k in searchList :
csvWriter.writerow(k)
f.close()
print('엑셀저장이 완료되었습니다.')
else :
print('엑셀저장을 실행하지 않았습니다')
왜 본문 소스코드 창에는 VScode Editor
창처럼 컬러풀하게 나오지 않을까..? 🤷♂️
뭐 어찌됬던 이번에 내가 작성한 코드의 목적은 "검색어를 입력하면 원하는 페이지 수 만큼 '블로그제목'과 '링크주소'를 크롤링해오고 크롤링한 내용을 csv파일(엑셀로 읽고 쓰기 가능한 형식)로 저장까지 시켜주는 것" 이다.
소스코드는 다음과 같은 프로세스를 통해 구현된다.
첫째. PlusUrl과 i라는 변수를 통해 검색어 이름과 페이지 수를 input한다.
이 과정에서 구문분석을 위한 urllib.parse와 입력된 한글을 아스키코드화를 시켜 파이썬에서 read 가능하게 만들어주는 quote_plus를 PlusUrl변수에 붙여서 사용했다.
또한 PageNum이란 변수를 만들어 블로그 url주소가 페이지 주소에 따라 1, 11, 21씩 바뀌는 것에 대응하기 위해 포매팅하여 사용했다.
둘째. url, html, soup라는 변수를 지정해 각각 url주소(블로그주소)를 open -> read -> analyze 시킨다.
셋째. title 변수를 지정해 sh_blog_title이라는 키워드를 가지고 해당 키워드와 관련된 모든 웹 내용을 크롤링해온다
넷째. 가져온 크롤링 내용을 'title(블로그타이틀)'과 'href(블로그 링크주소)'만을 보기좋게 출력해준다
다섯째. 상위에 while 반복문과 count변수 pageNum 변수를 이용해 필요한 페이지 수를 입력하면 그 숫자만큼 크롤링을 할 수 있게 구현했다.
lastpage 라는 변수를 만들어 int(i) * 10 - 9 식을 써서 로 1, 11, 21, 31 등 일정하게 증가하는 블로그 꼬리 숫자식에 대응하도록 만들었다
while 구문 끝에 pageNum을 10 단위로 증가시키는 식을 만들고 while pageNum < lastPage +1 라는 구문구조로 i에 입력된 페이지 수만큼만 반복문을 돌리도록 코드를 구성했다.
여섯째. count 변수와 {}페이지 결과입니다 print{} 등을 써서 가독성 좋게 출력되게 만들었다
일곱번째. open('SEARCH RESULT.csv', 'w', encoding='utf-8', newline='') f. close 등을 통해 반복문이 끝나 채워진 리스트를 엑셀 저장까지 동작하도록 만들어준다.
마지막. print, input, if문들을 사용해 엑셀저장을 optional 하게 만들어 준다.
이를 통해 나의 첫 코드리뷰가 끝났다. 사실 공백을 포함하지 않으면 45줄 정도되는 별거 아닌 코드인데 코드리뷰로 풀어서 설명하려니 velog 작성시간이 꽤나 걸렸다. 더 많은 코드리뷰를 했다면 자연스레 시간이 단축되었을터인데 이 또한 나의 미숙함에서 나온 문제 인것 같다. 더 많이 쓰여질수록, 더 간결해지고, 더 빨라지리라...
그럼 다음 시간에도 파이썬 관련된 내용으로 찾아뵙도록 하겠다.
내 글을 볼 누군가를 위해 안녕🖐