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一発整形、文字列結合関数を強化。
pythonの環境構築してて、環境変数のパスを作るのが地味にだるかった。 というわけで、EXCELで文字列結合して作ろうと思ったのだが、標準の関数がいまいち使いにくかったので作成。 基本的には、TEXTJOINと似た感じの作り。TEXTJO...

仮想環境ディレクトリを環境変数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フォルダの中のフォルダを環境に認識するような仕様なのかも。

コメント

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました