Pythonを勉強してみる人の日記

仕事に元気を奪われながらなんとか続けてみたいと思う限り

Python11日目 スクレイピング始め!2年生になった。

こんばんは。平日ヌルっとスタートしました。

11日目、頑張っていきます。

 

実はこの間の10日目で「Python1年生」を完了し、めでたく今日からは2年生になりました。

スクレイピングのしくみ」しかないと思ってそれを買ってきたので、まずはスクレイピングをやってみたいと思います。

その次は何にしようかな…

2年生にはクラスがたくさんあるらしい…

 

というわけで、スクレイピングのお勉強スタートです。

 

始めに、WEBスクレイピングはWEBサイトにアクセスして色々な情報を調べてくるためのものなので注意事項がいくつか載っていました。

著作権を侵害しない
・サイトに負荷をかけすぎない
・「スクローリング」禁止のところからスクローリングしない

どこかのサイトをうっかり妨害してしまわないかだいぶ不安です…

 

まずは、練習用のサイトに行って情報を取ってくるプログラムです。

「requests」というライブラリをインストールしてから始めます。

練習用のサイトから文字列データを持ってくると、こんな感じになっていました。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>サイトのタブに表示されるタイトル</title>
    </head>
    <body>
        <h2>ページ上部の見出し</h2>
        <ol>
            <li>箇条書き1個目</li>
            <li>箇条書き2個目</li>
            <li>箇条書き3個目</li>
        </ol>
    </body>
</html>

ふむふむ。<>で始めて、</>で終わらせるということみたいです。

1つ勉強になりました。

これが分かったらワードプレスとやらも作れるようになるのでしょうか。

 

次にファイルを開く・書き込む・閉じるのプログラムです。

「f」という関数?が書かれているのですが、調べてみたところこの本の中で勝手に命名して作っている様子。

既にある関数なのか(ExcelのSUMとか)、プログラムの中で新しく作ろうとしている関数なのか、判別がつかないのが難しポイントです。

初心者あるあるかもしれません。

 

ここで初めてお目にかかる構文が。「with文」というものです。

どうやら、「open」という命令をwith文の中で使うと処理が終わったら勝手に「close」してくれるそうです。

賢すぎてやや怖い気持ちがしてきます。

最新技術ってすごい…。

閉じ忘れによるプログラムのエラーを避けてくれる優れものということなので、不注意が過ぎる私は必ず覚えておかねばなりません。

 

 

さて、WEBサイトからデータを引っ張り出してくるプログラムは書けたので次のステップです。

「Beautiful Soup」というライブラリを使ってHTMLを解析するみたいです。

「美しいスープ」と名付けるネーミングセンス、推せる…

 

そういえば、HTMLの<>で囲まれた部分は「タグ」と呼ぶらしいです。

独学だと呼び方が分からないものがたくさん出てくるのでよく困ります。

soup.find("タグ名")とすると、指定したタグに該当するテキストを戻してくれるそう。

例えばfind("li")としたら、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>サイトのタブに表示されるタイトル</title>
    </head>
    <body>
        <h2>ページ上部の見出し</h2>
        <ol>
            <li>箇条書き1個目</li>
            <li>箇条書き2個目</li>
            <li>箇条書き3個目</li>
        </ol>
    </body>
</html>

 <li>箇条書き1個目</li>が戻されます。

ちなみに、find("li").textとすると、タグが消えて

 箇条書き1個目が戻されます。

へぇ~…

まだ勉強を始めて11日目ということもあるのですが、やはりプログラムの中で新しく命名された関数と元あった関数の区別が分かりにくい…

 

この章はまだ続きがあるのですが、早めに寝て明日に備えるため今日はこのへんで。

10日目とは全く違って簡単に分かりそうで奥が深そうな、そんな感じでした。

ではおやすみなさい…

 

追伸

優しい人が損をする会社に未来はないと思う毎日。

良い人材逃げまくり弊社

Python10日目 手書きの文字を予想するプログラム。

こんばんは。めでたく(?)10日目ということで二ケタ台に突入しました。

前回はコードの解読に悪戦苦闘しておりましたが、

今日からはまたコードを書き書きしながら新しいことをできるようにしていきたいと思います。

スタート~!

 

まずは、以前作った画像をモザイクにするプログラムと似たようなプログラムを書いていきます。

「プログラムは上から処理していくもの」のはずなのに、プログラムの順序的には逆に見えることがずっと疑問でした。

例えばコレ。

関数1つ目を定義する。
def imageToTata(filename):~~~

 

