Pythonクローリング&スクレイピング ―データ収集・解析のための実践開発ガイド―

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

ダウンロード

(2017年9月8日更新)

サンプルファイルのダウンロード

本書のサンプルファイルをご利用いただけます。
サンプルファイルの利用方法についてはzipファイル内のREADME.txtを参照してください。

ダウンロード
sample_codes.zip

補足情報

Webサイトの変更等により動作しなくなった箇所の修正情報を一部掲載します。

(2017年11月9日最終更新)

P.275 サイトの変更に伴う入力内容の変更

サイト内容の変更に伴いコードが動作しなくなりました。
tabelog.pyの38行目(addressの部分)を下記のように変更してください。


address=response.css('.rstinfo-table__address').xpath('string()').extract_first().strip(),



(以下2017年6月26日更新)

P.162 ファイル内容の変更に伴う入力内容の変更

jgbcm_all.csvの表記ルールの変更に伴い,下記のようにdf_jgbcmの定義を変更する必要があります。

1行目の追加内容を無視しています。


>>> df_jgbcm = pd.read_csv('jgbcm_all.csv', encoding='cp932',  index_col=0, parse_dates=True, date_parser=parse_japanese_date,  na_values=['-'], header=1)

P.169とP.170 ファイル内容の変更に伴うリストの変更

jgbcm_all.csvの表記ルールの変更に伴い,下記のようにP.169のdf_jgbcmの定義を変更する必要があります。

1行目の追加内容を無視しています。


df_jgbcm = pd.read_csv( 'jgbcm_all.csv', encoding='cp932', index_col=0,  parse_dates=True, date_parser=parse_japanese_date, na_values=['-'],  header=1)


あわせて,P.170でjgbcm_all.csvを出力する個所も変更の必要があります。


plt.plot(df_jgbcm.index, df_jgbcm['1年'], label='1年国債金利')  
plt.plot(df_jgbcm.index, df_jgbcm['5年'], label='5年国債金利')  
plt.plot(df_jgbcm.index, df_jgbcm['10年'], label='10年国債金利')




(以下,2017年6月19日更新)

P.43, 2.4以降のgihyo.jp/dpにアクセスする操作が動作しない

gihyo.jp側の変更によりurllibによって「https://gihyo.jp/dp」にアクセスできなくなりました。
書籍中で案内している「https://gihyo.jp/dp」のURLをすべて,サンプルサイトの「http://sample.scraping-book.com/dp」に変更してください。


 >>> from urllib.request import urlopen
 >>> f = urlopen('http://sample.scraping-book.com/dp')



(以下,2017年5月22日更新)

P.168 P.169, macOS Sierraのフォント指定

macOS Sierraでは,matplotlibから使用できる.ttf形式の日本語フォントファイルがなくなってしまったため,以下の手順でMigMix 1Pフォントをインストールしてください。

  1. http://mix-mplus-ipa.osdn.jp/migmix/ から migmix-1p-20150712.zip をダウンロード・展開する。
  2. ZIPファイルに含まれているmigmix-1p-regular.ttfを~/Library/Fontsにコピーする。
  3. 以下のコマンドでmatplotlibのフォントのキャッシュファイルを削除する。※ P.166 脚注39のパスはLinuxのもので,macOSでは異なるので注意してください。
  4. 
    rm ~/.matplotlib/fontList.py3k.cache
    
    


(以下,2017年4月6日更新)

P.127, 5.1 データセットの取得と活用

P.127でダウンロードするWikipedia日本語版のデータセット(記事ページの最新版のダンプ)は定期的に更新され,一定以上古いものは削除されるため,書籍に記載のURLではダウンロードできなくなっています。

