（　＾ω＾）は突貫Pythonでスクレイピングをするそうです

※茶番が多いので突貫内容が見たい方は本題まで飛んでください。Pythonガチ初心者の話なので１ミリも為になりません。初心者が突貫でPythonやってみた感想を書いてるだけです。
※そしてここに書かれている内容は（　＾ω＾）が初心者以外実際の企業・人物・団体には関連ございません。


<h1>いんとろだくしょん</h1>

（　＾ω＾）「初心者プログラミングしか出来ないまま初心者でいいからウチでやってみない？　って金融会社に誘われるまま転職したら『外注している大規模ECサイトを自社で運用したいから半年以内にすべてを一人でマスターしろ』とか言われたお・・・てっきりフロントエンジニア（）部分の改修担当と面接で聞いてたのに・・・ブーンはjavascriptを少し嗜むくらいと前職の事務ででサボる為に学んだVBAしか知らないお・・・」

（＊＾ω＾）「ま！　いっぱいやってみて色々学んで駄目なら糧にまた転職するお！」


<h1>～転職初日～</h1>

(´・ω・`)「やあ君の上司のウェブ部署のものだよ、うちはプログラマーがいないから君には期待してるよ」

（　＾ω＾）「ウェブ部署なのにショボンさんはプログラマーじゃないのかお？」

(´・ω・`)「僕は営業担当、ウェブでやりたいアイディアをいっぱい出すからHPをジャカジャカ作って運用してもらいたいんだ」

（　＾ω＾）「ほへー・・・（確かに部署名はウェブ部署だから別にコードは書けなくてもいいのかお・・・）」

(´・ω・`)「ブーン君、とりあえず週１だけプログラミングの勉強以外でやってほしいことがあるんだ。その説明を先にするね」（ノートPCチラッ）

（　＾ω＾）「ほいほい・・・<b>ファッ！？</b>」

（　＾ω＾）「（スプレットシートにめっちゃ物件情報が乗ってるお、項目行数が5000越えてるけど半分以上が物件名しか入ってなくて住所や駅情報とか載ってないお・・・まさか・・・）」

(´・ω・`)「この物件名が書かれてるのを埋めてってほしいんだ。最初はプログラミングとか出来ないだろうから雑用仕事だね、僕が5000件　手　打　ち　で物件名を入れたから、君はこの物件名をググって列項目を埋めてってほしいんだ。　手　打　ち　コ　ピ　ペ　で」

（　＾ω＾）「！？！？！？！？！？！？！？」

(´・ω・`)「<b>ちなみに身バレと業種がバレると困るからメタだけど全項目20個埋めるとして、１行１時間かかるよ、色んなサイト調べて埋めないと駄目だから</b>」

（　＾ω＾）「うはｗｗｗｗｗｗｗｗｗｗｗｗｗ２５００時間越えｗｗｗｗｗｗｗｗｗｗｗ終わるわけないおｗｗｗｗｗｗｗｗｗ」

(´・ω・`)「は？」

（　＾ω＾）「すみません、何も出来ない新人は大人しく靴を舐めて業務に勤しみますお」

(´・ω・`)「ありがとう、僕は営業とか色々やることがあるから助かるよ。・・・本当はスクレイピング？　だっけ、ああいうのが使えると便利だなあとは僕も思うんだけどねぇ」

（　＾ω＾）「（・・・スクレイピング？　聞いたことあるお）」

(´・ω・`)「ま、今日は転職初日だから軽くやり方を教えるね。まずは・・・・」


<h1>転職初日を終えて</h1>

（　＾ω＾）「<b>死ぬかと思ったお。ブーンが20代前半ならマサラタウンにさよならバイバイのノリで初日さよならバイバイしてたお・・・</b>」

（　＾ω＾）「物件の住所をぐぐって調べて、最寄り駅情報をグーグルマップで調べて、お店だったら席数だったり、へーべー？　だったり色々大変だお・・・」

（　＾ω＾）「検索サイトで調べれば出てくる情報があるから項目埋まるけど、埋まらない項目があったらあらゆる物件サイトを検索して調べなきゃ駄目だお・・・」

（　＾ω＾）「しかも当たり前だけどコピペでやらないとタイプミスが起きてしまうからコピペ厳守っていわれたお・・・ショボン先輩めっちゃ怖かったお・・・」

（　＾ω＾）「・・・この感覚、前職でいきなりExcel手打ちセル埋めをさせられた記憶が蘇るお」