関数2つ目を定義する。その中に関数1つ目が入っている。
def openFile():~~~
 ~~
 data=imageToData(fpath)

上から順に処理していくのに、なぜ関数1つ目でエラーにならないのかな?という疑問がありました。

 

自己流で導き出した結論としては、

1つ目の関数は変数に値が入らないと動かない。ので、エラーにもならない。

という感じです。当たらずとも遠からずというくらいな気がします。

 

さて、画像を読み込んでモザイクにする(ただしガビガビにならないように「LANCZOS」を使って滑らかに)プログラムが書けました。

実行してみるとこんな風になりました。

めっちゃ視力悪い人が見る2

モザイクというよりピンボケで若干不安ですが、本に載っている通りにコードを書いたはずなのでいったん先に進みます。

プログラムを全て書けたので、動かしてみます。

手書きの文字を認識します!という文字が。こんなの書いてたんだ…

 

認識できず!笑

やる気だけはあるアホの子みたいな感じになってしまいました。

 

コードの書き間違いがあったので、修正して再挑戦します。

バカな人工知能、完成

すごく2なのに「この画像は[1]です!」と答えられてしまいました。

どうして…

 

「ここかな?」と思った場所を修正して、もう一度やってみました。

ちっっっっちゃい2…

2は信じられないくらいちっちゃくなるし、予想は[1]だし…

上手くいかないので今日はここまでにします。

 

明日で今週ラストです、おやすみなさい。

 

追伸

週休2日じゃやってられん

Python9日目 手書き数字の予想プログラムを解読する難解な回。

こんばんは!金曜日です、お勉強し放題で嬉しい…

 

Python9日目、始めていきます。

昨日書いたコードの解読からです。

昨日の内容は

太いペンで「2」を書いて画像を保存

画像データを読み込んで、0(白)~16(黒)の数字が8×8に並んだ配列に変換する

変換したデータを使って何の数字を書いたのか当てさせる

というモノでした。

1行目から解読していきます。

 

・ファイルを開く:open(変数名)

・モノクロにする:convert("L")

・サイズを8×8ピクセルにする:resize(8,8)

までは分かりました。

 

次から早速全然分かりません。

急に難解

numpy.asarray(・・・)とは…

調べてみると、「Numpyのarrayとasarrayの違い」という記事が上からいくつかヒットしました。

私は違いの前にこれが何をしてくれるものなのか知りたいのに…世界がハイレベル…

 

1つずつ解読していきます。

・numpy:ライブラリの名前

(asarray の前に、arrayの訳→配列)

・asarray:配列っぽいものを配列にしてくれる

・float:浮動小数点数(え?)

いやいや…

まず日本語が分かりません…

 

浮動小数点数とは。

全く分からないので以下のサイトを見に行ってみました。

【C言語入門】浮動小数点数(double・float)の使い方 | 侍エンジニアブログ (sejuku.net)

まだ分からん。そもそも説明に使われている単語が分かりません。

仕方がないので単語を全部調べていきます。泣

 

浮動小数点変数:

 数字を「符号」「基数(きすう)」「仮数(かすう)」「指数」の4つで表したもの。

・固定小数点変数:
 2進数なら「(数字4つ).(数字4つ)」で数字を表す。

 

難しいですね…挫折する人が多いのもわかる。

これ独学でやり切っちゃう人はとんでもないです。

でもまぁ、何となくできるまでやってみたらできちゃった系の女なので踏ん張ります。

ド根性・努力・未来・A BEAUTIFUL STAR。(別に世代ではないです。ハロプロは好き)

 

・基数:1つの桁に入る数字の種類の個数。
    2進数なら0と1で2、10進数なら0~9で10、ということらしい。

 

そろそろ本気で行き詰ってきて「浮動小数点変数」が全く分からず、こちらのサイトを見に行ってみました。お邪魔します…

株式会社K-fix

 

どうやら、

10進数の-0.02402なら(今日の年月にしてみた)

-0.02402= - 0.2402×10^-1 としたときの

-:符号

2402:仮数

10:基数(10進数だから)

-1:指数

ということみたいです。ふむふむ。

 

そして2進数をこの形式で表すときは「10」がいる場所に「2」が入るようです。

10進数なら10倍になると小数点が1つ右にずれるみたいに、

2進数なら2倍になると小数点が1つ右にずれる。×2^n で表すらしいです。

全部初耳だから「らしい」としか言えない。笑

 

理解できたし「そもそもこれって分からないといけないのかな?」という思いも湧いてきたので、そろそろ本筋に戻ります。

そして一旦、float型のことは「なんだか分からないが『小数も表せる数』らしい」という感じで認識しておきます。

 

もう分からなかったコードがはるか昔のように思えてきたので再掲。

久しぶり!

画像の2行目は「grayImage」という変数を「float型で」「配列に(asarray)」してね。
という意味のようです。

 

そして3行目。floorがまた分からないので調べます。

・floor:小数点以下を切り捨て

ちなみにfloor変数はExcelにも存在していて、

「FLOOR(数値,基準値)」とすると「数値を」「基準値の倍数に最も近い数字になるように」切り捨て。という意味になるようです。

なるほど。floorは理解できました。

 

続き。数式は分かるけれどなぜ256で割るのか?

256は2^8なので、8ビットのなにがしかを扱うためと思われます。

多分「dtype=float」のところで8ビットの数字が作られたんでしょう。多分。知らんけど。

 

本によると、256で割ってちょっといじくる前は255(一番濃い黒)~0(一番明るい白)の濃淡を表すリストになっているそうです。

例えば

numImage[x]=256→一番濃い黒 のとき、

16-16*(numImage/256)=16-16*(256/256)=16-16*1=0 →一番暗い黒

になります。変換してる感じなんですね。

この変換式を自力で考えろと言われたらなかなかに至難の業な気がするのですが…

考えるとかじゃないんでしょうか。

公式的な、底辺×高さ÷2的な。

まぁ、先々勉強を進めていけばいつか分かることでしょう…

 

ちょっとわき道に逸れます。(2回目)

Python関連のサイトを検索してみると、高頻度で[ ]で囲まれた場所に0が入っているのです。

これは何の0なんだろう…ということで、調べます。数分ぶりn回目。

リストの頭から何個目かで、1個目に0が附番されてるってことなのかな~と思ったら正解でした。パチパチ

aaa_list=[9,8,7](9,8,7というリストを作る)

aaa_list[0]=9(aaa_listの最初の値を返す)

また一つ勉強が進みました。

わき道から戻ります。

 

3回目の登場

3行目は255(真っ黒)~0(真っ白)を0(真っ白)~16(真っ黒)に直すという話でした。

4行目はきっとflattenというくらいだからフラットにするんでしょう。つるっと。

急に簡単だからもうテキトーです。

 

ここまでが、手書きの数字を8×8の配列に直すパート。

こんなに登ったのにまだn合目ですか…?あと何時間登るんですか…?という気持ちです。

富士山の何合目が低くて最大で何合目まであるのか分からないので例が適当ですみません。(調べるやる気はない)

 

そしてここから、数字を当ててくれた関数の解読をしていきます。

1行目。

もう本当に分からないので単語1個ずつ調べます。

こうなったらヤケクソです。

 

・sklearn:機械学習ライブラリ

ロゴカワイイ

・datasets:データセット。sklearnにあるらしい。

・digits():データセットのうち手書きの数字のやつ。

svmsupport vector machine。なんかわからないけれど最適化問題を解いてくれるやつ。と受け取った。アルゴリズムの1つだそうです。
↓参考
[Python]サポートベクトルマシン(SVM)の理論と実装を徹底解説してみた #Python - Qiita

 

あとSVCsvmとgammaが分かれば、全部分かりそうです。

今日の急成長ぶりがすさまじいです。文字数もすさまじいです。

 

余りにも眠く限界が来たので本日はここまでで寝ることにします。

こちらの3つは明日かどこかで調べてまた更新します。

 

おやすみなさい…

 

追伸

最近猫ミームにハマっています。

大っ嫌いな前の上司の悪口を書きたいが、身バレするので我慢

 

 

2024/2/12更新。「きっとこういうことだろう」が大いに混ざっているので、読んでくれる人が誤解しないよう願います💧

=========================================================

SVC:クラスの1つ。

クラスが分からなかったので調べました。分からないことだらけです。

↓こちらのブログにお邪魔します。

【完全版】Pythonクラスとは?使い方までをわかりやすく解説 (itc.tokyo)

 

・クラス:どうやら、メソッド(関数ではないらしい)を色々まとめておけるもの。

class ●●●():
 def A~~~
 def B~~~

としておいて、

「●●●.A」と書くとAのほうの処理

「●●●.B」と書くとBのほうの処理をしてくれるらしい。

言葉の意味を知っておかないと解説が分からず困ることが多いですね。

 

メソッドという言葉が出てきて「メソッドと関数は何が違うのだ」というぎもんがわきましたので、また調べます。

