Pythonプログラミング 好きな画像を自動で保存する

f:id:tamurasann:20190420213347j:plain

Pythonを使って画像URLにアクセスし、画像を保存するという構文をメモ書き程度に書いてみました。

 

Pythonのライブラリ:BeautifulSoupとlxml

Webページは基本的にHTMLかXMLの形式で構成されている。HTML、XML両方もあるのかな?

BeautifulSoupはWebページのHTMLを解析するもの

lxmlはWebページのXMLを解析するもの

 

HTMLの基本構成

<html>
<head>
<title>・・・</title>
</head>
<body>
<a href = "https://・・・">・・・</a>
</body>
<html>

 

HTMLは人間でも読み取りやすく構成されているが、コンピューター側はわかりにくい構成

XMLは人間では読み取りにくく構成されているが、コンピューター側はわかりやすい構成

BeautifulSoup、lxml使い方

 ①BeautifulSoup、lxmlをインポート

from bs4 import BeautifulSoup
import lxml

②soupにhtml変数に入っているソースコードを全部入れ込む

html ="""
<html>
<head>
<title>・・・</title>
</head>
<body>
<a href = "https://google.com">google</a>
</body>
<html>
"""
soup = BeautifulSoup(html, "lxml")

※htmlは適当に作成しましたが実際のソースコードを入れればOKです。

 

③soup.find("a")でaタグだけ取得し、print関数で出力してみる。

print(soup.find("a"))

f:id:tamurasann:20190420220716p:plain

 

requestsを使ってWebページからデータを抜き取る

BeautifulSoupはWebページに飛んでそのWebページのHTMLを解析データを抜き取ることはできません。

なのでWebページのHTMLを解析したい場合はrequestライブラリ(Webページにアクセスする)を併用することが必要です。

佐々木希の画像検索結果のURLの1個目の画像URLを抽出

from bs4 import BeautifulSoup
import lxml
import requests
headers = {"USER-Agent":"hoge"}
URL = "https://search.yahoo.co.jp/image/search?fr=top_ga1_sa&p=%E4%BD%90%E3%80%85%E6%9C%A8%E5%B8%8C&ei=UTF-8&b=1"
r = requests.get(URL, timeout=1 , headers=headers)

soup = BeautifulSoup(r.text, "lxml")
print(soup.find_all("img")[0]["src"])

 

URL先の1個目のimgタグのsrcを取ってみました。

f:id:tamurasann:20190420232657p:plain

headers = {"USER-Agent":"hoge"}はWEBページのアクセス利用情報

soup = BeautifulSoup(r.text, "lxml")はrに格納されているHTMLをテキストで取得しています。

 

試しにこのURLにアクセスしてみるとちゃんと取れていることがわかります。

f:id:tamurasann:20190420234947p:plain

urllib.requestを使ってダウンロードして保存

urllib.requestライブラリを使うと特定のURL先の画像をダウンロードできます。

urllib.request.urlretrieve(ダウンロードしたいURL, 保存先とファイル名)

 

佐々木希の画像検索結果のURL1枚目の画像をダウンロード

from bs4 import BeautifulSoup
import lxml
import requests
import urllib.request
headers = {"USER-Agent":"hoge"}
URL = "https://search.yahoo.co.jp/image/search?fr=top_ga1_sa&p=%E4%BD%90%E3%80%85%E6%9C%A8%E5%B8%8C&ei=UTF-8&b=1"
r = requests.get(URL, timeout=1 , headers=headers)
soup = BeautifulSoup(r.text, "lxml")
dlurl = soup.find_all("img")[0]["src"]
filepath = "C:/Users/user/Desktop/test.jpeg"

urllib.request.urlretrieve(dlurl, filepath)

 

デスクトップに保存する場合は上記の構文となります。

f:id:tamurasann:20190420235300p:plain

 

佐々木希の画像検索結果のURLにある画像をすべてダウンロード

from bs4 import BeautifulSoup
import lxml
import requests
import urllib.request
headers = {"USER-Agent":"hoge"}
URL = "https://search.yahoo.co.jp/image/search?fr=top_ga1_sa&p=%E4%BD%90%E3%80%85%E6%9C%A8%E5%B8%8C&ei=UTF-8&b=1"
r = requests.get(URL, timeout=1 , headers=headers)
soup = BeautifulSoup(r.text, "lxml")
dlurl = soup.find_all("img")

for i in range(len(dlurl)):
filepath = "C:/Users/user/Desktop/{}.jpeg".format(i)
urllib.request.urlretrieve(dlurl[i]["src"], filepath)

 

for文を使うことによってアクセス先のURLにある画像をすべてダウンロードできます。

終わりに

実はimgタグのsrcを使うとそのURLに佐々木希以外の画像があればその画像も取得されてしまいます。なのでalt属性を対象にして検索すると良いかもしれないですね。

 

また、今回使用したライブラリが使用できない場合はinstallがされていない可能性もあるので事前にinstallしてから使用してください。

今回のブログはメモ書き程度のものとなりますが、もし参考になれば幸いです。