できる 仕事がはかどるPython自動処理 全部入り。の第3刷が決定しました

先日、ビジネスパーソン向けの Python 本を執筆したことを書きました。

t2y.hatenablog.jp

おかげさまで書店ならびにオンライン書店でも好調な売れ行きであるそうです。本書を購入していただいた方々、ありがとうございます。

このたび、第3刷の重版が決定しました。

【第3刷】9月2日(月)重版出来

book.impress.co.jp

オンライン書店による不評から始まった読者サポート

本書は発売当初からリアル書店では好調な売れ行きであると聞いていたものの、オンライン書店では微妙な状況でした。それはおそらく INTERNET Watch での書籍紹介の記事が変なバズり方をしたせいだと私は考えています。

internet.watch.impress.co.jp

本書の対象読者は Python 入門を終えたばかり初学者、さらに IT エンジニアではない次の方々を対象としています。

書名から誤解を招きやすい点や RPA の気運が高まりつつある背景の中、INTERNET Watch の記事をみて (中身を確認せずに) IT エンジニアの方々もオンライン書店で購入された方が多かったのではないかと推測します。

Amazon のカスタマーレビューを時系列にみていただければわかりますが、当初は本書の内容にがっかりしたレビューが多かったです。著者からすると、意図した対象読者へ届いていないことを歯がゆく思ったこともありました。とはいえ、経緯がどうであっても出版してしまったものはしょうがないのでできる範囲でサポートをしようと、身近なところで読者サポートのための勉強会を隔週で開催してきました。

bizpy.connpass.com

回を重ねるごとに勉強会のメンバーも少しずつ増えてきたこともあり、「ビジネスPythonを学ぶ会 (bizpy)」の slack も準備しているところです。いまのところ、読者サポートの勉強会は関西でしか開催できません。もしオンラインでもよいので本書の内容についてやり取りしたいという方は connpass の「ビジネスPythonを学ぶ会」のグループメンバーに登録しておいてください。後日、こちらの準備が整い次第、bizpy slack への招待リンクをグループメンバーへ送る予定です。

さらに Python イベントにも登壇して本書はビジネスパーソンやノンプログラマー向けの、Python を入門を終えた方々を対象としていると訴えることにしました。そのときの登壇資料が次になります。

www.slideshare.net medium.com

どんな理由であれ、本書を手に取っていただける読者が増えることは著者にとって嬉しいことではありますが、必要のない人にまで届けようとは思いません。今後も本書はビジネスパーソンやノンプログラマー向けの書籍であることを訴求していこうと思います。

そういった活動の成果が出てきたのか、2019-07-13 時点では 2.7 だったカスタマーレビューも本日時点で 3.1 まで上がりました。ここ最近は本書の対象読者である方々によるレビューが続いているおかげだと考えています。

f:id:t2y-1979:20190812134943p:plain
2019-08-12 時点での Amazon カスタマーレビュー

またレビューの良し悪しに関わらず、レビューを投稿していただいた読者の方々には感謝を申し上げます。よいレビューは著者にとって励みになりますし、わるいレビューは気づきを得られるのでどちらも次の行動への取っ掛かりになります。

例えば、わるいレビューから得た気づきで書いた補足記事が次になります。残念ながら重版となる第3刷ではこの補足記事を追加することはできませんでした。しかし、この補足記事へのリンクを「ここもポイント」というコラム形式で「Chapter 8 テキストデータの処理」の最後に追記しました。

t2y.hatenablog.jp

今後も勉強会や読者サポートの過程でお伺いした内容や気づきを留めていき、いつか本書を改訂できる機会ができたときに活かせるように努めていきたいと思います。

重版情報をスクレイピングしてみよう

第3刷の発売が決定しましたという案内だけではおもしろくないので本書の内容でできることの宣伝も少し書いてみます。丁寧な説明は意図的に省きますのでもう少し詳しい説明を読みたくなったら本書の購入を検討してください。

重版情報はインプレスさんのスタッフブログに公開されていますが、どうもこのサイトは RSS が提供されていないようです。

book.impress.co.jp

重版情報をチェックしたい方がいるかどうかわかりませんが、こういったときは Web スクレイピングすることでほしい情報を取り出すことができます。本書の「062 Web ページから要素を取り出す」のサンプルコードを応用して挑戦してみます。また本書の「061 Web スクレイピング」の節にある注意事項も書いておきます。スクレイピングに慣れていない方は、スクレイピングを行うときのマナー、約束事項として次のことを必ず守るようにしてください。

  1. 取得したデータは個人的に参照するのみに留める
  2. スクレイピング禁止となっていないかWebサイトの規約を確認する
  3. 大量のリクエストを送らない

本稿で紹介するスクレイピングのサンプルコードは次の URL からダウンロードできます。

CSS セレクターを取得する

Google Chrome (以下Chrome) に限った話ではありませんが、最近の Web ブラウザには開発者のデバッグを助けるためのツールが標準でインストールされていてすぐに使える状態になっています。本書では Chrome を使って説明しているので同様に Chrome を使います。インプレスさんのスタッフブログを Chrome の開発者ツールを使って HTML の要素を表示させたものが次になります。

f:id:t2y-1979:20190812151227p:plain
Google Chrome の開発者ツールを使って調べる

h2 や div といった HTML タグの構造や CSS の class としてどのようなものが設定されているかがすぐにわかります。

