Help us understand the problem. What is going on with this article?

【Python】BeautifulSoupを使ってテーブルをスクレイピング

More than 1 year has passed since last update.

頻繁な更新のあるテーブルやコピペがしにくいテーブルなどからの
データ収集をちょっとでも効率化できないかと思い今回は、
pythonでスクレイピングしてCSVに書き出すコードを書いてみました。

設定した環境

MacBook Air (13-inch, Mid 2011)
プロセッサ: 1.8 GHz Intel Core i7
メモリ: 4 GB 1333 MHz 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"を読んでいただければと思います。

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

テーブル要素をスクレイピングしてみる

beautifulsoup4がインストールできたら、
さっそくO'Reillyの新刊情報を取得してみましょう。

※書籍の情報テーブルのイメージ
スクリーンショット 2016-08-07 10.38.23.png

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,

他のサイトに応用する方法

基本的にはコードの以下の部分を修正することで他のサイトのテーブルも簡単に取得できます。

  1. 取得したいテーブルのclass名を変更する
  2. サイト内に同じclass名のテーブルが複数ある場合は、何番目かを[ ]の中の番号で指定する
#テーブルを指定
table = bsObj.findAll("table",{"class":"tablesorter"})[0]
rows = table.findAll("tr")

CSVについて

自分はMacを使っているので、書き出されたCSVはutf-8でした。
そのままExcelで読み込むと文字化けするので、文字コードを変換して、整形すると使いやすいです。
変換の方法を知りたい方はこちらからどうぞ(別サイト)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした