Python学習備忘録②　Anacondaを使わず、ScrapyでLaravelで作った自分のポートフォリオをモルモットにしてスクレイピングしてみた（本編）

____
※本Qiita は

（１）「**初心者からちゃんとしたプロになるPython基礎入門　大津　真・田中賢一郎　共著　MdN社**」
（２）「**確かな力が身につくPython「超」入門　鎌田正浩　著　SB Creative社**」👈個人的にはPythonの最初の１冊として最適でした
（３）https://qiita.com/python_academia/items/62aefbf4e373cd2aa496

を主に利用した学習をもとに作成しました。（なお、私は（１）の途中で一旦、tkinterって結局何なん??(´д｀)??　⇒（２）を読んでから（１）あぁ(･∀･)みたいな感じでした。「～入門」にも甘辛が存在するようです。）
___

なお以下、Anaconda（※３）を使わずに 
<h3>Visual Studio CodeのみでScrapyを使用する方法

を記述しました。少し長くなったため、本編（A）・（B）と補足編（（C）～（F））に分けましたまた、Pythonでしか使わないような単語を使わないと、説明がそれこそニシキヘビが如く超長くなりそうなので、できるだけ本Qiitaを短くするため、また、備忘録としても意味合いを兼ね今後個人的に謎単語であったものには一番下に注釈をつけました。（※～の数字部分がそれぞれ対応します）

___
<h2>少し使ってみた感想
<h4>・そもそも「スクレイピング」は自分の成果物にかけても効果を発揮する？？？
<h4>・Scrapyは比較的スクレイピングそのものにかかる時間が少なそう
<h4>・yield文とかいう謎言語さえクリアすれば、Scrapyはリファクタリング（refactoring、再設計）の際のコードの重複を調べるのに重宝しそう。jsonが作れるのは便利
<h4>・以外とAnacondaなしでも結構使えそう。やっぱりPythonって無理にAnacondaを使う必要はないんじゃないか？？（真のよわよわにとって環境構築って本当に面倒いんで（´д｀））

___
補足編　https://qiita.com/thinking-weed/private/1f6671694f96fc3fbd1e
___

<h2>（A）Scrapyは蠱毒の壺で蜘蛛を飲み込んだ蛇～＞￣ )～～～～～～～～～～～～～～～～～～～～～～～

「**クローリング＆スクレイピングを行うプログラム（＝ウェブ上の文書や画像などを周期的に取得し、自動的にデータベース化するプログラム）**」のことを
<h4>「クローラー」「Web Spider（Web（インターネット（net？）上に巣を張る）蜘蛛）」「Spider（蜘蛛）」

などと呼ぶようです。※以下スパイダーとします。ChatGPTにもスパイダーが組み込まれているものと思われます。そして、
<h4>Scrapyは、Webページの取得からデータの抽出、保存までをサポートしてくれるスクレイピングによるデータ収集に特化したPythonのフレームワーク

みたいです。
　なお、Pythonは英語で「ニシキヘビ属」を指しますが、Anacondaは実はニシキヘビ属ではないみたいです。

<h1>（B）Laravelで作った自分のポートフォリオ（のresources の .blade.php）をサンプルにScrapyでスクレイピングしてみた実際の様子

<h2>（i）フレームワークっぽくない（プロジェクト）を作らない方法によるスクレイピング

①スクレイピングしたい対象のHP等の **スクレイピングに関する規約**（※補足編（D）参照）を調べる（※今回は自分のポートフォリオで個人情報に繋がるところは鍵をつけてある外部リンクのため必要なし）
　　　　　　　　　　　　　▽
（（規約に反しなければ）各タグなどを確認するためにソースコードかデベロッパーツール（＝検証ツール）のElementsパネルの階層化されたHTMLを開く（今回は、.blade.phpファイルを開くことになる））
　　　　　　　　　　　　　▽
③ **補足編の（E）等の方法でScrapyをインストールしたのち**、Visual Studio Codeでターミナルを開いて（powershell か zsh（※学習に利用していた民間スクールのチーム開発で一緒だった人がMacで、対応するのがzshだったので、たぶんzshです））
```powershell 
scrapy shell
```
で、Enterクリック（**※終了時はexit()でEnterクリック**）し、Scrapy Shell（対話モード）を開始する。つまり、
<h3>ScrapyはPythonならでは？？のinteractive（※６）shell（対話モード）が存在するという変な？フレームワーク

です。（※自分がまだ実務未経験なのであくまで「変な」というのは主観です）

<h3>なお、ターミナルに貼り付けをするときは、Windowsの場合、VScodeなら、コピーをしてある状態で、所定の位置にカーソルを合わして、マウスで右クリックするとペーストできます。

**※Scrapy Shellを開始すると以下のようになります。**

![Scrapy_Shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/e1cfbbe6-bccf-fca2-25d2-0494aca169a2.png)
　　　　　　　　　　　　　▽
④　以下のコマンドで、**対象のページからHTMLが、responseというオブジェクトに格納される**みたいです。 （内蔵のスパイダーが起動する？？）
```powershell
fetch("https:～対象のWebページのURL～")
```
⑤ **取得したresponseオブジェクトから、HTMLファイル全体をテキストとして取り出す（※ここでは「text」というオブジェクトに新たに格納することを指すと思われます** ）には、上のfetchコマンドの後に
```powershell
response.text
```
でEnterクリック（結果、こんな感じになりました。）

