소품집

[파이썬을 이용한 웹 크롤링과 스크레이핑] 파이썬으로 스크레이핑 하는 흐름 본문

Web crawling

[파이썬을 이용한 웹 크롤링과 스크레이핑] 파이썬으로 스크레이핑 하는 흐름

sodayeong 2021. 5. 10. 15:29

2장에서 배운 모든 내용을 정리한 마지막 스크레이핑입니다. 

 

지금까지 세 개의 절에 걸쳐 설명한 처리 내용을 연결해 봅시다. 예제 2.19처럼 하면 웹 페이지를 추출하고, 스크레이핑 하고, 데이터를 저장하는 처리가 한 번에 이뤄집니다. 3개의 처리 내용을 3개의 함수로 구분하고, main() 함수에서 차례대로 호출하게 했습니다.

 

  • fetch(url)
  • 매개변수로 url을 받고 지정한 url의 웹페이지를 추출합니다.
  • scrape(html)
  • 매개변수로 html을 받고, 정규 표현식을 사용해 HTML에서 도서 정보를 추출합니다.
  • save(db_path, books)
  • 매개변수로 books라는 도서 목록을 받고, SQLite 데이터베이스에 저장합니다.

참고로 def 구문 아래에 여러 줄 문자여열 리터럴("''" ~ """)을 사용해 함수의 설명을 적는 것을 docstring이라고 합니다. 함수의 앞부분에 문자열을 배치해도 프로그램을 실행할 때 어떤 처리도 일어나지 않으므로 다른 프로그래밍 언어에서 여러 줄 주석처럼 사용할 수 있게 됩니다. 함수뿐만 아니라 모듈, 클래스에도 docstring을 작성할 수 있으며 이를 활용하면 doctest라고 하는 단위 테스트를 작성할 수 도 있습니다.

 

예제2.19 - 파이썬으로 스크레이핑 하기

import re
import sqlite3
from urllib.request import urlopen
from html import unescape

def main():
    """
    메인 처리입니다.
    fetch(), scrape(), save() 함수를 호출합니다.
    """
    html = fetch('http://www.hanbit.co.kr/store/books/full_book_list.html')
    books = scrape(html)
    save('books.db', books)

def fetch(url):
    """ 
    매개변수로 전달받을 url을 기반으로 웹 페이지를 추출합니다.
    웹 페이지의 인코딩 형식은 Content-Type 헤더를 기반으로 알아냅니다.
    반환값: str 자료형의 HTML
    """
    f = urlopen(url)
    # HTTP 헤더를 기반으로 인코딩 형식을 추출합니다.
    encoding = f.info().get_content_charset(failobj="utf-8")
    # 추출한 인코딩 형식을 기반으로 문자열을 디코딩합니다.
    html = f.read().decode(encoding)
    return html

def scrape(html):
    """
    매개변수 html로 받은 HTML을 기반으로 정규 표현식을 사용해 도서 정보를 추출합니다.
    반환값: 도서(dict) 리스트
    """
    books = []
    # re.findall()을 사용해 도서 하나에 해당하는 HTML을 추출합니다.
    for partial_html in re.findall(r'<td class="left"><a.*?</td>', html, re.DOTALL):
        # 도서의 URL을 추출합니다.
        url = re.search(r'<a href="(.*?)">', partial_html).group(1)
        url = 'http://www.hanbit.co.kr' + url
        # 태그를 제거해서 도서의 제목을 추출합니다.
        title = re.sub(r'<.*?>', '', partial_html)
        title = unescape(title)
        books.append({'url': url, 'title': title})
    
    return books

def save(db_path, books):
    """
    매개변수 books로 전달된 도서 목록을 SQLite 데이터베이스에 저장합니다.
    데이터베이스의 경로는 매개변수 dp_path로 지정합니다.
    반환값: None(없음)
    """
    # 데이터베이스를 열고 연결을 확립합니다.
    conn = sqlite3.connect(db_path)
    # 커서를 추출합니다.
    c = conn.cursor()
    # execute() 메서드로 SQL을 실행합니다.
    # 스크립트를 여러 번 실행할 수 있으므로 기존의 books 테이블을 제거합니다.
    c.execute('DROP TABLE IF EXISTS books')
    # books 테이블을 생성합니다.
    c.execute('''
        CREATE TABLE books (
            title text,
            url text
        )
    ''')
    # executemany() 메서드를 사용하면 매개변수로 리스트를 지정할 수 있습니다.
    c.executemany('INSERT INTO books VALUES (:title, :url)', books)
    # 변경사항을 커밋(저장)합니다.
    conn.commit()
    # 연결을 종료합니다.
    conn.close()

# python 명령어로 실행한 경우 main() 함수를 호출합니다.
# 이는 모듈로써 다른 파일에서 읽어 들였을 때 main() 함수가 호출되지 않게 하는 것입니다.
# 파이썬 프로그램의 일반적인 작성 방식입니다.
if __name__ == '__main__': 
    main()

이를 python_scrapy.py 이라는 이름으로 저장하고 실행하면, books.db라는 이름의 데이터베이스에 데이터가 저장됩니다.

(scraping) dayeong@dayeong-ui-MacBookPro ~ % python python_scrapy.py

(scraping) dayeong@dayeong-ui-MacBookPro ~ % python python_scrapy.py

(scraping) dayeong@dayeong-ui-MacBookPro ~ % sqlite3 books.db 'SELECT * FROM books'
모던 자바스크립트 핵심 가이드|http://www.hanbit.co.kr/store/books/look.php?p_code=B7677466304
고성능 파이썬(2판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B8494674601
데이터가 뛰어노는 AI 놀이터, 캐글|http://www.hanbit.co.kr/store/books/look.php?p_code=B4998513859
데이터 과학을 위한 통계(2판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B2862122581
일잘러의 비밀, 구글 스프레드시트 제대로 파헤치기|http://www.hanbit.co.kr/store/books/look.php?p_code=B7461753617
부동산 세금 사용설명서|http://www.hanbit.co.kr/store/books/look.php?p_code=B7599434121
이벤트 기반 마이크로서비스 구축|http://www.hanbit.co.kr/store/books/look.php?p_code=B6410605208
파이썬 비동기 라이브러리 Asyncio|http://www.hanbit.co.kr/store/books/look.php?p_code=B7267069633
한 권으로 끝내는 Node & Express(2판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B9078814814
소문난 명강의 : 김상형의 SQL 정복|http://www.hanbit.co.kr/store/books/look.php?p_code=B9543045444
나는 독이 되는 관계를 끝내기로 했다|http://www.hanbit.co.kr/store/books/look.php?p_code=B5960452302
엑셀 데이터 분석 바이블|http://www.hanbit.co.kr/store/books/look.php?p_code=B7362588632
맛있는 디자인 어도비 XD CC|http://www.hanbit.co.kr/store/books/look.php?p_code=B5726083423
읽는 순간 웃음이 팡! 낱말 퍼즐의 신|http://www.hanbit.co.kr/store/books/look.php?p_code=B8970347723
읽는 순간 웃음이 팡! 속담의 신|http://www.hanbit.co.kr/store/books/look.php?p_code=B1260294646
읽는 순간 웃음이 팡! 수수께끼의 신|http://www.hanbit.co.kr/store/books/look.php?p_code=B8662800021
쿼커스 쿡북|http://www.hanbit.co.kr/store/books/look.php?p_code=B7614945801
1년 후 내가 이 세상에 없다면|http://www.hanbit.co.kr/store/books/look.php?p_code=B6666542497
중세 1 : 만화로 배우는 서양사|http://www.hanbit.co.kr/store/books/look.php?p_code=B9915338821
중세 2 : 만화로 배우는 서양사|http://www.hanbit.co.kr/store/books/look.php?p_code=B2832646005
실전 시계열 분석|http://www.hanbit.co.kr/store/books/look.php?p_code=B9090689318
누워서 읽는 통계학|http://www.hanbit.co.kr/store/books/look.php?p_code=B9477508508
젠더 모자이크|http://www.hanbit.co.kr/store/books/look.php?p_code=B7301449278
우리가 시를 처음 쓴다면 그건 분명 윤동주일 거야: 『하늘과 바람과 별과 시』 필사|http://www.hanbit.co.kr/store/books/look.php?p_code=B2781572316
스파크를 활용한 실시간 처리|http://www.hanbit.co.kr/store/books/look.php?p_code=B7070333457
나 아직 안 죽었다|http://www.hanbit.co.kr/store/books/look.php?p_code=B5735013586
게임 엔진 블랙 북 : 둠|http://www.hanbit.co.kr/store/books/look.php?p_code=B6489048497
만만한 통계 : R 활용|http://www.hanbit.co.kr/store/books/look.php?p_code=B1073758476
러닝 SQL|http://www.hanbit.co.kr/store/books/look.php?p_code=B4640245615
이야기로 배우는 구글 빅쿼리|http://www.hanbit.co.kr/store/books/look.php?p_code=B6735191805
저는 심리학이 처음인데요(개정판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B1227197960
저는 인문학이 처음인데요(개정판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B1835066256
쓰면서 익히는 알고리즘과 자료구조|http://www.hanbit.co.kr/store/books/look.php?p_code=B7050837867
찾아도 찾아도 끝판왕 집중력 미로찾기 101|http://www.hanbit.co.kr/store/books/look.php?p_code=B3087610055
찾아도 찾아도 끝판왕 창의력 미로찾기 101|http://www.hanbit.co.kr/store/books/look.php?p_code=B8101312807
오늘부터 달리기를 합니다|http://www.hanbit.co.kr/store/books/look.php?p_code=B1790423150
몽고DB 완벽 가이드(3판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B2586509403
어린이를 위한 초등 자기주도 공부법×배움공책|http://www.hanbit.co.kr/store/books/look.php?p_code=B6340928295
기술의 시대|http://www.hanbit.co.kr/store/books/look.php?p_code=B1057946120
맛있는 디자인 프리미어 프로 CC 2021|http://www.hanbit.co.kr/store/books/look.php?p_code=B4734841062
GAN 첫걸음|http://www.hanbit.co.kr/store/books/look.php?p_code=B9417661237
디노 첫걸음|http://www.hanbit.co.kr/store/books/look.php?p_code=B8371133122
맛있는 디자인 일러스트레이터 CC 2021|http://www.hanbit.co.kr/store/books/look.php?p_code=B4979866790
4차 산업혁명 시대를 위한 e-비즈니스 개론(4판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B6808882615
사실은 사랑받고 싶었어|http://www.hanbit.co.kr/store/books/look.php?p_code=B3104313168
대한민국 부동산 미래지도|http://www.hanbit.co.kr/store/books/look.php?p_code=B6068039583
맛있는 디자인 포토샵 CC 2021|http://www.hanbit.co.kr/store/books/look.php?p_code=B1925383546
맛있는 디자인 애프터 이펙트 CC 2021|http://www.hanbit.co.kr/store/books/look.php?p_code=B1863505588
친절한 딥러닝 수학|http://www.hanbit.co.kr/store/books/look.php?p_code=B3866059305
이것이 안드로이드다 with 코틀린(개정판)|http://www.hanbit.co.kr/store/books/look.php?p_code=B3136457679

 

 

 

 

이 포스팅은 위키북스 파이썬 크롤링과 스크레이핑을 참조하였습니다.

728x90
Comments