【Python】スクレイピングは罠がいっぱいだった件【これを見れば一発解決します】
Pythonを始めるきっかけのベスト3に、データ分析についで多いものがある。それは、スクレイピングである。
ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。 ウェブ・クローラーあるいはウェブ・スパイダーとも呼ばれる。 1
私も流行に乗ってスクレイピングというものをやってみようと思ったのだ。これでいっぱしのPython使いだぜ。
そんな淡い期待はこの後水疱と期するのであった。
Pythonであっても、プログラミングの始まりはいつも”ggrks”
Qiitaさんの参考事例Ⅰ
「Python スクレイピング」
とりあえずググるとまんまのコードが出そうな気がした。だって、大人気Python&やりたいことランキングベスト3の手法だから、先人がコードを公開してるはず。私は、高を括り、意気揚々とググりだした。そうして1位に出てきました。「Python の HTTP クライアントは urllib.request で十分」 4
私の目に狂いはなかった。「楽勝」私の脳裏をよぎった。そのサイトには、下記のようにコードが書かれていた。
1 2 3 4 5 6 7 |
import urllib.request url = 'https://example.com/api/v1/resource' req = urllib.request.Request(url) with urllib.request.urlopen(req) as res: body = res.read() |
愛用のVisualStudioCode(VSCode)に速攻で打ち込んでみた。
何やら大量にエラーが出た!嘘つきー!!私はプチ発狂した。
数分後、ソースを眺めていると、分かったことがあった。
「https://example.com/api/v1/resource」
ってなんやねん。
顔から火が出て、適当な”生きてる”URLを打ち込んだ。
すると、
PS Ⅾ:\pg_sample\python_sample> & D:/ProgramData/Anaconda3/python.exe d:/pg_sample/python_sample/testtesttest.py
PS D:\pg_sample\python_sample>
なんでやねん。HTMLの中身は、どうした??
今日の私は少しヒステリックだった。
なぜだろう、ちっとも冷静になれない。エンジニアとしての資質は0に違いない。
しかし、今そんなことどうでもいいのだ。
成果が欲しいのだよ。。。
私は、はたと気が付いた。これ、どの関数で表示してるんだろう?
もっともな意見である。日ごろの私だと数秒で気づいていたであろうケアレスミスに少しやさぐれつつも”表示する”関数を追加してみた。
そう。printである。”Hello World”でさんざんやったではないか。私は失笑していた。
下記のように直してみた。
1 2 3 4 5 6 7 8 |
import urllib.request url = 'http://www.defilisterni.org/' req = urllib.request.Request(url) with urllib.request.urlopen(req) as res: body = res.read() print(body) |
HTMLがざざーっとターミナルに出た。
TEXTに落とし込んだ時の罠
あー出来た出来た、と喜んでいたが、もう一つ私には、野望があった。それは、このHTMLをTEXTに落とし込むこと。そう。サイトのバックアップを取りたいのだ。ここまで出来てるんだから、楽勝に違いない。私は根拠のない自信に満ち溢れていた。
そんな自信を神は見透かしたように新たな試練を私に与えたのである。
上記にあげたスクレイピングは、私の野望を満たすには、致命的な欠点があった。
それは、ファイル操作がなされていないこと。可能であれば、任意のテキストファイルを生成して、スクレイピングした内容を書き込みたいのだ。残念ながら今のコードでは、それはできそうにない。
そこで下記のように改造してみた。
1 2 3 4 5 6 7 8 |
import requests url = 'http://www.defilisterni.org/' res = requests.get(url) with open('test.txt', 'w') as file: file.write(res.text) |
無事TEXTファイルは出力されていた。中を開いてみて、私は、驚愕することとなる。
な、なんじゃこりゃ。。。
文字化け、、文字化け、、、
そう、Pythonは、基本文字コードがUTF-8でエンコードされるわけで、今回スクレイピングしたサイトは、Shift-JISだからか。。。
そこで、下記のように修正した。
1 2 3 4 5 6 7 8 9 |
import requests, cchardet url = 'http://www.defilisterni.org/' res = requests.get(url) res.encoding = cchardet.detect(res.content)["encoding"] with open('test.txt', 'w', encoding='SHIFT_JIS') as file: file.write(res.text) |
無事、Shift-JISで書き出せたようだ。調べてみるとPythonの書き出しでエンコードで頭を抱えている人は、結構いるみたいで同じような記事を多数目にした。
また、UTF-8などほかの文字コードを指定したいときは、上記コードのencoding=’XXXXXXX’の
XXXXXXXの部分に入れるといい。また、サクラエディタなんかだと、文字コードを聞いてくれるので親切だ。
また、’w’の部分だが、これは、書き込みを表す。書き込む際、もし、そのテキストに何か書いてあっても上書きされる。書き込みの後から追加したいなら、’a’にするべきだ。
Pythonでスクレイピング まとめ
ざざっとだが、Pythonでスクレイピング、超基礎知識を書いてきた。ググレカスとは言うが、実際には、ググってそのまま書いてうまくいくことは、少ない。何かしら壁があるのだ、そこをまたググって調整して自分の望むコードに仕上げていくのがプログラムというものだ。
今回は、表示の壁、文字コードの壁にぶち当たったが、Pythonでよくあるのは、エラーの壁。エラーといってもいろいろあるんだけど、単純なケアレスレベルの物からインストールし忘れのものまで。(※1)また、Pythonのバージョンによって関数の使い方が仕様変更になってしまったものも結構ある。記載された記事が古ければ、つまりPython2とPython3では、いろいろ仕様が違うので注意したい。ちなみに本ブログで使用しているのは、Python3.7である。参考程度に。
読者諸君が本ブログでスクレイピングした時、挫折しないでこれをひとつのTipsとしてさらなる踏み台とされることを祈ってやまない。
※1.importしているもので、Webに書いてあるものが必ずしも自分の環境にインストールされてはいないということ。
Pythonおすすめ書籍
最初の2冊は初心者向けです。Effectiv Pythonはこの2冊を終えてから読むとかなりわかりやすく感動できると思います。
|
|
|
もしそれでもモチベがたもてないなら、おすすめはプログラミングスクールに行くしかない
年間費はそこそこ高いが、エンジニアになれば、1年以内に回収できる。効率的に学びたいならスクールに行くことをお勧めしている。