https://spartacodingclub.kr/hip
스파르타코딩클럽 [힙한 취미 코딩 이벤트]
입장만 해도 경품이? 코딩 무료로 배우고 맥북받자!
spartacodingclub.kr

1) HTML 뜯어보기

'보기만해도 복잡하다', '눈도 아프고, 도저히 뭘 찾아야 할지 모르겠다.'
크롤링을 하기위해 창을 열고 처음든 생각이다.

하지만 위 사진처럼 마우스를 가져다대면 어떤 코드가 어떤 부분을 구성하고 있는지 휜히 알려준다. 그리고 그렇게 원하는 정보를 하나씩 찾아가다보면 의외로 많은 부분이 비슷하게 동작하고 있다는것을 알 수 있다.
title = article.select_one('div.news_wrap.api_ani_send > div > a').text
url = article.select_one('div.news_wrap.api_ani_send > div > a')['href']
comp = article.select_one('div.news_wrap.api_ani_send > div > div.news_info > div.info_group > a.info.press')
때문에 강의와는 조금 달랐지만 쉽게 찾아낼 수 있었다.
2) 정리하기
크롤링은 비정형 데이터의 연속이다. 때문에 입맛에 맞춰 정제하는 과정을 거쳐야한다.
따라서 다음과 같은 함수들을 적절히 사용해야만 한다.
- 공백을 지우는 Strip 함수
# 왼쪽 공백 지우기
a = ' sparta'
print(a.lstrip())
# >>> sparta
# 오른쪽 공백 지우기
a = 'sparta '
print(a.rstrip())
# >>> sparta
# 양쪽 공백 지우기
a = ' sparta '
print(a.strip())
# >>> sparta
- 문자열을 대체하는 Replace 함수
# 문자열 바꾸기
a = 'hello spatra'
print(a.replace('hello','hi'))
# >>> hi sparta
- 문자열을 특정 기준에 따라 나누는 Split 함수
# 문자열 나누기
# 공백을 기준으로 나눔
a = 'hello sparta'
print(a.split())
# >>> ['hello', 'sparta']
# 문자열 나누기
# , 기준으로 나눔
a = 's,p,a,r,t,a'
print(a.split(','))
# >>> ['s', 'p', 'a', 'r', 't', 'a']
3) 저장하기
이제 원하는 데이터를 다 추렸으면, 활용하기 위해 저장해야한다.
그때 유용하게 쓰이는 라이브러리가 있다.
바로 Excel을 활용할 수 있는 'openpyxl' 라이브러리이다. 참고로 'openpyxl'은 Excel 2010 이상의 xlsx, xlsm, xltx, xltm 파일을 처리할 수 있다고 한다.

아래 코드와 같이 기본적인 설정을 해준다.
wb = Workbook()
ws1 = wb.active
ws1.title = "articles"
ws1.append(["제목", "링크", "신문사", "썸네일"])
# 저장
wb.save(filename='articles.xlsx')
그러면 아래 사진처럼 인덱스가 정해진 Excel 파일이 생성된다.

그렇다면 이제 끝이다.
크롤링을 마친 데이터를 정해진 형식에 맞춰 저장하면 된다.

외전) 메일 보내기
파이썬에 기본적으로 내장되어있는 함수인 smtplib을 사용한다면 손쉽게 메일을 보낼 수 있다.
SMTP는 Simple Mail Transfer Protocol의 약자로서 메일을 보내는데 사용되는 프로토콜이다. 개인이나 회사가 SMTP 서버를 설치해서 이를 통해 메일을 발송할 수 있지만, 요즘은 구글, 마이크로소프트 등 많은 회사들이 SMTP 서버를 사용할 수 있도록 오픈하고 있기 때문에 이들 SMTP 서버를 사용해서 메일을 발송할 수 있다.
@참고
http://pythonstudy.xyz/python/article/508-%EB%A9%94%EC%9D%BC-%EB%B3%B4%EB%82%B4%EA%B8%B0-SMTP
강의 : Sparta 코딩클럽
# 크롤링 코드
from bs4 import BeautifulSoup
from selenium import webdriver
from openpyxl import Workbook
driver = webdriver.Chrome('chromedriver')
url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=추석"
driver.get(url)
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')
#####################
articles = soup.select('#main_pack > section.sc_new.sp_nnews._prs_nws > div > div.group_news > ul > li')
wb = Workbook()
ws1 = wb.active
ws1.title = "articles"
ws1.append(["제목", "링크", "신문사"])
for article in articles:
title = article.select_one('div.news_wrap.api_ani_send > div > a').text
url = article.select_one('div.news_wrap.api_ani_send > div > a')['href']
comp = article.select_one('div.news_wrap.api_ani_send > div > div.news_info > div.info_group > a.info.press').text.split(' ')[0].replace('언론사','')
ws1.append([title, url, comp])
wb.save(filename='articles.xlsx')
#####################
driver.quit()'All Development' 카테고리의 다른 글
| Rokoko) Motion Capture (0) | 2022.02.21 |
|---|---|
| Python) 힙한취미코딩 - 워드클라우드(WordCloud) (1) | 2021.09.17 |
| Python) 힙한취미코딩 - selenium, dload, bs4 라이브러리 (0) | 2021.09.16 |
| 백준 12865번) 평범한 배낭 (Python, C#) (0) | 2021.05.19 |
| 백준 15652번) N과 M(4) (Python) (0) | 2021.05.12 |