・関数:単独で呼び出すもの

・メソッド:単独ではなく、「.A」などをつけて呼び出すもの

分かるような分からないような…

ただ、メソッドの「これ」使ってね、と指示をしないと動いてくれないのは何となく上記の理屈で理解できたのでいったん良しとします。

 

そして、モジュールの関数も「.」をつけて呼び出すようです...

複雑。

sklearn.svm.SVC(gamma=0.001)

なら、

sklearn:モジュール

svm:モジュールの中のアルゴリズム

SVC:その中のクラス??

合っているのでしょうか…

 

・gamma:最適化問題を解いてくれる関数を構成する定数(だと思われる)

 

分からなかったことを全て調べ終わりました!!すごい!

関数、メソッド、クラスという概念を理解できたので大進歩です。

そして「.」の意味もおぼろげに分かり始めています。

明日から4日間、生きながらえるとしましょう...

 

おやすみなさい。

Python8日目 手書きの数字をPythonに読ませる回 「2」

こんばんは。Python8日目です!

会社に対する諦めの気持ちが固まったら、最近俄然やる気がわいてきました。

頑張ります。

 

今日は画像を読み込んで数字を予測するプログラムを作るようです。

コードが30行くらいあってややひよっていますが、書いていきます。

 

苦戦しながらエラーに4回ほど突き返され、1つ絶対にスペルミスではないのにどうしても解消できない箇所にぶち当たりました。

ANTIALIAS 何度見直しても ANTIALIAS

本と同じなのになぁ…と思いながらエラーコードをググってみると、
このモジュールは無くなったそうです。

最新バージョンには存在しないとのこと。

そんなこともあるんですね…そしてそれが載っているネット便利すぎる。

↓親切な人が答えてくれている

python - AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS' - Stack Overflow

代替できるモジュールの名前は何と読むのだろう。らんこず…

こちらのエラーも解消できたので、実行を押してみます。

 

ちなみに予測に使った数字の画像はこちら。ペイントで書きました。

太い2

↓実行

正解!!!

正解なのですが、ちょっとあっさりしすぎでつまらなさもあります。

 

そしてこの後自分が書いたコードを読み解いて学習するタイムが絶対に必要なのですが、
ちょっと今日はもう眠いので寝ます。

 

明日1日生き延びれば3連休~!

というわけで無事明日の金曜日を終えられますように…

おやすみなさい。

 

追伸

コードを読んで何となくやろうとしていることが見えてくるフェーズに来た。

Python7日目② 手書きの数字をプロットしてみる

お風呂から出て、体温が下がり、眠いです。

が、人工知能との遊べるなんて面白そうすぎるので触りだけやってみてから寝ることにします。

 

「sklearn」と書かなくてはならないところ、私は「skelton」と書いていたためエラー。

さすがに代替案も見つからないようです…

 

画僧になってた。相当眠いみたい。

 

エラーを解消して動かすと、こんなものが出力されました。

出力結果

私の嫌いな数列です。

数字が大きいほど暗く、小さいほど明るい、という意味なのだそう。

 

matplotlibなるものを使って、プロットするとこんな感じになりました。

何とも不安になるビジュアル

ちょっと怖くないですか?笑

というか、前々から疑問に思っていたのですが…

画像がでかすぎたり小さすぎたりするの、いじれたりしないのかなぁ。

 

続いて、数字を沢山並べます。

実行!

数字50個を並べる

急にこの数字が画面に現れたらだいぶホラーな感じの画像が出来上がりました。

数字にカーソルを重ねてみると、座標が出現しました。

座標が出現

1つ1つの画像が独立していて、その中で座標を指定して色を付けているみたいです。

手書き文字の上の数字は、なぜ現れたのかちょっとよくわかりませんが一旦クリアということで。

 

ここから、Pythonのライブラリ?にある手書き文字を使って数字を予測するプログラムを作っていくようです。

夜も更けてきたので今日はここまでにします。

 

やる気満々だったのですが、人工知能までたどり着けず。笑

明日も頑張ります。

 

追伸

おやすみなさい

Python7日目① アリさんの画像をグレーにしたり、ぼやかしたり

こんばんは。平日なのにPythonの勉強に手を付けることができました。

頑張ります。

 

始めに、昨日使った「画像を表示するアプリ」を改造していきます。

教科書によると『画像をモノクロにしてみよう!』とのこと。

既にモノクロなカメさん…

モノクロカメさんは残念ながら使えないので、新しくフリ素を持ってきてやってみます。

 