![portfolio_response_text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/9cac2aed-5f61-ad35-97d8-cf56d7bc3084.png)

ターミナルのところに取得したとされているHTMLが表示されるのですが、タグを見た感じ
<h3>ホーム画面の.blade.php（LaravelにおけるHTMLに変換されるファイル形式）しか読み込まれていない... (〃_ _)σ)Д`) ソリャソウヵ。だって、よく考えたら、ルーティングの関係でURLちがうんだもの・・・

（**他の.blade.phpファイルも当然ポートフォリオ（＝1プロジェクト）には含まれているため（SPA（※）ではないです。）**）

なお、fetchコマンドで格納した後は、beautifulsoup4（※補足編（C）を参照）等と同様、Scrapy も
```powershell
response.css（"セレクタ名（h2など）"）
```
等のメソッドを使って諸々できそうです（全部のメソッドを書くと冗長すぎるのでここでは割愛します。※補足編（E）の公式ドキュメント参照）
___

<h2>（ⅱ）フレームワークっぽい（プロジェクト）を作る方法によるスクレイピング

<h3>① プロジェクトを以下のコマンドで作成する

フレームワークというぐらいなんで、**同じフレームワークであるLaravelと同様に「プロジェクト」という一定のまとまった単位でプログラムを作成して＋＠として「スクレイピング」の要素が加えられる**みたいです。

```powershell
cd プロジェクトを保存したいディレクトリのパス

scrapy startproject プロジェクト名
```
結果、こんなのができます。（以下、**portfolio_check_spidersという名前でプロジェクトを作って実験してみた**結果）

![scrapy_startproject_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/3e5f7fc6-4295-450c-d656-6c40f933c4d1.png)

　　　　　　　　　　　　　　　　　▽
② 日本語がエンコード化された形式で表示されない（＝文字化け）ように
　上記のsettings.pyに追記
```python
FEED_EXPORT_ENCODING='utf-8'
```
　　　　　　　　　　　　　　　　　▽
③ 上の作成したプロジェクト内のspidersフォルダの中に各サイトをスクレイピングするスパイダーを以下のコマンドで作る
```powershell
（上記のプロジェクトのフォルダを開いた状態で、もしくはcdコマンドで移動した状態で）
scrapy genspider 　スパイダー名　　スクレイピングをかけたいWebサイトのURLから「https://」を除いたもの
```
例えば、（**※今回は自分のポートフォリオのホームページをモルモットにしました**）
```powershell
scrapy genspider 　HomePageSpider 　該当のURLからhttps://を除いたもの
```
で結局以下みたいなやつがでてきます

![spider_sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/6fe7f472-18dc-0c06-03bb-de918d1ccfe4.png)
　　　　　　　　　　　　　　　　▽
④  上記の青枠のメソッドの部分をいじり、スパイダーを動かして、jsonで保存してみる。

<h4>ポートフォリオのホーム画面の一部

![json_sample_material.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/f6ff0158-f8ed-1a73-832b-312897feada2.png)

これに対し、以下の図のようにいじったスパイダーに対して

![spider_sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/476981ea-9cbb-e84e-967b-4bb911fdfcdf.png)

次のコマンドを実行すると、不格好ではありますが、一応確かにjsonファイルがプロジェクト内にできました。
（※プロジェクトのフォルダを開いた状態で、ターミナルで実行）
```powershell
scrapy crawl HomePageSpider -o qiita_links.json
```
なお、
```powershell
scrapy crawl スパイダー名（-o 作成するjsonファイルにつけるファイル名.json）
```
で、**（）部分はない場合**は出力結果がただターミナルに表示されるだけでした。
**※スパイダーは動く**

　上のコマンドで **プロジェクト内にできた.json** が以下の図（なぜ、余分な改行の消し方とかはまだ謎です（たぶん、yield文のせい））
 
![sample_json_file1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/bcd8c0b9-aaa7-8778-d280-8680ee46fabc.png)

![sample_json_file2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/05a81ef8-74d9-0faf-4906-5447e64ef537.png)

<h2>個人的に謎だった単語リスト

（※１）（Pythonにおける）仮想環境：（用途に応じた）実行環境を提供する機能。必要に応じて切り替えて使用できる。

（※２）ディストリビューション：Python本体に加えて様々なモジュールやツール類をまとめた配布形態

（※３）Anaconda：アナコンダ、Python本体に加えてデータサイエンスに有益な様々なパッケージが追加されたディストリビューション

（※４）パーソナライズ：企業側がそれぞれのユーザーの属性、趣味嗜好、行動データ履歴といったデータにあわせて情報提供すること　（例　各ユーザーに合うような広告が出てくる）

（※５）サードパーティクッキー：訪れたサイト以外のドメインから発行されるクッキー。もうすぐ廃止されるらしいので代替策の検討が必要。参考資料　https://infinity-agent.co.jp/lab/thirdpartycookie_2024/

（※６）interactive：「相互の」「双方向の」を意味する英単語。このモード（対話モード）にすると、1行ずつプログラムを入力していくことになります。なお、打ち間違いをした場合、そこで一旦処理が止まる？ため再度打ち直すと、またそこから「ターミナルを開いている以上は」そこから処理が続きます。

（※７）SPA：（Single Page Applicaitonの略）単一の html ファイル上で javascript を使って画面遷移することなくユーザの操作に応じて動的に変化する Web アプリケーション (Web サイト) 。