Anacondaで作った仮想環境に切り替えてscrapyを実行するbatスクリプト

scrapy shell https://www.test.jp/index.html
って感じでurl読み込ませて、
aTags= response.xpath(‘//div[@class=”test1″]//div[@class=”test2″]//td/a’).getall()
という感じでaタグの一覧を取得しようとしたのだが、
該当するタグ以降の全てのhtml要素がそれぞれ格納され、阿保みたいに大きなjsonファイルが出来てしまった。

原因

scrapyに関して調べてると、python3.9だと動かないという感じの記述があった。
少し古かったんで今は大丈夫だろと思ってたが、scrapyは色んなライブラリのバージョンがかなりセンシティブみたい。

python3.8+scrapyでの環境構築

(python3.10でサクッと動く方法あったんで追記した。追記(22/5/6)を参照。)

仕方がないんで、Anacondaでpython3.8でScrapy_Py38という名前の仮想環境を作成し、入れろとあった下記ライブラリをそのまんま入れてみた。

ipython==7.22.0
pylint==2.7.2
autopep8==1.5.6
scrapy==2.4.1
scrapy-selenium==0.0.7
pymongo==3.11.3
pillow==8.2.0
dnspython==1.16.0
shub

インストールは、AnacondaのEnvironmentsに作ったpython3.8の環境でOpen Terminalをクリック。

上のインストールパッケージリストを、list.txtって感じのファイルに記述して、「pip install -r list.txt」ってやれば作った環境に必要なライブラリがインストールされる。

この環境で、scrapyを動かしてみたところ、意図通りに文字列が取り出された。

指定した仮想環境でのバッチ処理

後は、バッチで環境をScrapy_Py38に切り替えてから、scrapyで作ったTestScrapyをcrawlさせるようにbatファイルを書いてみた。

以下のような感じで、batファイルを書くと、ダブルクリックで問題なく動いた。しかし、地味に色々嵌った。

rem get_json_data.bat
call conda.bat activate Scrapy_Py38
scrapy crawl TestScrapy -o data.json
pause

最初は、

conda activate Scrapy_Py38
scrapy crawl TestScrapy -o data.json

ってコマンドラインに打った内容をそのまま書いてたんだけど、下記内容が表示されて走らなかった。

D:\Test\Scrapy_Test_2>call conda activate Scrapy_Py38

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If using 'conda activate' from a batch script, change your
invocation to 'CALL conda.bat activate'.

To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - cmd.exe
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

何でも、バッチファイルで、「conda activate」を使う場合、「CALL conda.bat activate」って記述しないとダメらしい。

batファイルからbatやexeを呼ぶ場合、call付けないと元のbatに戻らないっぽいので、その都合でcallで呼ぶ用のconda.bat作ってあるって事だろうか?

追記(22/5/6), python3.10+scrapyの環境構築方法

Anaconda.NavigatorでPython3.10の仮想環境を新規作成し、下記コマンドで、scrapyをインストールしたら、問題なく動いた。

conda install -c conda-forge scrapy

ぱっと見GUIのAnaconda Navigatorからインストールするのが簡単そうに見えたんだけど、こっからだとインストールできないライブラリもあったりするみたい。また、anacondaとpip両方使ってインストールすると競合することもあるので基本的に混ぜたらダメらしい。加えて、pythonは各ライブラリが特定のバージョンどうしでしかうまく動作しないことも多いみたい。使いたいライブラリがあったら、インストールガイドがあるか探して、その手法に乗っ取ってやるのが一番良さそう。

Anaconda.Navigatorはうまくいった仮想環境をBackupしておいて、しくじったらimportでBackup読み込む時に、Overwrite existing environmentにチェック入れとけば、バックアップした仮想環境の構成に復元してくれる。

仮想環境の管理には使えそう。

ただ、baseをこのバックアップから上書きしたいと思ったんだが、うまくできない。。。

rootは初期化方法も見つからんし、直したいときどうすりゃいいの???と思う。

参考

 

追記(2022/05/07), base(root)の環境書換

Anacondaをアンインストールする以外によさそうな方法が見つからなかった。。。。

アンインストール自体は、Windowsの場合コントロールパネルからやればいいらしい。(ANACONDA.DOCUMENTATION Uninstalling Anaconda)

baseの変更や初期化は見つからなかったけど、Anacondaの仮想環境構成を環境変数に登録出来そうなことが分かった。

見てると、Anacondaはpkgsフォルダに各種バージョンのライブラリをダウンロードし、envsフォルダにそれぞれの仮想環境構成用フォルダ作って、対応するバージョンのファイルをpkgsからハードリンクで引っ張っることでそれぞれの構成を実現していた。

私は、標準のコマンドプロンプト環境にpythonを入れたかったので、元々は、下記パスを環境変数のpathに登録していた。

C:\Anaconda3
C:\Anaconda3\Scripts
C:\Anaconda3\Library\bin

これらに対応するフォルダがenvsフォルダ内のそれぞれの環境フォルダに入ってたので、Windowsのpath登録用の仮想環境「Anaonda_base」を作成することにした。

この仮想環境のパスを下記の様な感じで、Windowsのpathに追加してやったところ、構築した仮想環境の状態でうまく動くようになった。

C:\Anaconda3\envs\Anaonda_base;C:\Anaconda3\envs\Anaonda_base\Scripts;C:\Anaconda3\envs\Anaonda_base\Library\bin

これで、デフォルトで使う環境も自由にロールバックしたり入れ替えたり出来る。

結論としては、base(root)環境が壊れてAnacondaが起動しなくなると全てが終わるので、基本的にbaseにはライブラリ追加などはしない方がよさそう。

その他

環境変数をEXCELで簡単に管理出来るようにする関数作ってみました。

[EXCEL]環境変数path一発整形、文字列結合関数を強化。

仮想環境ディレクトリを環境変数Pathに追加する場合の注意点

python3.10+scrapy初期環境だと、conda activateでの切り替えが出来なかった。

追加で、environmentsからcondaをインストールし、コマンドプロンプトを開いて、「conda init」と実行した後、プロンプトを再起動すると使えるようになった。但し、「conda info -e」を実行すると、仮想環境がフルパス表示になっていた。

D:\>conda info -e
# conda environments:
#
                         C:\Anaconda3
base                  *  C:\Anaconda3\envs\Anaonda_base
                         C:\Anaconda3\envs\Scrapy_Py310
                         C:\Anaconda3\envs\Scrapy_Py38

切り換える場合は、下記のようにフルパスで入力しないと、環境切り替えが出来なかった。

conda activate C:\Anaconda3\envs\Scrapy_Py310

元々のAnacondaのパスを環境変数に追加したときはこうなって無かったことと、環境変数に追加したパスがbase *と表示されていることから、環境変数に追加されているディレクトリを基準にenvsフォルダの中のフォルダを環境に認識するような仕様なのかも。

コメントを残す

メールアドレスが公開されることはありません。