最新のダンプファイル一覧のページ (https://dumps.wikimedia.org/jawiki/latest/) から jawiki-latest-pages-articles1.xml-<任意の文字列>.bz2 というファイルを探し,そのURLをwgetの引数に指定してダウンロードしてください。

2017年4月6日現在では以下のURLでダウンロード可能です。

https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles1.xml-p1p168815.bz2

P.192, 5.6.1 JavaScriptを使ったページへの対応方法

PhantomJS 1.9.8を使用した場合,リスト5.25(P.201)とリスト5.26(P.203)のスクリプトが正常に動作しなくなっています。
最新のPhantomJS 2.1.1を使用すると改善します。

OS XではHomebrewで最新版(2016-12-06時点で2.1.1)がインストールされます。
古いバージョンを使用中の場合は`brew upgrade phantomjs`で最新版をインストールできます。

Ubuntuではインストール手順で`1.9.8`となっている箇所をすべて`2.1.1`に置き換えて実行すると2.1.1をインストールできます。


$ wget  
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2 # bz2ファイルを解凍する
$ sudo cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/ #  
PATHの通ったところにバイナリをコピーする
$ sudo apt-get install -y libfontconfig1 fonts-migmix

バージョンを確認すると2.1.1となります。


$ phantomjs --version
2.1.1

P.198, 5.6.2 noteのおすすめコンテンツを取得する

ページ読み込みのタイミングによっては,リスト5.24(P.198),リスト5.25(P.201),リスト5.26(P.203)のスクリプトが失敗することがあります。

この場合,`driver.get()`の後,
`driver.find_elements_by_css_selector()`または
`driver.execute_script()`の前に`time.sleep(2)`でスリープを入れると成功します。

P.200の解説にあるように,通常のWebページでは`driver.get()`の実行時にonloadイベントの発生時点までブロックされます。一方,noteのようにSingle Page Applicationの場合,onloadイベント以降もAjaxによる通信が継続していることがあります。このため,スリープを入れてAjaxの通信が完了するのを待ちます。

本来はAjaxの通信が完了するまで待つべきですが,そのような待ち方を指定できないので,ここでは仮に2秒としています。


    print('Navigating...', file=sys.stderr)
    driver.get('https://note.mu/')  # noteのトップページを開く。
    assert 'note' in driver.title  # タイトルに'note'が含まれていることを確認する。
    time.sleep(2)  # 2秒間待つ。 ← この行を追加

リスト5.24(get_note_content.py)では,ファイル冒頭に`import time`も追加してください。

サンプルファイルは修正済みです。

P.228, 6.1.2 Spiderの実行

ScrapingHub社のブログの構造の変更により,リスト6.1の`myspider.py`は投稿を1件も取得できなくなっています。

ScrapyのWebサイトに掲載されているサンプルコードも変更されています。 新しいサンプルコードにコメントを追加すると以下のようになります。(サンプルファイルに`6-1/myspider_mod.py`として同梱)



import scrapy


class BlogSpider(scrapy.Spider):
     name = 'blogspider'  # Spiderの名前。
     # クロールを開始するURLのリスト。
     start_urls = ['https://blog.scrapinghub.com']

     def parse(self, response):
         """
         ページから投稿のタイトルをすべて抜き出し,ベージャーをたどる。
         """

         # ページから投稿のタイトルをすべて抜き出す。
         for title in response.css('h2.entry-title'):
             yield {'title': title.css('a ::text').extract_first()}

         # ページャーの次のページへのリンクを取得し,次のページがあれば 
たどる。
         # 次のページもparse()メソッドで処理する。
         next_page = response.css('div.prev-post > a  
::attr(href)').extract_first()
         if next_page:
             yield scrapy.Request(response.urljoin(next_page),  
callback=self.parse)

このSpiderは「一覧のみパターン」のSpiderで,まずブログのトップページから投稿のタイトルをすべて抜き出します。
続いてページ下部にある「OLDER POST」というリンクをたどって,次のページを取得します。
そこからも同様に投稿のタイトルをすべて抜き出し,さらに次のページへと再帰的に繰り返します。
後のページまでたどって「OLDER POST」というリンクがなくなったら終了です。

リンクをたどる流れを図で表すと次のようになります。

sample.png

実行結果は書籍内のものと変わりません。

お詫びと訂正

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2017年6月15日最終更新)

P .50の脚注15(*15)

後この例では Google Chrome の〜
この例では Google Chrome の〜

(以下,2017年5月22日更新)

P.94, メソッド名の誤記


make=links_absolute()


make_links_absolute()

P.168 P.169, フォント指定の漏れ

リスト5.11 (P. 168) およびリスト5.12 (P. 169)でフォント指定が誤っていました。Osakaを追加するとEl Capitanで日本語が正常に表示されるようになります。

matplotlib.rcParams['font.sans-serif'] = 'Hiragino Kaku Gothic Pro,  
MigMix 1P'
matplotlib.rcParams['font.sans-serif'] = 'Hiragino Kaku Gothic Pro,  
Osaka, MigMix 1P'


(以下,2017年2月6日更新)

目次 「A.1.2 Vagrantとは」の対応ページ(第2刷以降修正済み)

362
361

P.68 表3.1「直下のテキストが"概要"というテキストであるh2要素」のXPath(第2刷以降修正済み)

//h2[text()="概要")]
//h2[text()="概要"]

2つ目の「)」が不要です。

P.140 脚注番号21のURL(第2刷以降修正済み)

https://dev.twitter.com/overview/api/twitter-libraries
https://dev.twitter.com/resources/twitter-libraries

P.149 ソースコード中のインストールに関するコメント


# pip install google-api-python-cliet


# pip install google-api-python-client