python anaconda環境にscrapyをインストールする

# はじめに
pythonでお手軽にスクレイピングしようと思い立ちscrapyを使おうと思いましたが、そもそもどれを使ってpythonをセットアップする？から悩んだり、scrapyがちゃんと動かなかったりと、いくつかはまったので、その解決方法のメモ書きです。

# 方針
pythonのパッケージや環境には様々なツールがあり、どれを使うのが良いか迷います。できるだけ少ないツールでシンプルに環境を設定したいので、以下の環境を選びました。

pyenv + anaconda

pythonのバージョン管理にはpyenvを使い、パッケージや仮想環境の管理にはanacondaのツールであるcondaを使います。この選択には以下の記事が大変参考になりました。

[データサイエンティストを目指す人のpython環境構築 2016](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)

# システム環境
現在開発にはMacしか使ってないので、本記事はMac(OSX)のみを対象としています。

# pythonのインストール
Macには標準でpython 2.xが入っていますが、これをアップデートするとはまるらしいので、システムのpythonはそのままにして、pyenvで別に使いたいpythonをインストールします。
また、pythonの様々なライブラリをほとんど使わないということはないと思われるので、主要なライブラリが一通りパッケージされたanacondaを利用するのが便利です。anacondaが大きすぎる場合には最小限に絞ったminicondaもあります。

## pyenvのインストール
anacondaを直接Macにインストールすると、homebrewと競合するという話もあるので（上記記事参照）、pyenvを利用するのが良いですし、anacondaに限らず様々なパッケージが簡単に利用できます。

まず、homebrewを使いpyenvをインストールします。

```
$ brew install pyenv
$ echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

$ exec $SHELL -l
```

## Anacondaのインストール
pyenvでインストールできるパッケージは

```
$ pyenv install -l
```
で見ることができます。anacondaであれば、現時点で、python2, python3の最新版は

```
  anaconda2-4.3.0
  anaconda3-4.3.0
```
となっています。ここではanaconda3-4.3.0をインストールします。

```
$ pyenv install anaconda3-4.3.0
```
インストールにはかなり時間がかかるので、コーヒーブレイクでもどうぞ。

## Anacondaの設定
上記のコマンドだけでは、インストールしたpython(anaconda)が使えるようにはなりません。システム全体で使えるようにするためには、

```
$ pyenv global anaconda3-4.3.0
```
とします。現在の設定は以下のコマンドで確認できます。

```
$ pyenv version
anaconda3-4.3.0 (set by /Users/tetsuo/.pyenv/version)
```
また、Macにダウンロードされている(pyenvが管理している）pythonのパッケージを見るのは、

```
$ pyenv versions
  system
  3.6.0
* anaconda3-4.3.0 (set by /Users/tetsuo/.pyenv/version)
```
とします。この状態でpythonを起動すると、

```
$ python
Python 3.6.0 |Anaconda 4.3.0 (x86_64)| (default, Dec 23 2016, 13:19:00)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
とAnacondaパッケージのpython3が動くのが分かります。

# scrapyのインストール
Anacondaでインストールされているライブラリの一覧は以下のコマンドで表示できます。

```
$ conda list
# packages in environment at /Users/tetsuo/.pyenv/versions/anaconda3-4.3.0:
#
_license                  1.1                      py36_1
alabaster                 0.7.9                    py36_0
anaconda                  4.3.0               np111py36_0
anaconda-client           1.6.0                    py36_0
anaconda-navigator        1.4.3                    py36_0
appnope                   0.1.0                    py36_0
  |
```
残念ながらscrapyはインストールされてないので、別途インストールします。scrapyのインストールは
通常pipを使いますが、condaで管理したいのでpipではなくcondaでインストールします。
まず、condaにscrapyがあるかどうか確かめます。

```
$ conda search scrapy
Fetching package metadata .........
scrapy                       0.16.4                   py26_0  defaults
                             0.16.4                   py27_0  defaults
                             0.24.4                   py27_0  defaults
                             1.0.1                    py27_0  defaults
                             1.0.3                    py27_0  defaults
                             1.1.1                    py27_0  defaults
                             1.1.1                    py34_0  defaults
                             1.1.1                    py35_0  defaults
                             1.1.1                    py36_0  defaults
```
scrapyも登録されているので、condaでインストールできます。ただ、scrapyの最新バージョンをインストールする時、内部で使用しているtwistedライブラリの最新版もインストールされてしまいます。しかし、scrapyのバグ？で、バージョン16.6より後のtwistedを使うと、スクレイピング中に

```
TypeError: 'float' object is not iterable
```
を出して止まります。
参考 [TypeError: 'float' object is not iterable (on Twisted dev + Scrapy dev)](https://github.com/scrapy/scrapy/issues/2461)
したがって、scrapyをインストールする時は一緒にtwistedのバージョンも指定します（使えるtwistedのバージョンも```conda search twisted```で調べられます）。

```
$ conda install scrapy twisted=16.6.0
```
これでscrapyもインストールできました。

```
$ scrapy version
Scrapy 1.1.1
```
# 最後に
これでpyenvとanacondaだけでpythonやscrapyを使う環境ができました。たまにpythonを使うぐらいですと、いくつもツールの使い方を覚えていられないですし、環境を思い出すのにも時間がかかってしまいます。また、エディタでlinterなどのプログラムの支援機能を利用するのに、システムグローバルな設定が必要となります。そこでできるだけ少ないツールで簡単に構築できる方法を探して、pyenvとcondaの２つのツールだけでpythonのバージョン管理から仮想環境まで扱える環境を作ってみました。これでエディタの支援機能も問題なく動いています。

ただし、condaの仮想環境を利用する場合は、activateコマンドがpyenvと競合して動かないという問題があります。これも簡単に解決できるので、今の所この環境で満足しています。
参考 [pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類](http://qiita.com/y__sama/items/f732bb7bec2bff355b69)