Pythonで簡単に画像スクレイピング チュートリアル

2019/12/22
 
この記事を書いている人 - WRITER -
某大手IT企業の社会人1年目SE 元都内の大学生 大手企業にいて感じたこと色々書いていきます

こんにちは。
扉です。

この記事では基本的な文法を知っていれば、簡単に初心者でもpythonで画像スクレイピングできるってことを知ってもらえたらと思います。
最初はこの記事のコードを書き写して学んで、その次は自分でサイトを見つけてスクレイピングしてみてください。そうすればスクレイピング技術が身についていきます。

環境

windows
python3.6.4(Anaconda)

あるメーカーHPの商品画像をダウンロードする

今回はこの腕時計メーカーの商品である腕時計の画像を自動取得したいと思います。
このHPの腕時計の画像に名前をつけて保存していきます。

まず全体のコードを。

準備

先頭にあるこちらから説明。

folder は画像が保存されるディレクトリ名。
os.makedirsでカレントディレクトリにtestというディレクトリが作成されます。
既にその名前のディレクトリがあればそのまま実行されます。
その下に2つリストが並んでいます。これは後に使うので、初めに作成しておきました。

get_hp( ) 関数

get_hp() 関数は抜き取りたいページのURLを引数に入れることで、getリクエストができる(今回ここではまだ引数はいれません)。
そしてレスポンスに対して.textとすることでテキスト形式で取得しています。

pickup_tag( ) 関数

pickup_tag() 関数は htmlパース用のオブジェクト作成し、抜き取りたい要素を指定し抜き出しています。
soupの第一引数には、get_hp() の戻り値である res.text が入ります。

get_tag では画像のURLを抜き出しをしています。
thumbnail というクラスを指定し、その指定したクラス内の imgタグを全て抜き取るというコード。

少し難しいと思いますが、ここは抜き取りたいページの HTML を自分で読むしかないです。抜き出したいページに行き、右クリックして「検証」(Ctrl + Shift + I) を押すと、DevTools が開かれるので自分の抜き出したいところを確認しましょう。
スクレイピングは HTML, CSS の知識が少し必要となってくるので Progate などで学んでおくのがオススメ。ぼくも Progate で学びました。

抜き取るメソッドはいくつかあり find, find_all, select など何を使えばいいかわからないと思いますが、ググれば沢山出てくるのでprint文で確かめてトライアンドエラーを繰り返すのがいいと思います(まだぼくもググりながらやってます)。

【実践】 画像のタグ抜き取り方

画像の上で右クリックで検証を押すと、Devtools が出てきます。取得したい画像の詳細を見るとaタグの中にimgタグがあり class=” thumbnail ” を持っています。このことから img.thumbnail で指定すれよさそうだということが分かります。

試しにprint( pickup_tag(“http://knot-designs.com/fs/knot/c/smallsecond”) )と書いて、出力してみると

このように get_tag はリストとなり、class=”thumbnail”のimgタグが抜き取れていることが分かります。このようにprintでちゃんと抜き取れているかその都度確認するようにしてください。
そして len( ) メソッドでリストの要素数を確認すると element = 13 となっています。
HP を見ると左上に商品数が 13 件と表示されており、過不足なくimgタグを抜き取れたことが確認できます。
やったね!!!

get_photo_url( ) 関数

続いて get_photo_url() 関数では、src=” ここ!!! ” だけを抜き出します。
pickup_tag()の戻り値はプロンプト上に先ほど出力されたリストです。それをforループで1つずつ要素を取り出し、temp.get(” src “)で src=” ここ!!! ” だけを入手しています。
そしてそれらを url_list = [ ] に append しています。
これをまた print で確認すると、
しっかり抜き出せています。

get_title( ) 関数

get_title() 関数では商品の名前を抜き出します。
まず商品名のあるタグの取得。

また右クリックで検証(Ctrl + Shift + I) をすると、h2 のaタグのテキストに商品の名前があります。
だから select(‘ h2 a ‘) とします。
get_title_tag を print してみると以下のようになります。

このようにget_title_tag はリストになります。
欲しいのはaタグで囲まれている ” CS… ” のテキスト部分のみなので、for文で1つずつ要素を取り出し、.get_text( ) でテキスト部分のみ抜き取れます(= element_title) 。
element_title を title_list = [ ] に append していきます。
ここでもちゃんと title_list が作成されているか print で確認。

うん、上手くできています。

【仕上げ】 画像をダウンロード

これは画像を保存するものです。
画像は url_list に格納されている要素数の数だけ保存したいので、for文でリストの要素数をレンジに入れてまわします。
url_list は先ほど get_photo_url( ) 関数で表示してわかっているように、” http://… ” が抜けているので付け足しましょう。

この確認方法は、HP の商品画像の上で DevTools を開き、青く光っているところの src=” /shop/item/… ” の上にカーソル持っていき、右クリック。「 Copy link address 」とあるのでそれを押す。新しくタブを開いてペースト。
すると画像がでてきます。
URL バーで確認すると ” knot-designs.com ” が付け足されているのが確認できます。

os.pathbasename( ) メソッドは保存名を指定できます。
ここで先ほど取得した tittle_list[n] をいれます。title_list はリストなのでインデックス指定を忘れないように。

Requestsオブジェクトを用いてダウンロードしたファイルを保存するときには、iter_content( ) メソッドの値を用いてループします。
forループを用いて画像データのチャンク(最大 100,000 バイト)ごとファイルに書き込んでから、ファイルを閉じます。
これで画像データが test というフォルダに保存されます。
出力はこんな感じです。

test というフォルダに腕時計画像13枚うまく保存できてたら成功です。
お疲れさまでした。

まとめ

いかがでしょうか。意外と簡単にできるもんです。
ちなみにぼくはこのような腕時計メーカーのHPから商品画像を指定の製品番号の名前をつけて保存するという案件を CrowdWorks で受注しました。

≪HPから300枚程度の画像を「名前を付けて保存」する作業≫
仕事の詳細を見ると、

【概要】
メーカーHPの画像を名前を付けて保存する作業
【依頼内容】
・仕事量:300枚程度
・納期:発注後3~4日程度

慣れれば一枚当たり1分~2分程度でできる作業かと思います。

【必須】
・ブラウザでグーグルクロームが利用できる。
・丁寧に作業して頂ける(保存漏れがないなど)。

その他質問等ありましたら、気軽にお問い合わせください。

という感じでした。
少し細かな流れを確認して、これならスクレイピングでいけそうだなと思って応募しました!(本来は手作業でも構わない案件)
そしたらなんと30人以上申し込みの中から選ばれました!!
業務に活かせる経験として、
“プログラミングができるので、この内容の案件でしたら自動プログラムを作ることができそうです。人の手でやるより漏れなく保存、そしてスピーディーにできそうです。”
という感じで書きました。
これが初めての受注でしたのでとても嬉しかったです。そして契約金額は5,000円!

こんな感じで、ただ参考書を使って勉強するだけではなくて、普段の業務の中から解決したい課題ドリブンでやったほうが楽しいし、技術も身につきます。
ということを少しでも今回の記事で分かっていただけたら!!!

この記事を書いている人 - WRITER -
某大手IT企業の社会人1年目SE 元都内の大学生 大手企業にいて感じたこと色々書いていきます

- Comments -

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Copyright© thinktank SE , 2018 All Rights Reserved.