（　＾ω＾）「そうだお！　コンピューターに任せればいいんだお！　明日は土日だから土日で何か作ってみるお！！」



<h1>（　＾ω＾）はPythonを知ったようです</h1>

（　＾ω＾）「プログラミング　スクレイピング　っと・・・」（ｶﾀｶﾀｶﾀｶﾀ、ｯﾀｰﾝ！）

（　＾ω＾）「Pythonで簡単にできるのかお、Python触ったことないお・・・でもサーバーサイドのお勉強で触らなきゃいけないお告げがあるから、ちょうど良いかもしれないお」

（　＾ω＾）「Python　環境構築　Windows11　っと・・・」（ｶﾀｶﾀｶﾀｶﾀ、ｯﾀｰﾝ！）

（　＾ω＾）「よし出来たお、VSCにもてけとーにPythonの拡張をいれたお」

（　＾ω＾）「でも調べてるとジュピターノートブックってやつが手軽にPython手書きで試行錯誤できそうだし、今回はこれで書いてくお、ダウンロードするお」（ｶﾀｶﾀｶﾀｶﾀ、ｯﾀｰﾝ！）

（　＾ω＾）「・・・」

（　＾ω＾）「<b>何も知らなくてジュピターノートブックでぐぐったらAnacondaをダウンロードしちゃったお・・・みんなは真似するんじゃないお・・・</b>」


<h1>ようやく本題</h1>

（　＾ω＾）「忙しい人向けのPython１時間動画を見たから早速書いてくお」

（　＾ω＾）「まず今回は物件の検索サイトから全件データをぶっこ抜いてくるお。・・・・ジョルジュ長岡賃貸情報（仮）にするお」

（　＾ω＾）「最終的にcsvにしておけばスプレットシートのほうでどうとでもなるお、出力方面は（ぐぐって）問題なさそうだったから問題は引っこ抜くほうだお」

（　＾ω＾）「えーと・・・まずはジョルジュ長岡賃貸情報の利用規約を見るお。ふむふむ、システムネットワークに過度な負荷をかけてはいけません。しかなくてスクレイピングしちゃ駄目っぽいことは書いてないおね」

（　＾ω＾）「URLはhttp://jolju-space.com/oppai/XXXX/　だお」

（　＾ω＾）「末尾XXXXに数字が入って別々の物件が（おそらく登録順に）１ページずつ格納されてるみたいだお」

（　＾ω＾）「消されてる物件はご丁寧に404エラーが出るからif文でpassしやすいおね」

（　＾ω＾）「繰り返して行う方法はイメージついたから本題のスクレイピングを書いてみるお」

（　＾ω＾）「まずは<b>BeautifulSoup</b>だお、あとURLからデータを取りに行くのに<b>requests</b>だお、それからサーバーに負荷をかけないようにループ実行（今回は書かないけど）の為に<b>time</b>、それから<b>lxml</b>もimportっと・・・」

（　＾ω＾）「最終的にcsvに出力するモジュール？　らいぶらり？　はスクレイピング部分が出来ないと意味がないから一旦置いとくお」

```
from bs4 import BeautifulSoup
import requests
import time
import lxml

```

（　＾ω＾）「pipコマンドで予め食材は用意しといたお」

（　＾ω＾）「次は取得するURLだお、最終的にfor文でループするのに出来たやつはわかりやすく変数にぶちこんでいくお」

```
url="http://jolju-space.com/oppai/1/"
res = requests.get(url)
time.sleep(3)

print(res.text)

```

（　＾ω＾）「上手く取れてるか確認のためのプリントコマンドを打って・・・実行！」

（　＾ω＾）「ちゃんと３秒待ってChromeでF12押したときに見れるようなHTMLデータが表示されたお！　成功だお！」

（　＾ω＾）「ぱぱっと欲しい情報を取得するお。<b>BeutifulSoup</b>に<b>requests.get(url)</b>してきたやつをパーサーして変数に格納するお」

（　＾ω＾）ちなみにHTMLの中身を確認したら欲しい項目は全部テーブルに格納されてたお、今回は表でほしいわけじゃないからテキストデータで取得するお。ダグは＜tr＞だったからfind_all("tr")だお」


```
soup = BeautifulSoup(res.text, "lxml")
tabel = soup.find_all("tr")

```

（　＾ω＾）「よし！　取れたお！」