convert("L")でモノクロになるようです。

今更になって理解したのですが、Pythonは「.」で複数の関数を順番に実行できるみたいです。へ~

 

実行してみます。

 

使うイラストはこちら。いらすとやさんから拝借しました。

仕事をサボる働きアリ

実行!

アリさん・・・

遺影みたいになってしまいましたが、成功です。

 

続いて、悲しい感じのアリさんにさらにモザイクをかけます。

小さくしてから引き延ばす

実行!

と思ったらエラーが出ました。またしてもミスタイプで「.」が「,」になっていました。残念…

直して再度実行!

アリさーん!笑

面白い感じの画像に仕上がりました。

視力が悪い人がアリさんの遺影を見てるみたいな、そんな感じ。

 

画像を扱う章はこれで終わりのようです。

 

 

そして本の次のページをめくったら、なんとなんと

人工知能の文字が・・・!

すごそう。

 

せっかくすごそう(語彙力)なので分けて投稿してみます。

1時間後くらいに7日目②が上がるかと思われます。

ではでは。

(やっぱりお風呂入ってからにします…)

 

追伸

ブログのデザインをマイナーチェンジしました。

かわいい!

Python6日目 画像を開かせるアプリ(?)完成

こんばんは。Python6日目です。

会社で仲良しの友人がデザインの勉強をし始めたという話を聞いて、
私がPythonを使えるようになったら一緒に何かやろうね!という青春っぽい口約束をしました。

ちょっとワクワクしました。

 

昨日書いた「やってみたいこと」に最低限必要な技術が画像解析とスクレイピングのようなので、引き続きPythonを勉強していきます。

画像解析は独学でできるようになるのでしょうか…?笑

勉強だけは得意なので、出来ると信じて言ったんやってみます。

スタート~!

 

今日は画像表示アプリを作るみたいです。

一旦本に言われるままにコードを書いてみます.

 

できたー!と思って走らせると、エラー祭りです。

真っ赤っけ

4行目のここがおかしいよーと教えてくれるので親切です。

「pillow」というモジュールをインストールできていないと思って何度試しても解消せず。

よく見たら「PIL.ImageTK」ではなく「PIL.ImageTk」だったという…

融通が利かないPCは、凡ミスが多い私にとって良きパートナーになってくれそうです。

 

これを解消出来たら次に現れたのがコレ↓

「もしかして:  」ってやつ

「アンタtlて書いとるけど見つからんかったわ、ホンマはtkちゃうかー」て言ってくれてます。

融通利かないとか言ってごめん!!

見つからなかった報告だけでなく代替案の提案をしてくれるなんて、なんてできる子なのでしょう…

またしても凡ミスをやらかしていましたが、これを解消するとこんなのが現れました。

デバッグできた、嬉しい~!

まだ何者かわからない、謎の枠

ボタンを押すと、画像を選ぶ画面が表示されます。

画像を選ぶ

開くを押したのに、沈黙する画面…

うんともすんとも。どうして!

と思ったらまたコードの誤字でした。無能で悲しい~!

でも誰にも迷惑かからないから最高~!(早く仕事辞めた~い!)

誤字が激しすぎる。教えてくれるPC優しすぎる。

その他数多の誤字を直していき、誤字脱字の修正にPCを付き合わせる申し訳なさも感じつつとうとう成功しました。

カメ「やあ」

え、めちゃくちゃうれしい。笑

まだ何にも使えないのにただ普通に嬉しいです。

 

だいぶ前に勉強した関数の変数あり版となし版の違いを改めて理解することもできました。

・変数なし版→def 関数名()

・変数あり版→def 関数名(変数名) そして関数の定義の中でも同じ変数名を使う。

 

数学で言うなら、

f(x)=関数の定義 としたときに、
その関数にx=a を代入した場合(f(a))のを計算させましょう

みたいな感じです。多分。

この「繋がった」感が勉強の醍醐味ですね。

 

勉強は好きなのですが、仕事をしているとその余裕もだんだんなくなってきます。

早く逃げ出さなくては。(結局これが言いたいだけ)

 

今日は関数の理解も深まって、すごく進んだような気がします。

頑張りました!

明日からの労働も、いつか逃げ出すための資金調達のためと思えば耐えられないこともないような、そんなこともないような。

 

これからは平日も、元気な時はなるべく進めれるように頑張ります。

 

追伸

大うつ月曜日

ううう

 

おまけ

アプリを開いたまま×ボタンを押すとこれが出てくる。

killとか言うの、怖いからやめてほしい