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で簡単に管理出来るようにする関数作ってみました。
仮想環境ディレクトリを環境変数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フォルダの中のフォルダを環境に認識するような仕様なのかも。
コメント