（　＾ω＾）「ちゃんと取れてるかなー・・・確認するお、print(tabel)っと・・・」

（　＾ω＾）「・・・」

（；＾ω＾）「<b>当たり前だけどHTMLダグ付きで取得できたお</b>、このHTMLダグはいらないお。えーと・・・<b>Python　beutifulsoup htmlダグ　消し方</b>・・・・」（ｶﾀｶﾀｶﾀｶﾀ、ｯﾀｰﾝ！）

（　＾ω＾）「get_text()ってのが使えそうおね」

（　＾ω＾）「tabel.get_text()っと・・・」

（；＾ω＾）「<b>ファッ！？！？</b>」

```
AttributeError                            Traceback (most recent call last)
~/904.py in <module>
      1 soup = BeautifulSoup(res.text, "lxml")
      2 tabel = soup.find_all("tr")
----> 3 tabel.get_text()
~\element.py in __getattr__(self, key)
   2251     def __getattr__(self, key):
   2252         """Raise a helpful exception to explain a common code fix."""
-> 2253         raise AttributeError(
   2254             "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
   2255         )

AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?


```

（；＾ω＾）「<b>なんかエラー出たお・・・ブーンは幼卒だから英語できないお・・・</b>」

（　＾ω＾）「でもブーンにはDeeplさんがいるお！　いつも英語ばっかりのライブラリやリファレンスでお世話になってる心強い味方！」

（　＾ω＾）「ふむふむ、<b>オメーこれにget_text属性があると思ってたの？ｗｗｗｗｗハハッｗｗｗｗワロスｗｗｗｗｗｗｗこれはリストだよバーカｗｗｗｗｗfind_all()なんか使ってるからだよﾌﾟｷﾞｬｰｗｗｗｗｗ</b>」

（　＾ω＾）「・・・・・・・・・」

（　＾ω＾）「<b>Deeplさんが煽ってくるお。</b>だがひとまず置いといてエラーの内容はわかったお、リストでもしかしてこれ取得してるのかお」

（　＾ω＾）「確認するお」

```
type(tabel)
bs4.element.ResultSet
```
（　＾ω＾）「ググったらbs4.element.ResultSetはリスト形式のなにかだお。文字列型じゃなかったお・・・Pythonのエラー文はめちゃくちゃ初心者にわかりやすいおね、Pythonすごいお」

（　＾ω＾）「for文で確認するお」

```
tabel_text = [tag.text for tag in soup('tr')]
print(tabel_text)

```
（　＾ω＾）「おー、正規表現で見たことある感じの¥nまみれのリストっぽい表記が出てきたお、所謂改行おね、元のサイトのテーブルが空白と改行祭りだから仕方ないお。これはあとでトリムなりなんなり消すお」

（　＾ω＾）「欲しい情報まとまってるけど見づらいからもっかいfor　inでアイテムだけ取り出してみるお」

```
for item in tabel_text:
    print(item)
```

（*＾ω＾）「やったお！！！　欲しい情報のテーブルがテキストでしっかり取得できたお！！！」

（　＾ω＾）「<b>どうでもいいけどPythonやって１日も経ってないけどこのブロックごとをわけるのにインデントで整えるのクッソ慣れないお</b>、けどfor文もfor in文も書き方はjavascriptより好きだお、わかりやすいお」

（　＾ω＾）「なんだかんだ三時間くらい悩んだけど無事に取得出来て良かったお、bs4.element.ResultSetのところで１時間くらいつまづいたお」

（　＾ω＾）「csvにするのは休憩してからでいいお・・・これが上手く行けば仕事がサボれるお！」

（　＾ω＾）「Python、触ったことない人間でも数時間で此処までできるのはすごいお。<b>みんなも上司から2500時間を強いられたらPythonを触るのをおすすめするお</b>」



<h1>初心者の遊び</h1>
（　＾ω＾）「なんだかんだ勉強と思って勉強するとつまらないけど、自分が作りたいと思ったものに挑戦するのは達成感あるお！<b>ほぼググって出来たようなもんだけど</b>初心者あるある”なんか知らないけどコード動いてるわ！”も無かったしPythonはわかりやすいお」
<br><br>
（　＾ω＾）「といっても本当に基礎の基礎を使って出来ることばかりだから実際すごいのはモジュールとライブラリおね、Pythonさまさまお」
<br><br>
（　＾ω＾）「次はcsvファイルに出力とループについて考えるお～」