【Python】 BeautifulSoup을 사용하여 테이블을 스크래핑

빈번한 업데이트가있는 테이블이나 copipe가 어려운 테이블 등에서
데이터 수집을 조금이라도 효율화 할 수 없을까 생각 이번은,
파이썬으로 스크래핑하여 CSV에 내보내는 코드를 작성해 보았습니다.

설정한 환경



MacBook Air (13-inch, Mid 2011)
프로세서: 1.8 GHz Intel Core i7
메모리: 4GB 1333MHz DDR3
버전: 10.11.5
Python: 3.6.2

준비



BeautifulSoup를 설치합니다.
BeautifulSoup은 HTML과 XML에서 데이터를 검색할 수 있는 라이브러리입니다.

이번에는 pip를 사용하여 설치했습니다.
$ pip3 install beautifulsoup4
Collecting beautifulsoup4
  Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
    100% |████████████████████████████████| 92kB 1.8MB/s 
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0

그 외에는 easy_install이나 apt-get, 직접 코드를 다운로드해 인스톨 하는 방법등이 있습니다.
자세한 내용은 아래 공식 Document의 "Installing Beautiful Soup"을 읽어 주시면 좋겠습니다.

테이블 요소를 스크래핑해 봅니다.



beautifulsoup4가 설치되면,
즉시 O'Reilly의 신간 정보를 얻으십시오.

※서적의 정보 테이블의 이미지


2019/03/20 업데이트 : 쓰기 파일을 with로 열었습니다.

scraping_table.py
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

# URLの指定
html = urlopen("https://www.oreilly.co.jp/ebook/")
bsObj = BeautifulSoup(html, "html.parser")

# テーブルを指定
table = bsObj.findAll("table", {"class":"tablesorter"})[0]
rows = table.findAll("tr")

with open("ebooks.csv", "w", encoding='utf-8') as file:
    writer = csv.writer(file)
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td', 'th']):
            csvRow.append(cell.get_text())
        writer.writerow(csvRow)

내보낸 CSV는 이런 느낌이 듭니다.
정기적으로 실행하면 신간 정보를 놓치지 않습니다!
덧붙여서 위의 코드에서는 get_text()로 지정했으므로 "장바구니에 추가"열의 이미지 링크는 비어 있습니다.
ISBN,Title,価格,発行月,カートに追加
978-4-87311-755-3,パフォーマンス向上のためのデザイン設計,"2,073",2016/06,
978-4-87311-700-3,データ分析によるネットワークセキュリティ,"3,110",2016/06,
978-4-87311-754-6,UX戦略,"2,592",2016/05,
978-4-87311-768-3,Pythonからはじめる数学入門,"2,419",2016/05,
978-4-87311-767-6,あなたの知らないところでソフトウェアは何をしているのか?,"2,246",2016/05,
978-4-87311-763-8,発酵の技法,"3,110",2016/04,
978-4-87311-765-2,初めてのAnsible,"2,764",2016/04,
978-4-87311-764-5,カンバン仕事術,"3,110",2016/03,

다른 사이트에 적용하는 방법



기본적으로 코드의 다음 부분을 수정하여 다른 사이트의 테이블도 쉽게 얻을 수 있습니다.
  • 취득하고 싶은 테이블의 class명을 변경한다
  • 사이트에 같은 class명의 테이블이 복수 있는 경우, 몇번인가를 [ ]안의 번호로 지정한다
  • #テーブルを指定
    table = bsObj.findAll("table",{"class":"tablesorter"})[0]
    rows = table.findAll("tr")
    

    CSV 정보



    자신이 Mac을 사용하고 있기 때문에 내보낸 CSV는 utf-8이었습니다.
    그대로 Excel에서 읽으면 문자가 깨지기 때문에 문자 코드를 변환하여 성형하면 사용하기 쉽습니다.
    변환 방법을 알고 싶은 분은 여기 에서 부디 (다른 사이트)

    좋은 웹페이지 즐겨찾기