本のタイトルと重版についての情報を書いているところが離れているのでそれらを含む上位の div.block-book-detail までの CSS セレクターを Chrome 機能で取得します。

body > div.block-wrap > div.block-content > main > div > div:nth-child(3) > div.block-book-detail-box-body.module-usr-text > div.block-book-detail

Beautiful Soup の Tag オブジェクトを使う

HTML の要素を取り出すために本書では Beautiful Soup というツールを使います。Beautiful Soup で CSS セレクターを用いると Tag オブジェクトが返されます。先ほどの CSS セレクターで取得した Tag オブジェクトが detail にセットされます。そこからさらに CSS セレクターを指定して必要な要素のみを取り出します。

    hrefs = detail.select('h2 > a')
    reprint_messages = detail.select('div.module-book-copy > b')

このとき hrefsreprint_messages は次のようなリストが返されます。

ipdb> pp hrefs
[<a href="https://book.impress.co.jp/books/1118101147" title="できる 仕事がはかどるPython自動処理 全部入り。">◆ できる 仕事がはかどるPython自動処理 全部入り。</a>,
 <a href="https://book.impress.co.jp/books/1119600001" title="ねじ子のヒミツ手技#">◆ ねじ子のヒミツ手技#</a>,
 <a href="https://book.impress.co.jp/books/1119600002" title="ねじ子とパン太郎のモニター心電図 改訂版">◆ ねじ子とパン太郎のモニター心電図 改訂版</a>]
ipdb> pp reprint_messages
[<b class="module-book-price" style=" font-size: 120%; border: 0px; ">【第3刷】92日(月)重版出来</b>,
 <b class="module-book-price" style=" font-size: 120%; border: 0px; ">【第4刷】92日(月)重版出来</b>,
 <b class="module-book-price" style=" font-size: 120%; border: 0px; ">【第2刷】92日(月)重版出来</b>]

個別に要素のリストを取得できました。これらの情報を一緒に扱いたいとき、方法はいくつかありますが、zip() という組み込み関数で組み合わせるのがシンプルに表現できます。

ipdb> pp list(zip(hrefs, reprint_messages))
[(<a href="https://book.impress.co.jp/books/1118101147" title="できる 仕事がはかどるPython自動処理 全部入り。">◆ できる 仕事がはかどるPython自動処理 全部入り。</a>,
  <b class="module-book-price" style=" font-size: 120%; border: 0px; ">【第3刷】92日(月)重版出来</b>),
 (<a href="https://book.impress.co.jp/books/1119600001" title="ねじ子のヒミツ手技#">◆ ねじ子のヒミツ手技#</a>,
  <b class="module-book-price" style=" font-size: 120%; border: 0px; ">【第4刷】92日(月)重版出来</b>),
 (<a href="https://book.impress.co.jp/books/1119600002" title="ねじ子とパン太郎のモニター心電図 改訂版">◆ ねじ子とパン太郎のモニター心電図 改訂版</a>,
  <b class="module-book-price" style=" font-size: 120%; border: 0px; ">【第2刷】92日(月)重版出来</b>)]

あとは出力するときに Tag オブジェクトから必要な属性を指定するだけです。

最終的なサンプルコードは次の通りです。

import requests
from bs4 import BeautifulSoup

page_data = requests.get('https://book.impress.co.jp/staff_blog/').text
page = BeautifulSoup(page_data, 'lxml')
details = page.select("""
body > div.block-wrap > div.block-content > main > div > div:nth-child(3) > div.block-book-detail-box-body.module-usr-text > div.block-book-detail
""")

for detail in details:
    hrefs = detail.select('h2 > a')
    reprint_messages = detail.select('div.module-book-copy > b')
    hrefs_and_reprints = zip(hrefs, reprint_messages)
    for href, reprint in hrefs_and_reprints:
        print(f'{href["title"]}: {reprint.text}')

実行結果は次の通りです。

$ python impress_book_reprint_list_all.py
できる 仕事がはかどるPython自動処理 全部入り。: 【第3刷】9月2日(月)重版出来
ねじ子のヒミツ手技#: 【第4刷】9月2日(月)重版出来
ねじ子とパン太郎のモニター心電図 改訂版: 【第2刷】9月2日(月)重版出来

私が興味があるのは「できるPy」のみなので、さらに if 文で条件を限定することでほしい情報のみを絞り込めます。

    for href, reprint in hrefs_and_reprints:
        if href["title"] == 'できる 仕事がはかどるPython自動処理 全部入り。':
            print(f'{href["title"]}: {reprint.text}')

実行結果は次のようになります。

$ python impress_book_reprint_list_dekiru.py
できる 仕事がはかどるPython自動処理 全部入り。: 【第3刷】9月2日(月)重版出来

まとめ

本書の「062 Web ページから要素を取り出す」のサンプルコードを応用して RSS 情報のないサイトのページを取り出してみました。

本書で扱う「自動化」というのはこの程度の内容を十数行から数十行のサンプルコードで解説します。このぐらいのレベル感で目次にある内容の、Python プログラミングやツール・ライブラリの使い方を知りたいという方にとっては本書は役に立つでしょう。もしくは、このぐらいの内容なら自分で調べてすぐに実装できるという方であれば本書は不要になります。

どちらとも言えない方はぜひリアル書店へ足を運び、そこで中身を少し読んでみて、その直感で選択していただければと思います。

リファレンス

少し古いバージョンですが、Beautiful Soup ドキュメントの日本語訳もありました。

kondou.com

できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)

できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)