on
노마드코더 - Python web scrapper 만들기 (2021.08.13)
노마드코더 - Python web scrapper 만들기 (2021.08.13)
노마드코더는 본격적으로 코딩을 공부하기 전에도 관심 있게 보던 프로그래머 유튜버였다.
관련 정보를 이해하기 쉽게, 위트 있게 설명해줘서 재밌게 보고 있던 유튜버였는데,
그 분이 코딩 꿈나무들을 위해 코딩 강의들을 제작하여 올린 사이트가 있다는 걸 최근에 알게 되었다.
https://nomadcoders.co/
사이트를 훑어보면 다양한 언어에 대해서 강의들이 마련되어 있음을 알 수 있다.
아직 언어들을 많이 알고 있지 않기 때문에 그나마 조금 알고 있는 파이썬의 초급 강의인
'Python으로 웹 스크래퍼 만들기'를 수강하였다.
사실 여태까지 나는 파이썬을 수학 문제를 푸는 도구로밖에 활용하지 않았다.
그 이상의 무궁무진한 역할을 지니고 있다는 것은 알고 있었지만, 무엇부터 어떻게 시작해야할지 난감하였다.
이번 강의는 그랬던 나에게 한 가지 해결책을 제시해주었다.
강의 생생 후기
강의는 총 5개의 파트로 이뤄져있다.
각각은 Introduction, Theory, Building a job scrapper, Ready for Django, 2020 Bonus class 이다.
Introduction은 말 그대로 강의 소개였고,
Theory는 파이썬이 뭔지, 파이썬의 구성요소와 문법이 뭔지 소개하는 파트였다.
List, Dict와 같은 자료구조부터 If else, For in과 같은 파이썬의 기본 문법까지 쓱 훑는 파트였다.
거의 다 이전에 '점프 투 파이썬'에서 숙지한 내용이라 가볍게 들을 수 있었다.
Building a job scrapper부터 본 강의의 메인 컨텐츠가 본격적으로 시작된다.
이 파트부터는 그동안 써보지 않았던 모듈들을 처음 접하게 되었는데,
바로 'requests'와 'Beautifulsoup'였다.
reqeusts는 파이썬에서 http 호출을 가능케하는 모듈이며,
Beautifulsoup는 텍스트 형태의 html을 파싱하여 데이터 추출을 용이하게 해주는 모듈이다.
강의에서 추구하는 목표는 'Indeed'와 'Stackoverflow'에서의 구인구직 정보를 스크랩하는 것이었다.
다만, 나는 강의의 컨텐츠를 그대로 따라하는 것보다 다른 웹페이지에서 웹 스크래핑을 하면서 직접 부딫히면서 배우면 더 오래 기억에 남을 것 같아 다른 사이트를 찾아 보았다.
적당한 사이트를 물색하던 중 여러 종류의 빵 레시피를 소개하는 해외 웹사이트를 찾아서 타겟으로 삼았다.
https://butterwithasideofbread.com/
어떠한 키워드(Ex. carrot)를 던졌을 때 그것과 관련된 모든 레시피를 사이트에서 긁어오는 것이 목표였다.
과정은 크게 3개로 나눌 수 있을 것 같다.
검색 결과가 몇 페이지나 있는지 찾아주는 함수
첫번째로 모든 결과들을 긁어 오기 위해 검색 결과가 몇 페이지나 있는지 찾는 함수를 만들었다.
앞서 언급한 requests와 BeautifulSoup를 활용하여 사이트의 html을 파싱하였다.
이후 검색 결과 페이지 수가 나타나는 구역인 class가 'archive-pagination pagination'인 div에서
숫자들만을 추출하여 pages 리스트에 append했고, 그 리스트 중 가장 큰 값을 max_page로 반환했다.
(links = links[:-1]을 한 이유는 마지막 값이 next여서 필요한 값이 아니었기에 제외하였다.)
특정 키워드 관련 레시피들을 추출하는 함수
두번째로 특정 키워드가 주어졌을 때, 그 키워드와 관련된 레시피들을 사이트에서 추출하는 함수를 만들었다.
앞서 만든 extract_bread_pages 함수를 통해 검색 결과가 몇 페이지나 있는지 추출하였고,
range를 이용해서 1페이지부터 마지막 페이지까지 레시피가 존재하는 음식들의 이름을 추출하였다.
최종 함수
마지막으로 앞서 만든 함수들을 총망라하는 최종 함수 get_recipes를 만들었다.
여기서 애를 좀 먹었던 게 내가 찾은 웹사이트는 강의에서 소개된 웹사이트와 구조가 달라서
함수의 요소와 표현 방법도 다르게 서술할 수밖에 없었다.
모든 사이트가 다 다르기에 어느 정도 예상했던 점이지만, 직접 부딫혀보니 계속되는 에러들 때문에
어떻게 코딩을 해야 이 에러들이 사라질지 무척이나 고민을 했었다.
돌이켜보면 쉬운 길을 좀 돌아온 감이 있지만, 결국 마지막에 성공적으로 값들을 추출했고, 어려운 길 속에서도
좋은 경험들을 했다고 생각한다.
만든 함수들을 실행시키기 위한 main.py
고생해서 만든 함수들이라 하더라도 그것을 쓰지 못하면 무용지물이다.
함수들을 사용하기 위한 인터페이스를 구현하기 위해 main.py를 코딩하였다.
main.py를 좀 더 부연 설명하자면, html을 통해 화면에 보이는 인터페이스를 구성하였다.
입력창에서 word를 받아서, 그 word를 기반으로 앞서 코딩한 함수들의 입력값으로 사용하였다.
db를 쓴 것은 사이트에서 한 번 정보들을 긁어 오면 그 정보를 다시 로딩할 필요 없이
바로 활용할 수 있게끔 하기 위해 만들었다.
마지막으로 결과로 나온 레시피들을 csv 파일로 개인이 다운로드할 수 있도록 하였다.
(사실 함수들 만드는 과정은 충분히 이해가 되었는데, flask를 활용한 부분은 아직까지 많이 어색하다.)
검색 결과창 (carrot 예시)
나오는 형식이 이쁘지는 않지만, 키워드 관련 결과 수, 키워드 관련 결과들, 그리고 csv 파일 다운로드까지
모두 원활하게 잘 진행이 된다.
처음으로 한 웹 스크래핑이라 서툰 부분들이 많았지만, 그래도 잘 작동되는 것을 보니 무척 뿌듯하다.
좋은 강의 제공해준 니코 쌤께 감사드리며,
다른 웹사이트도 스크래핑할 수 있는 좋은 기반이 되길 바래본다.
P.S.
작업한 코드들과 완성 웹페이지를 공유해본다. 조금이나마 도움이 되었으면 한다. :)
https://replit.com/@shinbang6425/Test
from http://goddorae.tistory.com/11 by ccl(A) rewrite - 2021-08-13 14:26:53