안녕하세요, JM입니다.
오늘은 파이썬을 활용하여 간단한 웹 스크래퍼 (or 웹 크롤러)를 만들어 보는 과정을 소개해 볼까 합니다.
스크래퍼를 만드는 것은 파이썬을 잘 모르는 분들도, 배우면서 따라 해 볼 수 있는... 그런 파이썬 기초강좌? 에도 많이 쓰이더라고요.
제가 스크래퍼를 만들어본 이유는.. 주식에 잘 써볼 수 있지 않을까... 해서입니다 ㅎㅎ
이 게시글에서는 제 블로그에 게시된 모든 글의 제목, 게시날짜, 링크를 스크랩하여 csv파일로 저장하는 간단한 코드를 작성할까 합니다.
파이썬이 설치되어있고, 개발환경 등은 다 구축되어있다는 가정 하에 포스팅을 진행합니다.
혹시 따라 하시는데 잘 안되시는 분들은, 파이썬이 잘 설치되어있는지... 등을 확인하시기 바라요!
저는 파이썬 3.5를 설치하였고, 개발환경으로는 마이크로소프트의 VS Code를 사용했습니다.
스크랩 -> csv파일로 저장하는 것 까지는 크게 다음과 같은 단계를 거칩니다.
1. 원하는 웹 사이트에 요청을 보내고 응답을 받는다.
2. 원하는 부분을 추출한다.
3. 추출한 데이터를 저장한다.
위와 같은 크게 세 가지 과정을 통해 스크랩을 진행하면 됩니다.
각 과정을 도와주는 모듈을 적절히 사용하여 코드를 구현하면 되는 거지요!
저는 requests, bs4의 Beautifulsoup, csv라는 모듈을 사용할 예정입니다.
(해당 모듈이 설치되어있지 않으시다면, 구글링... 부탁드려요)
import requests as rq
from bs4 import BeautifulSoup
import csv
이렇게 세 모듈을 import 하였고, requests라는 이름이 길어서 저는 rq로 했습니다.
BeautifulSoup도 길다고요? 이름이 예뻐서 그냥 뒀어요 ㅎㅎ...
다음으로는, 원하는 사이트(저는 제 블로그)의 URL이 필요하겠죠.
이 URL에 접속하여 HTML 코드를 확인합니다.(구글 크롬을 사용하시면, 해당 페이지에서 F12키를 누르시면 됩니다.)
이제 복잡한 HTML 코드가 보이고, 이 코드들은 잘 보면 태그와 내용으로 구성되어 있음을 확인할 수 있습니다.
예를 들어서 <div id="wrap" .....> 내용 </div> 뭐 이런 것들의 연속이죠.
제가 하고 싶은 것은 "모든 글의 '제목', '날짜', '링크'를 저장하는 것"이었죠.
이제 HTML 코드에서 해당 부분을 잘 찾아주면 됩니다.
(inspect기능을 잘 활용하면, 보기보다 쉽게 찾을 수 있어요!)
div.post.item이라는 어떤 객체...(?) 안에 제가 원하는 정보가 모두 포함되어 있네요.(제목, 날짜, 링크)
링크는 클릭하면 그 글로 넘어가는 것이니까.. 있는 것으로 생각하면 될 것 같습니다.
자, 여기까지 알아두고, 코드를 한 번 정리할게요.
우리가 원하는 URL에 요청을 보내고 그 응답을 받을 거예요. (requests)
그리고, 그 응답에서 우리가 원하는 정보만을 캐낼 거예요. (BeautifulSoup)
import requests as rq
from bs4 import BeautifulSoup
import csv
TISTORY_URL = "https://zzoo789.tistory.com/"
result = rq.get(TISTORY_URL)
print(result)
위 코드를 실행하니, 아래와 같은 응답이 오네요...
뭔가 오긴 왔나 봐요.
그럼 코드를 이렇게 한 번 해볼게요.
import requests as rq
from bs4 import BeautifulSoup
import csv
TISTORY_URL = "https://zzoo789.tistory.com/"
result = rq.get(TISTORY_URL)
print(result.text)
음... 뭔가가 왔네요.. 우리가 HTML 코드에서 본 뭔가가 왔어요..
우리는 이 result.text를 활용하는 편이 좋겠다 라는 생각이 드네요.
이제 진짜 모든 글을 추출해볼게요.
먼저, 우리는 몇 개의 글이 있는지 몰라요. 몇 개의 페이지를 가지고 있는지도 모르죠.
그래서, 최종 페이지를 추출해 볼 예정이에요.
그러면, 그 페이지 개수만큼 반복시켜 한 페이지에 있는 모든 글을 가져오도록 하면 되니까요.
다음과 같이 코드를 작성해볼게요.
def get_last_page(URL):
result = rq.get(TISTORY_URL)
soup = BeautifulSoup(result.text, "html.parser")
spans = soup.find("div", {"class" : "pagination"}).find_all("span")
pages = []
for span in spans:
pages.append(span.string)
last_page = int(pages[-1])
return last_page
위 코드를 실행하면, 현재 제 블로그의 페이지 수인 14가 출력됩니다.
그럼 이제 이 함수의 결과값인 last_page 만큼 제 블로그에서 페이지에 있는 모든 게시글을 긁어오면 되겠군요!
soup = BeautifulSoup(result.text, "html.parser") 이 부분을 주목해 볼게요.
위에서 rq.get으로 result.text를 출력해봤죠?
BeautifulSoup이라는 라이브러리 함수를 통해서 result.text를 html.parser라는 옵션으로 예쁘게 정리해준다!
라고 받아들이면 좋을 것 같아요.
html.parser 말고도 다른 parser도 있다는데, 저희는 html 코드를 가지고 스크래핑할 일이 대다수일 테니.. 다른 건 다루지 않겠습니다.
(저도 잘 몰라요..)
soup, spans 등의 변수를 만들어 내는 과정은 위에서 소개해 드린 div.post.item과 같은 방식으로 추출한 것이니, 참고하시면 돼요!
우선, 마지막 페이지까지 걸러내는 작업으로 포스트를 마칠게요.
다음 포스팅에 이어서 최종적으로 csv파일에 저장시키기 까지 진행해 보도록 하겠습니다.
감사합니다!
'공부 > [Python]' 카테고리의 다른 글
[파이썬] 간단한 웹 스크래퍼(Web Scrapper)만들기! - 2 (0) | 2021.04.09 |
---|
댓글