lisz-works

技術系だけど関係ないこと多い系ブログ

pythonでWeb上のファイルをダウンロードしてみた

【スポンサーリンク】

Python ロゴ

pythonでWeb上にあるファイルを、ダウンロードをしてみました。

ウェブスクレイピングってやつですかね。

ソース

今回は対象のサイトの、最初に出てくる画像ファイルをダウンロードする処理になります。

# -*- coding: utf-8 -*-
import requests
import bs4

# 対象のURL
url = "http://xxx.com"

# URLの情報を取得
r = requests.get(url)
soup = bs4.BeautifulSoup(r.content)

# imgタグを取得
tag = soup.img
# imgタグからsrc要素を取得
imgSrc = tag['src']
# ファイル名を取得
fileName = imgSrc.split("/")[-1]

# 画像URL
req = requests.get(imgSrc)
# リクエスト成功?
if r.status_code == 200:
    # ファイルの保存
    f = open(fileName, 'wb')
    f.write(req.content)
    f.close()

わりと短いコードでできることに驚きです。

requestsとBeautifulSoupの力ですね……

それでは解説していきます。

インポート

インポートはこの2つを行います。

  1. requests
  2. bs4

requestsは、対象のURLからソースを取得したりする、ネットのやり取り部分を扱うヤツですね。

bs4は、この中のBeautifulSoupという機能を使っています。
BeautifulSoupは、ソースのバイナリからテキスト化ができるみたいです。

2つとももっと色々と機能があるのかもしれませんが、まだ使い始めたばかりなので知識不足です……

対象URLからソースを取得

対象URLからソースを取得する箇所です。

url = "http://xxx.com"
# URLの情報を取得
r = requests.get(url)
soup = bs4.BeautifulSoup(r.content)

requests.get(対象URL)で、そのURLの情報が取得できます。

取得した情報のcontent(r.content)に、ソースが入っています。
このソースの内容は、Byte型となります。

中身を表示するとこんな感じ。

b'<!DOCTYPE html>\n<html lang="en">\n<head>~'

このr.contentを、BeautifulSoupで、変数soupに入れていますね。

コレを行うことで、ソースをテキスト化できます。
表示するとこんなイメージ。

<!DOCTYPE html>
<html lang="en">
<head>

ソースからimgタグの情報を取得

BeautifulSoupで、変数soupにテキスト版ソースを突っ込みましたね。
BeautifulSoupは、ここから更に力を発揮します。

imgタグが欲しい場合、「soup.img」とするだけで、最初に出てくるimgタグが取得できます。

# imgタグを取得
tag = soup.img
print(tag)
---
<img alt="" src="http://xxx.com/image.png"/>

さらにimgタグのsrc要素を取りたい!というときは、これだけで実現します。

# imgタグからsrc要素を取得
imgSrc = tag['src']
print(imgSrc)
---
http://xxx.com/image.png

ここからpythonのsplit()を使えば、ファイル名も抽出可能!

# ファイル名を取得
fileName = imgSrc.split("/")[-1]
print(fileName)
---
image.png

ファイルの保存

画像の情報を取得できたら、今度は保存です。

まず、画像のURL*1からデータを取得します。

req = requests.get(imgSrc)

requests.get()で取得したオブジェクトは、status_codeに結果のコードが入っています。

これが「200」だと成功らしいです。

# リクエスト成功?
if req.status_code == 200:

もし成功だったら、ファイルを保存します。

やっていることは大したことではなくて、上から順に

  1. バイナリ書込モードでファイルオープン
  2. 取得した画像データのByte列を書込
  3. ファイルクローズ
# ファイルの保存
f = open(fileName, 'wb')
f.write(req.content)
f.close()

内容が取得してきたバイナリ情報というだけで、普通のファイル書込と同じですね。

これで、指定したファイル名(今回の場合、image.png)で、画像ファイルが保存されているはずです!

あとがき

いかがでしたでしょうか?

ウェブスクレイピング素人なのですが、なんかいい感じのことができました!

コレを応用して、なんかしていきたいと思います。

というか、やりたいことあったからやってたんですけど(笑)

思ったより簡単だったので、皆さんも試してみてはいかがでしょうか?!