医mportブログ

雑記っき

スクレイピングで手っ取り早く欲しい画像を集める

こんにちは、寝正月で元旦を消費してしまいました。
2日の今日はブログを書こうと心に決めました、、、



今回は、スクレイピング技術試してみようかなという記事です。
スクレイピングとは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のことです(Wikipediaより)



プログラミングを使った自動化技術のうちの一つですね、作業効率化にたいへん寄与してくれるはずです。



pythonを使ったコードですが、その前にいくつかライブラリをpipコマンドでインストールしておきましょう。



必要なものとしては、

bs4:BeautifulSoupと呼ばれるHTML や XML から狙ったデータを抽出するためのライブラリです。

requests : HTMLの取得に使います。

urlib : URL を扱う幾つかのモジュールを集めたパッケージです

argparse : 自動的にヘルプと使用方法メッセージを生成し、ユーザーが不正な引数をプログラムに指定したときにエラーを発生させます。

このくらいが新規にpipインストールすべきであろうライブラリで、他はデフォルトであるのではないかと思います。


さっそく必要なライブラリのimportです。

import bs4
import requests
import re
import urllib.request, urllib.error
import os
import argparse
import sys
import json


次に、BeautifulSoupを用いてURLを引っ張り出してきます。
そしてterminal上で -s:検索ワード(英字表記のみ) -n:数字で何枚取るか -o:自分のローカルのどこに保存するかのパス
を記載します(後述)

def get_soup(url,header):
    return bs4.BeautifulSoup(urllib.request.urlopen(urllib.request.Request(url,headers=header)),'html.parser')

def main(args):
    parser = argparse.ArgumentParser(description='Options for scraping Google images')
    parser.add_argument('-s', '--search', default='kensakuword', type=str, help='search term')
    parser.add_argument('-n', '--num_images', default=10, type=int, help='num of images to scrape')
    parser.add_argument('-o', '--directory', default=' 保存したい場所のパス', type=str, help='output directory')
    args = parser.parse_args()

    query = args.search.split()
    query = '+'.join(query)
    max_images = args.num_images

続いて、画像をフォルダでグルーピングします。

save_directory = args.directory + '/' + query
    if not os.path.exists(save_directory):
        os.makedirs(save_directory) 


そして最後にお決まりごとと画像を取得している様子がわかるようなコードを追加していきます。基本的にjpg形式で取得してます。

url="https://www.google.co.jp/search?q="+query+"&source=lnms&tbm=isch"
    header={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"}
    soup = get_soup(url,header)
    ActualImages=[]

    for a in soup.find_all("div",{"class":"rg_meta"}):
        link , Type =json.loads(a.text)["ou"]  ,json.loads(a.text)["ity"]
        ActualImages.append((link,Type))
    for i , (img , Type) in enumerate( ActualImages[0:max_images]):
        try:
            Type = Type if len(Type) > 0 else 'jpg'
            print("Downloading image {} ({}), type is {}".format(i, img, Type))
            raw_img = urllib.request.urlopen(img).read()
            f = open(os.path.join(save_directory , "img_"+str(i)+"."+Type), 'wb')
            f.write(raw_img)
            f.close()
        except Exception as e:
            print ("could not load : "+img)
            print (e)

if __name__ == '__main__':
    from sys import argv
    try:
        main(argv)
    except KeyboardInterrupt:
        pass
    sys.exit()

上記のコードにて、私はこのように検索しました、ちょうど壁紙欲しかったので、、、

f:id:doinakadoctor:20200102164727p:plain

取得画面はこんな具合

f:id:doinakadoctor:20200102164801p:plain

そして、自分の保存したいローカルにはこのように自動的に画像が保存されていきました。

f:id:doinakadoctor:20200102164843p:plain

以上、スクレイピングを一通り経験してみたと言った感じです。
単純に楽なのと、ちょっと深層学習いろいろテストしたいなという野望があるので学習データ画像取ってくるにはもってこいの技術ですよね。
論文検索でキーワードからURLのみ引っ張ってくる、などにも応用できそうです。