注意
- スクレイピングはまだ法律が決まっていないグレーな部分なのでするときは細心の注意を払いましょう。
- 今回は多分セーフ。
- やるときは法律を確認して、自己責任でお願いします。
はじめに
僕はすぐ記憶が無くなるので記事を書くことにしました。
あくまでも備忘録として書くので、「わかりにくい」 とかは受け付けません。
今回はROLANDさんの画像で機械学習をしたかったのでスクレイピングをします。
なぜスクレイピングなのか
「画像を集めるならbingのAPIでええやん」という人もいると思いますが。
「金がかかる」
この一言に尽きます。bingのAPIは最初は金がかからないのですが、30日経つと金がかかるようになるので、今後も使いまわすことを考えるとスクレイピングになりました。
今回、ぶち当たった課題
課題:検索画面から一つ一つ画像を取り出そうとすると、画像の表示数が限定されているので無限には取れない。
解決:画像の詳細ページから次の詳細ページに移ることで無限に取れる。
課題:次のページに移動する方法がurlじゃなくてbutton。
解決:Beautiful SoupじゃなくてSeleniumを使う。
コード
※注意
- chrome driverをインストールしてコードにPathを書いてください。
- これをJupyter Nootbookにコピペして、ファイルと同じ場所にdataって名前のフォルダを作成してください。
- urlっていう変数を変えてもらうと他の画像を集めることができます。(コードに書いてあるURLを踏んでもらうとURLの貼り方がわかると思います)
main.ipynb
from time import sleep
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
import io
#requests.exceptions.ConnectionErrorの対処法
headers = requests.utils.default_headers()
headers.update(
{
'User-Agent': 'My User Agent 1.0',
}
)
#1ページ目のurl
url='https://www.bing.com/images/search?view=detailV2&ccid=%2BSD9RruV&id=644FB24E587C81A723C6A25CEB9EDF9C018A9573&thid=OIP.-SD9RruVNsPqlK-oMbAZmQEsEA&mediaurl=https%3A%2F%2Fi.daily.jp%2Fgossip%2F2021%2F04%2F15%2FImages%2Ff_14244219.jpg&exph=821&expw=960&q=ROLAND+%e8%8a%b8%e8%83%bd%e4%ba%ba&simid=608016628962306871&form=IRPRST&ck=79BE118AA9DCCFCC0FB1D8617A2F1D51&selectedindex=29&ajaxhist=0&ajaxserp=0&vt=0&sim=11'
options = Options()
#コメントアウトを解くとブラウザが表示されなくなる
#options.add_argument('--headless')
#ブラウザの(Chrome)立ち上げ
browser = webdriver.Chrome("C:\Test_Folder\chromedriver.exe", options = options)
#待機時間
sleep(2)
#urlの移動
browser.get(url)
#待機時間
sleep(2)
#画像を500枚集める
for i in range(500):
#imgのurlを取得
img_tab = browser.find_elements_by_xpath('//div[@class="imgContainer"]/img')[1]
img_url = img_tab.get_attribute('src')
#imgのurlを開ける
try:
img = Image.open(io.BytesIO(requests.get(img_url,headers=headers).content))
#エラーなら次の画像に行く
except:
next_button = browser.find_element_by_id('navr')
next_button.click()
continue
#imgがjpgかjpegならそのままjpgで保存
if img_url[-3:] == 'jpg' or img_url[-4:] == 'jpeg':
#jpgで保存してみる
try:
img.save('data/'+str(i)+'.jpg')
#エラーなら保存しない
except:
print('exception')
#imgがpngなら変換して保存
elif img_url[-3:] == 'png':
# jpg画像に変換
try:
img = img.convert("RGB")
img.save('data/'+str(i)+'.jpg')
#エラーなら保存しない
except:
print('exception')
#jpg系かpngでもないなら
else:
#jpgで保存してみる
try:
img.save('data/'+str(i)+'.jpg')
#エラーなら保存しない
except:
print('exception')
#次のボタンを探して押す
next_button = browser.find_element_by_id('navr')
next_button.click()
#ブラウザを閉じる
browser.quit()
結果
あとがき
どうですか?これがPythonのちからです。皆さんもPythonやりたくなったでしょ?
久しぶりにスクレイピングするとやり方を完全に忘れていました。定期的に使ってないとだめですね!