TIL DAY 04 : Python 크롤링

김기욱·2020년 7월 13일
0

TIL

목록 보기
4/11

👉 웹 크롤링

크롤링이란?

크롤링(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 시킨다.

  • analyze할때는 국민크롤링모듈 beautifulSoup를 사용했다.

셋째. title 변수를 지정해 sh_blog_title이라는 키워드를 가지고 해당 키워드와 관련된 모든 웹 내용을 크롤링해온다

넷째. 가져온 크롤링 내용을 'title(블로그타이틀)'과 'href(블로그 링크주소)'만을 보기좋게 출력해준다

  • for 반복구문을 통해 title안에 있는 attrs(요소)만 추출해서 print(출력)하게 했으며, 이와 동시에 temp라는 빈 리스트에 attrs를 넣고 이를 다시 searchList라는 빈 리스트에 넣어 이중리스트를 만들어냈다
    (이렇게 만들어진 리스트는 csv 저장용으로 쓰이게 된다)

다섯째. 상위에 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 작성시간이 꽤나 걸렸다. 더 많은 코드리뷰를 했다면 자연스레 시간이 단축되었을터인데 이 또한 나의 미숙함에서 나온 문제 인것 같다. 더 많이 쓰여질수록, 더 간결해지고, 더 빨라지리라...

그럼 다음 시간에도 파이썬 관련된 내용으로 찾아뵙도록 하겠다.

내 글을 볼 누군가를 위해 안녕🖐

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글